firefox 127.0-2 (znver1;aarch64) 2024-17740
-9999

Status rejected
Submitter cris [@T] beebames.com
Platform rolling
Repository main
URL https://abf.openmandriva.org/build_lists/426560
Packages
firefox-127.0-2.znver1.binary
firefox-127.0-2.znver1.source
firefox-af-127.0-2.znver1.binary
firefox-ar-127.0-2.znver1.binary
firefox-ast-127.0-2.znver1.binary
firefox-bg-127.0-2.znver1.binary
firefox-bn-127.0-2.znver1.binary
firefox-br-127.0-2.znver1.binary
firefox-bs-127.0-2.znver1.binary
firefox-ca-127.0-2.znver1.binary
firefox-cs-127.0-2.znver1.binary
firefox-cy-127.0-2.znver1.binary
firefox-da-127.0-2.znver1.binary
firefox-de-127.0-2.znver1.binary
firefox-debuginfo-127.0-2.znver1.debuginfo
firefox-debugsource-127.0-2.znver1.binary
firefox-devel-127.0-2.znver1.binary
firefox-el-127.0-2.znver1.binary
firefox-en_GB-127.0-2.znver1.binary
firefox-eo-127.0-2.znver1.binary
firefox-es_AR-127.0-2.znver1.binary
firefox-es_CL-127.0-2.znver1.binary
firefox-es_ES-127.0-2.znver1.binary
firefox-es_MX-127.0-2.znver1.binary
firefox-et-127.0-2.znver1.binary
firefox-eu-127.0-2.znver1.binary
firefox-fa-127.0-2.znver1.binary
firefox-fi-127.0-2.znver1.binary
firefox-fr-127.0-2.znver1.binary
firefox-fy-127.0-2.znver1.binary
firefox-ga_IE-127.0-2.znver1.binary
firefox-gd-127.0-2.znver1.binary
firefox-gl-127.0-2.znver1.binary
firefox-gu_IN-127.0-2.znver1.binary
firefox-he-127.0-2.znver1.binary
firefox-hi-127.0-2.znver1.binary
firefox-hr-127.0-2.znver1.binary
firefox-hu-127.0-2.znver1.binary
firefox-hy-127.0-2.znver1.binary
firefox-id-127.0-2.znver1.binary
firefox-is-127.0-2.znver1.binary
firefox-it-127.0-2.znver1.binary
firefox-ja-127.0-2.znver1.binary
firefox-kk-127.0-2.znver1.binary
firefox-km-127.0-2.znver1.binary
firefox-kn-127.0-2.znver1.binary
firefox-ko-127.0-2.znver1.binary
firefox-lt-127.0-2.znver1.binary
firefox-lv-127.0-2.znver1.binary
firefox-mk-127.0-2.znver1.binary
firefox-mr-127.0-2.znver1.binary
firefox-nb_NO-127.0-2.znver1.binary
firefox-nl-127.0-2.znver1.binary
firefox-nn_NO-127.0-2.znver1.binary
firefox-pa_IN-127.0-2.znver1.binary
firefox-pl-127.0-2.znver1.binary
firefox-pt_BR-127.0-2.znver1.binary
firefox-pt_PT-127.0-2.znver1.binary
firefox-ro-127.0-2.znver1.binary
firefox-ru-127.0-2.znver1.binary
firefox-si-127.0-2.znver1.binary
firefox-sk-127.0-2.znver1.binary
firefox-sl-127.0-2.znver1.binary
firefox-sq-127.0-2.znver1.binary
firefox-sr-127.0-2.znver1.binary
firefox-sv_SE-127.0-2.znver1.binary
firefox-ta-127.0-2.znver1.binary
firefox-te-127.0-2.znver1.binary
firefox-th-127.0-2.znver1.binary
firefox-tr-127.0-2.znver1.binary
firefox-uk-127.0-2.znver1.binary
firefox-vi-127.0-2.znver1.binary
firefox-zh_CN-127.0-2.znver1.binary
firefox-zh_TW-127.0-2.znver1.binary
firefox-127.0-2.aarch64.binary
firefox-127.0-2.aarch64.source
firefox-af-127.0-2.aarch64.binary
firefox-ar-127.0-2.aarch64.binary
firefox-ast-127.0-2.aarch64.binary
firefox-bg-127.0-2.aarch64.binary
firefox-bn-127.0-2.aarch64.binary
firefox-br-127.0-2.aarch64.binary
firefox-bs-127.0-2.aarch64.binary
firefox-ca-127.0-2.aarch64.binary
firefox-cs-127.0-2.aarch64.binary
firefox-cy-127.0-2.aarch64.binary
firefox-da-127.0-2.aarch64.binary
firefox-de-127.0-2.aarch64.binary
firefox-debuginfo-127.0-2.aarch64.debuginfo
firefox-debugsource-127.0-2.aarch64.binary
firefox-devel-127.0-2.aarch64.binary
firefox-el-127.0-2.aarch64.binary
firefox-en_GB-127.0-2.aarch64.binary
firefox-eo-127.0-2.aarch64.binary
firefox-es_AR-127.0-2.aarch64.binary
firefox-es_CL-127.0-2.aarch64.binary
firefox-es_ES-127.0-2.aarch64.binary
firefox-es_MX-127.0-2.aarch64.binary
firefox-et-127.0-2.aarch64.binary
firefox-eu-127.0-2.aarch64.binary
firefox-fa-127.0-2.aarch64.binary
firefox-fi-127.0-2.aarch64.binary
firefox-fr-127.0-2.aarch64.binary
firefox-fy-127.0-2.aarch64.binary
firefox-ga_IE-127.0-2.aarch64.binary
firefox-gd-127.0-2.aarch64.binary
firefox-gl-127.0-2.aarch64.binary
firefox-gu_IN-127.0-2.aarch64.binary
firefox-he-127.0-2.aarch64.binary
firefox-hi-127.0-2.aarch64.binary
firefox-hr-127.0-2.aarch64.binary
firefox-hu-127.0-2.aarch64.binary
firefox-hy-127.0-2.aarch64.binary
firefox-id-127.0-2.aarch64.binary
firefox-is-127.0-2.aarch64.binary
firefox-it-127.0-2.aarch64.binary
firefox-ja-127.0-2.aarch64.binary
firefox-kk-127.0-2.aarch64.binary
firefox-km-127.0-2.aarch64.binary
firefox-kn-127.0-2.aarch64.binary
firefox-ko-127.0-2.aarch64.binary
firefox-lt-127.0-2.aarch64.binary
firefox-lv-127.0-2.aarch64.binary
firefox-mk-127.0-2.aarch64.binary
firefox-mr-127.0-2.aarch64.binary
firefox-nb_NO-127.0-2.aarch64.binary
firefox-nl-127.0-2.aarch64.binary
firefox-nn_NO-127.0-2.aarch64.binary
firefox-pa_IN-127.0-2.aarch64.binary
firefox-pl-127.0-2.aarch64.binary
firefox-pt_BR-127.0-2.aarch64.binary
firefox-pt_PT-127.0-2.aarch64.binary
firefox-ro-127.0-2.aarch64.binary
firefox-ru-127.0-2.aarch64.binary
firefox-si-127.0-2.aarch64.binary
firefox-sk-127.0-2.aarch64.binary
firefox-sl-127.0-2.aarch64.binary
firefox-sq-127.0-2.aarch64.binary
firefox-sr-127.0-2.aarch64.binary
firefox-sv_SE-127.0-2.aarch64.binary
firefox-ta-127.0-2.aarch64.binary
firefox-te-127.0-2.aarch64.binary
firefox-th-127.0-2.aarch64.binary
firefox-tr-127.0-2.aarch64.binary
firefox-uk-127.0-2.aarch64.binary
firefox-vi-127.0-2.aarch64.binary
firefox-zh_CN-127.0-2.aarch64.binary
firefox-zh_TW-127.0-2.aarch64.binary
Build Date 2024-06-15 08:03:33 +0000 UTC
Last Updated 2024-06-15 16:19:24.441432139 +0000 UTC
$ git diff --patch-with-stat --summary e62489353105f091a613c40493b06bee82d84c4d..7527eeb4eaf772814b457f6b5bca92c1f1a845fb

 .abf.yml                                  |   140 +-
 05d7a7c92cf2.patch                        |   903 --
 5759fe6ed8a5.patch                        | 20606 ----------------------------
 5970587d9a7a.patch                        | 15072 --------------------
 d55beebe2605.patch                        |    33 -
 fb10bab6cd18.patch                        |   187 -
 firefox-112.0.1-no-static-libstdc++.patch |    27 +-
 firefox.spec                              |    12 +-
 mozilla-1669639.patch                     |    14 -
 9 files changed, 87 insertions(+), 36907 deletions(-)
 delete mode 100644 05d7a7c92cf2.patch
 delete mode 100644 5759fe6ed8a5.patch
 delete mode 100644 5970587d9a7a.patch
 delete mode 100644 d55beebe2605.patch
 delete mode 100644 fb10bab6cd18.patch
 delete mode 100644 mozilla-1669639.patch

diff --git a/.abf.yml b/.abf.yml
index 6363684..cdbdcc6 100644
--- a/.abf.yml
+++ b/.abf.yml
@@ -1,72 +1,72 @@
 sources:
-  af.xpi: 06270e397280cc0ae973da9718ada35eff3853a0
-  ar.xpi: 73f9c71cbd09910fcf76b06ef2415649c91e9975
-  ast.xpi: 80c363a66269491a27e19f4713afe1a538261478
+  af.xpi: 7b8d3678999ad33687d4c268b184b24b76a38283
+  ar.xpi: 000aa05586778c86fc980879da9eb85d7f8c9daf
+  ast.xpi: 19de5b88f2477bb32608b239f6ad0391347c51c8
   be.xpi: 6eff4e3c1edeee5600f3bd4882d2ce5b02864aaf
-  bg.xpi: e20a86096c7f1f5b1dd6d346585e86991d61845d
-  bn.xpi: e1a44f030f98f0fbe578f4e4a3963ced9a54c76e
-  br.xpi: 35203c252b4ed2156a40a7a71475346187207568
-  bs.xpi: fe4f6b845e037a2a37fce4f4244a849d70d4dab9
-  ca.xpi: 3bb82a485ac89d7d7f9847f585fa2d5376be55ea
-  cs.xpi: 5a51ec696e79c578510455a2455375d39ea5fb0c
-  cy.xpi: f51cdaa049cfa1e361bcb5fa524f096b68c5d5ab
-  da.xpi: 71841d4fd55ac2111b0f9e5753064d546def3a2b
-  de.xpi: 9f84b61b5c82ce98d1029f5706108d2653fd6074
-  el.xpi: d5b579dba11755b2f0a8c385a6c65dbd7fbcf350
-  en-GB.xpi: 05feb578daf83aa3243c2becc100cca4044ffcd9
-  eo.xpi: de23953af9c8715128b87bd07053d04a0171d0ff
-  es-AR.xpi: 96b9f2648229e7eb6682d87cbbae81f6d91bae95
-  es-CL.xpi: dfb6c5a4659bfef9cf3f4bf3a12fd0984965af57
-  es-ES.xpi: 6d883bf64a577b05714c3743cce630b5fd668fe9
-  es-MX.xpi: 616d3a4826aa09682c800b4f70376765683e6b15
-  et.xpi: bb4648694069890fee0354c4255f672a65faa17d
-  eu.xpi: 1e84d5fcf6de43880665f75a11cb824b4ef22c2a
-  fa.xpi: c5037fc98e77a460de47b41a513d31fee001d5a4
-  fi.xpi: c6fc6eee975fe9c309961a9607c58191ef0d4719
-  firefox-126.0.1.source.tar.xz: ece9d1cfedbc845db177ab7d1695ff519d824502
-  fr.xpi: c309919ca3c072825bab7f21c6d15f3be4acc09e
-  fy-NL.xpi: c5cc1177dc509caf2ddd273ad4e652c9057a1737
-  ga-IE.xpi: a1be0990800f8d8f17427439bd393b0cab300169
-  gd.xpi: 67cf8afa2be1b7e6fbf8417832ce138ac7533b6c
-  gl.xpi: 7236a891430021da05171d7b4d6a96858214d5cb
-  gu-IN.xpi: 569c05ed3cb67ae31841b395b19894b5f32689f0
-  he.xpi: 0731dd52c2fa76d562d9ee36ebf6191c5965772c
-  hi-IN.xpi: 9d8b38271406bc5e06af7d0f4965c4d8f5a5a799
-  hr.xpi: 70707a60e29f8fcdc4d96e0ec79d9ebd0abbf1af
-  hu.xpi: f37b8ee6083502d0a8d6011cd45c8ed1acdb795c
-  hy-AM.xpi: f56245c66a672693aad551f7652081fc5925e15c
-  id.xpi: a495ecc0561f669c00bd9645d8afc833b67f555f
-  is.xpi: 4dfb082572e033c29c29acaebb9dc310fd2466ad
-  it.xpi: 1962bf2e45eaf71d916b092758e9e6ac21cb9318
-  ja.xpi: 46a51cc75a23edd48045a3ad6a93c6295cd060a7
-  kk.xpi: cd4dc621309463fcd4aee9f73c5461c417ad1d45
-  km.xpi: cb20c63150b6d1acc704b5bb1c3552917876e36c
-  kn.xpi: cb8e0f5df64ee82977465b86901837836f8e4a40
-  ko.xpi: 3e0b65645f8f39bfee469ba809d173cf441bbce8
-  lt.xpi: 4ec7131005e1a03f28b2d586d4765c379ccd3512
-  lv.xpi: 4d59186866d5d9be1996157ce6789ee8883b1527
-  mk.xpi: 6f6c1709bcfa3ae31b1b8d501f0fd492204f170a
-  mr.xpi: 4214017849ed0a179279303a96f1be5553818aa2
-  nb-NO.xpi: 406e9b1a686125ec1814aa16c50871e9f72ca3a2
-  nl.xpi: bd3d1c962198dd19dd783349009ccd7ca0df2767
-  nn-NO.xpi: 5be3cbca775133859b1cdb4df8915be0bc70bb12
-  pa-IN.xpi: ec7516417c31dd1577872a1ffd2bdc9c38482536
-  pl.xpi: 639cd1716d12ef6d74e77e59116e2439002b8b02
-  pt-BR.xpi: 58a427698f25b8aff962adfebd0bdc8ae1921f1c
-  pt-PT.xpi: 5be6badc231f03aa17461411498e46c6cdbb345d
-  ro.xpi: 58143bcf7f388166235705dbe4b9bfe7a578316c
-  ru.xpi: 1b149b03ae4e3220e4a1b2f929fb60e753bb325c
-  si.xpi: 0eb2aae391ecb9ce80accdaaad2a214ddc3464ae
-  sk.xpi: e98d2d0b2cc3c1ba2a047c01ff355b21238b4822
-  sl.xpi: 751b66da16a36a7b32242c75eb32b5eb7ef6e337
-  sq.xpi: b7c01f99a3a8bfca3c13a27340867f4d140f20cc
-  sr.xpi: d110df8087565d77d02849340db175b55ac247ed
-  sv-SE.xpi: 48164d6ba3b7a43ff88daf813725222cce549e8b
-  ta.xpi: f6f70474ff709dec84ecf1e802ad52367b4672b9
-  te.xpi: 3bc6e81ffe9ec7f379ecc4c1c26c6069903c82bb
-  th.xpi: 84a2254256491f5f8c10e31b84800aeffb9ecb0b
-  tr.xpi: fa6baac1f2cfa20362dfe5f20b79502af3c187a9
-  uk.xpi: 7e8285b664962ed95651c6bade53293ec280e15b
-  vi.xpi: 67116cbe03cd7e98a9cf64c7a6e5192eb73f2d66
-  zh-CN.xpi: 02791b07cdfdfbacc9c73909b311668fcae84e76
-  zh-TW.xpi: e9c163f5378bd7473176b62574fb1c2f9a5d0054
+  bg.xpi: 6f2be4881ba9aaf80a546c3e1a53d4373d6f80e8
+  bn.xpi: b605cb9ada83df19e333b4c9ad1b448cef8d472f
+  br.xpi: 09ecfc954d19b7a505ea2f587bd5ffca9f40dbc6
+  bs.xpi: 9a5aed24f2221782ef73e94d872beebf1d6fb1b5
+  ca.xpi: f2718d6fb4ebc5efe26aa3bb8f240ba8e05ac57c
+  cs.xpi: 121574d8e91770bffa4291d5a2f7688521e6aa20
+  cy.xpi: 612e53144fc6005df35e8bb765b5666feee9cd9c
+  da.xpi: 9daf08819fdfc3cbe9e269609d26bd1644a6c661
+  de.xpi: f4f65d6c522a62aaa1eeb8c8a7b12e4aba706227
+  el.xpi: 1bc05d2cb81fe93821356fa4e23dbe6f6eaddbca
+  en-GB.xpi: cf0e2da964af2adcacad6cf0f4e7b374d2f3398b
+  eo.xpi: eddde2d7797da1bdd42e2696b369cb28c77e58c6
+  es-AR.xpi: 97213184b5d75aeed2e6ecb27af33ba677688952
+  es-CL.xpi: fdce89e7a1f5c1bc4a2fa6c0fb7a2059f2d7b4b1
+  es-ES.xpi: f8ec5d9dca47718b2976111ce717fe5df0805b97
+  es-MX.xpi: c65be8dd93da50d28363f8992a8f1ad9ab29be72
+  et.xpi: 2e175d1d5fb6101b8d7a684e98b5cdfca322495a
+  eu.xpi: eef8ff2f130cc1d0af56474f0ad63fee7d1b8ad0
+  fa.xpi: dbbe61ede03010d766623ad07fd145fcf3000981
+  fi.xpi: 92fbc0729627502e9ed30ec2d25ba2045ffdab5b
+  firefox-127.0.source.tar.xz: 2822ce55f7c3a1e3a874575b5683449ffc47221b
+  fr.xpi: c0fc32c550589f45b2b37a37f0cde5138ef58e01
+  fy-NL.xpi: 2e5520b21c93d639a2c4af445b2bf9055d1ea09e
+  ga-IE.xpi: 1899fbb3d3794b6d7be6ed61ba4d97c266c35405
+  gd.xpi: b3eaae2e36db26d06ca1698626194b8d37a2b82d
+  gl.xpi: 3a4a3741d2e4a999d1797809817e546e1ca23943
+  gu-IN.xpi: c79789c05bb97b5eb533c889d1f5bb5f74fbcaae
+  he.xpi: 2e62c2f481ca1e536adc8b6871c46bef0069ce57
+  hi-IN.xpi: 0f68727980e46fd6df88f3926ed2b417541403c7
+  hr.xpi: 10bcd675bc17e75c13945589cfb95fde0a1ed660
+  hu.xpi: f9b3292035fdfd9e083da4f331e9c10696bd8559
+  hy-AM.xpi: 0364a71e598845cd8a424b08023d3cf692451de9
+  id.xpi: bd48c3dedb4b0e742bbf190c4641d54aa3b511fb
+  is.xpi: 2af39f8aba7b4db3ed12f7b0746b0d28e3e53b58
+  it.xpi: 2de1006b82d59c6be5bb60db5a0d5962c8fc8303
+  ja.xpi: 186e2d58ff7e11f7a5f1315ac922a07e1990de38
+  kk.xpi: a69b21831be96db587355c49d721f6d40319fdaf
+  km.xpi: b1968ae95c549bc28a4a651d25eff621f193274f
+  kn.xpi: db0925a8274e8e344fc5b00f3b017403cdee4d97
+  ko.xpi: 85af6da5b776b000b1d2df3e9e0f6acc4cd5ee92
+  lt.xpi: 59cccb55aa0d7bd83527f3940ee57d5e896236b3
+  lv.xpi: 71049c4cf41a0b6bb87209a889cd907785ebb58c
+  mk.xpi: 3cb2bae113587375f416c33c96c7910fdd5b1aeb
+  mr.xpi: bbb75bb06384ed69974496b4ea5be8e5c752a42a
+  nb-NO.xpi: 0f5b20aff27e2b3043383f357481c288b7e64721
+  nl.xpi: 38d187d781e0290a89ec1485fb5dcd9483d95bf9
+  nn-NO.xpi: c022b8cb307e2361f6d3d50907cd6e77d4ec1403
+  pa-IN.xpi: fa3b0f0ccd1921fca8bd35c358f46deb3d9e5a4c
+  pl.xpi: 00acdfef66f0bf77a44e7e090103af029e5d74ea
+  pt-BR.xpi: 37adfc5e0c84072f516b52c1a91907d150f547df
+  pt-PT.xpi: 2a5e0eb30df352fc0ef3226aae41e2bc5e048eac
+  ro.xpi: ebcb9eeae50f8e8b76b742a4386535291625c482
+  ru.xpi: d8d7bf783e72136cd04796e514c350630c1f81c4
+  si.xpi: 9f5759762a76b878a0bcf90a1383c89edfa30ad6
+  sk.xpi: 2542c25caafcae05164c6490926b694fccda3841
+  sl.xpi: 88c3e884622108366bd70637063a8dd82e53f9e8
+  sq.xpi: 810f2a5633edad8bf7bf680998549d8996cfe77a
+  sr.xpi: 62edd9b2771c9522d0162ff44f9191cad556a833
+  sv-SE.xpi: b145ab79c6162fdc75f06d8beffd948370cf2c38
+  ta.xpi: f8a1659665f9a06238563fb3158b60d2be46ad62
+  te.xpi: 209587c6f93308882c73e39a442e634c7d417798
+  th.xpi: d40d1a187efffb03d3112fa55e83439be7233560
+  tr.xpi: 8ce84c97bdec32d2f2f7dcad1d9974fae6ae9837
+  uk.xpi: 7169385d7736a29f92c47f323d1a65570764f4c3
+  vi.xpi: 034f28c4bea10b9477777d9cee39c532299c48dd
+  zh-CN.xpi: 025801a65a4ab06da993cfcb61fc7616f86f7f96
+  zh-TW.xpi: 27b1f9be69458e9d414dc94f6f900a7f5a0cc776
diff --git a/05d7a7c92cf2.patch b/05d7a7c92cf2.patch
deleted file mode 100644
index 93f7c49..0000000
--- a/05d7a7c92cf2.patch
+++ /dev/null
@@ -1,903 +0,0 @@
-
-# HG changeset patch
-# User Paul Adenot <paul@paul.cx>
-# Date 1714486906 0
-# Node ID 05d7a7c92cf24c6b47bf84a693c71a507b312f3c
-# Parent  5759fe6ed8a53b22ffac43c073687e127c07b0f7
-Bug 1889978 - Make all files using the FFmpeg API compatible with ffmpeg 7.0. r=media-playback-reviewers,alwu
-
-AVCodecContext.channels doesn't exist anymore.
-AVCodecContext.ch_layout.nb_channels is the equivalent.
-
-AVFrame.channels also has switched to .ch_layout.nb_channels.
-
-AVFrame.pkt_duration has switched to .duration (same meaning)
-
-AVPacket can't be allocated on the stack, it's size isn't part of the ABI. It
-needs to be allocated via av_packet_alloc, and freed using av_packet_free.
-
-
-AVCodecContext.reordered_opaque doesn't exist anymore, we don't really need it.
-
-Differential Revision: https://phabricator.services.mozilla.com/D206924
-
-diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
---- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
-+++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
-@@ -1,15 +1,16 @@
- /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* vim:set ts=2 sw=2 sts=2 et cindent: */
- /* This Source Code Form is subject to the terms of the Mozilla Public
-  * License, v. 2.0. If a copy of the MPL was not distributed with this
-  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- 
- #include "FFmpegAudioDecoder.h"
-+#include "FFmpegUtils.h"
- #include "AudioSampleFormat.h"
- #include "FFmpegLog.h"
- #include "TimeUnits.h"
- #include "VideoUtils.h"
- #include "BufferReader.h"
- #include "libavutil/dict.h"
- #include "libavutil/samplefmt.h"
- #if defined(FFVPX_VERSION)
-@@ -245,17 +246,17 @@ MediaResult FFmpegAudioDecoder<LIBAV_VER
-   }
- 
-   FFMPEG_LOG("FFmpegAudioDecoder decoded: [%s,%s] (Duration: %s) [%s]",
-              aSample->mTime.ToString().get(),
-              aSample->GetEndTime().ToString().get(),
-              aSample->mDuration.ToString().get(),
-              mLib->av_get_sample_fmt_name(mFrame->format));
- 
--  uint32_t numChannels = mCodecContext->channels;
-+  uint32_t numChannels = ChannelCount(mCodecContext);
-   uint32_t samplingRate = mCodecContext->sample_rate;
-   if (!numChannels) {
-     numChannels = mAudioInfo.mChannels;
-   }
-   if (!samplingRate) {
-     samplingRate = mAudioInfo.mRate;
-   }
-   AlignedAudioBuffer audio =
-@@ -279,17 +280,17 @@ MediaResult FFmpegAudioDecoder<LIBAV_VER
-                duration.ToSeconds());
-     return MediaResult(
-         NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
-         RESULT_DETAIL("Invalid count of accumulated audio samples"));
-   }
- 
-   RefPtr<AudioData> data =
-       new AudioData(aSample->mOffset, pts, std::move(audio), numChannels,
--                    samplingRate, mCodecContext->channel_layout);
-+                    samplingRate, numChannels);
-   MOZ_ASSERT(duration == data->mDuration, "must be equal");
-   aResults.AppendElement(std::move(data));
- 
-   pts = newpts;
- 
-   if (aGotFrame) {
-     *aGotFrame = true;
-   }
-@@ -390,41 +391,50 @@ MediaResult FFmpegAudioDecoder<LIBAV_VER
- #endif
- 
- MediaResult FFmpegAudioDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample,
-                                                     uint8_t* aData, int aSize,
-                                                     bool* aGotFrame,
-                                                     DecodedData& aResults) {
-   MOZ_ASSERT(mTaskQueue->IsOnCurrentThread());
-   PROCESS_DECODE_LOG(aSample);
--  AVPacket packet;
--  mLib->av_init_packet(&packet);
-+  AVPacket* packet;
-+#if LIBAVCODEC_VERSION_MAJOR >= 61
-+  packet = mLib->av_packet_alloc();
-+  auto freePacket =
-+    MakeScopeExit([&] { mLib->av_packet_free(&packet); });
-+#else
-+  AVPacket packet_mem;
-+  packet = &packet_mem;
-+  mLib->av_init_packet(packet);
-+#endif
- 
-   FFMPEG_LOG("FFmpegAudioDecoder::DoDecode: %d bytes, [%s,%s] (Duration: %s)",
-              aSize, aSample->mTime.ToString().get(),
-              aSample->GetEndTime().ToString().get(),
-              aSample->mDuration.ToString().get());
- 
--  packet.data = const_cast<uint8_t*>(aData);
--  packet.size = aSize;
-+  packet->data = const_cast<uint8_t*>(aData);
-+  packet->size = aSize;
- 
-   if (aGotFrame) {
-     *aGotFrame = false;
-   }
- 
-   if (!PrepareFrame()) {
-     FFMPEG_LOG("FFmpegAudioDecoder: OOM in PrepareFrame");
-     return MediaResult(
-         NS_ERROR_OUT_OF_MEMORY,
-         RESULT_DETAIL("FFmpeg audio decoder failed to allocate frame"));
-   }
- 
-   bool decoded = false;
--  auto rv = DecodeUsingFFmpeg(&packet, decoded, aSample, aResults, aGotFrame);
-+  auto rv = DecodeUsingFFmpeg(packet, decoded, aSample, aResults, aGotFrame);
-   NS_ENSURE_SUCCESS(rv, rv);
-+
-   return NS_OK;
- }
- 
- AVCodecID FFmpegAudioDecoder<LIBAV_VER>::GetCodecId(const nsACString& aMimeType,
-                                                     const AudioInfo& aInfo) {
-   if (aMimeType.EqualsLiteral("audio/mp4a-latm")) {
-     return AV_CODEC_ID_AAC;
-   }
-diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioEncoder.cpp b/dom/media/platforms/ffmpeg/FFmpegAudioEncoder.cpp
---- a/dom/media/platforms/ffmpeg/FFmpegAudioEncoder.cpp
-+++ b/dom/media/platforms/ffmpeg/FFmpegAudioEncoder.cpp
-@@ -96,22 +96,23 @@ nsresult FFmpegAudioEncoder<LIBAV_VER>::
-       FFMPEG_LOG(
-           "Error creating resampler in FFmpegAudioEncoder %dHz -> %dHz (%dch)",
-           mInputSampleRate, mConfig.mSampleRate, mConfig.mNumberOfChannels);
-     }
-   }
- 
-   // And now the audio-specific part
-   mCodecContext->sample_rate = AssertedCast<int>(mConfig.mSampleRate);
--  mCodecContext->channels = AssertedCast<int>(mConfig.mNumberOfChannels);
- 
- #if LIBAVCODEC_VERSION_MAJOR >= 60
-   // Gecko's ordering intentionnally matches ffmepg's ordering
-   mLib->av_channel_layout_default(&mCodecContext->ch_layout,
--                                  AssertedCast<int>(mCodecContext->channels));
-+                                  AssertedCast<int>(mConfig.mNumberOfChannels));
-+#else
-+  mCodecContext->channels = AssertedCast<int>(mConfig.mNumberOfChannels);
- #endif
- 
-   switch (mConfig.mCodec) {
-     case CodecType::Opus:
-       // When using libopus, ffmpeg supports interleaved float and s16 input.
-       mCodecContext->sample_fmt = AV_SAMPLE_FMT_FLT;
-       break;
-     case CodecType::Vorbis:
-@@ -201,17 +202,17 @@ FFmpegAudioEncoder<LIBAV_VER>::EncodeOne
-   }
- 
-   uint32_t frameCount = aSamples.Length() / mConfig.mNumberOfChannels;
- 
-   // This method assumes that the audio has been packetized appropriately --
-   // packets smaller than the packet size are allowed when draining.
-   MOZ_ASSERT(AssertedCast<int>(frameCount) <= mCodecContext->frame_size);
- 
--  mFrame->channels = AssertedCast<int>(mConfig.mNumberOfChannels);
-+  ChannelCount(mFrame) = AssertedCast<int>(mConfig.mNumberOfChannels);
- 
- #  if LIBAVCODEC_VERSION_MAJOR >= 60
-   int rv = mLib->av_channel_layout_copy(&mFrame->ch_layout,
-                                         &mCodecContext->ch_layout);
-   if (rv < 0) {
-     FFMPEG_LOG("channel layout copy error: %s",
-                MakeErrorString(mLib, rv).get());
-     return Err(NS_ERROR_DOM_MEDIA_FATAL_ERR);
-@@ -224,20 +225,20 @@ FFmpegAudioEncoder<LIBAV_VER>::EncodeOne
-   // Audio is converted below if needed
-   mFrame->format = mCodecContext->sample_fmt;
-   // Set presentation timestamp and duration of the AVFrame.
- #  if LIBAVCODEC_VERSION_MAJOR >= 59
-   mFrame->time_base =
-       AVRational{.num = 1, .den = static_cast<int>(mConfig.mSampleRate)};
- #  endif
-   mFrame->pts = aPts.ToTicksAtRate(mConfig.mSampleRate);
--  mFrame->pkt_duration = frameCount;
- #  if LIBAVCODEC_VERSION_MAJOR >= 60
-   mFrame->duration = frameCount;
- #  else
-+  mFrame->pkt_duration = frameCount;
-   // Save duration in the time_base unit.
-   mDurationMap.Insert(mFrame->pts, mFrame->pkt_duration);
- #  endif
- 
-   if (int ret = mLib->av_frame_get_buffer(mFrame, 16); ret < 0) {
-     FFMPEG_LOG("failed to allocate frame data: %s",
-                MakeErrorString(mLib, ret).get());
-     return Err(NS_ERROR_OUT_OF_MEMORY);
-@@ -253,17 +254,17 @@ FFmpegAudioEncoder<LIBAV_VER>::EncodeOne
-   // The input is always in f32 interleaved for now
-   if (mCodecContext->sample_fmt == AV_SAMPLE_FMT_FLT) {
-     PodCopy(reinterpret_cast<float*>(mFrame->data[0]), aSamples.data(),
-             aSamples.Length());
-   } else {
-     MOZ_ASSERT(mCodecContext->sample_fmt == AV_SAMPLE_FMT_FLTP);
-     for (uint32_t i = 0; i < mConfig.mNumberOfChannels; i++) {
-       DeinterleaveAndConvertBuffer(aSamples.data(), mFrame->nb_samples,
--                                   mFrame->channels, mFrame->data);
-+                                   mConfig.mNumberOfChannels, mFrame->data);
-     }
-   }
- 
-   // Now send the AVFrame to ffmpeg for encoding, same code for audio and video.
-   return FFmpegDataEncoder<LIBAV_VER>::EncodeWithModernAPIs();
- }
- 
- Result<MediaDataEncoder::EncodedData, nsresult> FFmpegAudioEncoder<
-diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
---- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
-+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
-@@ -64,26 +64,29 @@ FFmpegLibWrapper::LinkResult FFmpegLibWr
-     AV_FUNC_53 = 1 << 0,
-     AV_FUNC_54 = 1 << 1,
-     AV_FUNC_55 = 1 << 2,
-     AV_FUNC_56 = 1 << 3,
-     AV_FUNC_57 = 1 << 4,
-     AV_FUNC_58 = 1 << 5,
-     AV_FUNC_59 = 1 << 6,
-     AV_FUNC_60 = 1 << 7,
-+    AV_FUNC_61 = 1 << 7,
-     AV_FUNC_AVUTIL_53 = AV_FUNC_53 | AV_FUNC_AVUTIL_MASK,
-     AV_FUNC_AVUTIL_54 = AV_FUNC_54 | AV_FUNC_AVUTIL_MASK,
-     AV_FUNC_AVUTIL_55 = AV_FUNC_55 | AV_FUNC_AVUTIL_MASK,
-     AV_FUNC_AVUTIL_56 = AV_FUNC_56 | AV_FUNC_AVUTIL_MASK,
-     AV_FUNC_AVUTIL_57 = AV_FUNC_57 | AV_FUNC_AVUTIL_MASK,
-     AV_FUNC_AVUTIL_58 = AV_FUNC_58 | AV_FUNC_AVUTIL_MASK,
-     AV_FUNC_AVUTIL_59 = AV_FUNC_59 | AV_FUNC_AVUTIL_MASK,
-     AV_FUNC_AVUTIL_60 = AV_FUNC_60 | AV_FUNC_AVUTIL_MASK,
-+    AV_FUNC_AVUTIL_61 = AV_FUNC_61 | AV_FUNC_AVUTIL_MASK,
-     AV_FUNC_AVCODEC_ALL = AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 | AV_FUNC_56 |
--                          AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60,
-+                          AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 |
-+                          AV_FUNC_61,
-     AV_FUNC_AVUTIL_ALL = AV_FUNC_AVCODEC_ALL | AV_FUNC_AVUTIL_MASK
-   };
- 
-   switch (macro) {
-     case 53:
-       version = AV_FUNC_53;
-       break;
-     case 54:
-@@ -102,16 +105,19 @@ FFmpegLibWrapper::LinkResult FFmpegLibWr
-       version = AV_FUNC_58;
-       break;
-     case 59:
-       version = AV_FUNC_59;
-       break;
-     case 60:
-       version = AV_FUNC_60;
-       break;
-+    case 61:
-+      version = AV_FUNC_61;
-+      break;
-     default:
-       FFMPEGV_LOG("Unknown avcodec version: %d", macro);
-       Unlink();
-       return isFFMpeg ? ((macro > 57) ? LinkResult::UnknownFutureFFMpegVersion
-                                       : LinkResult::UnknownOlderFFMpegVersion)
-                       // All LibAV versions<54.35.1 are blocked, therefore we
-                       // must be dealing with a later one.
-                       : LinkResult::UnknownFutureLibAVVersion;
-@@ -148,116 +154,137 @@ FFmpegLibWrapper::LinkResult FFmpegLibWr
-                                    AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58)
-   AV_FUNC(avcodec_alloc_context3, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_close, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_decode_audio4, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 |
-                                      AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58)
-   AV_FUNC(avcodec_decode_video2, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 |
-                                      AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58)
-   AV_FUNC(avcodec_find_decoder, AV_FUNC_AVCODEC_ALL)
--  AV_FUNC(avcodec_find_decoder_by_name, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
-+  AV_FUNC(avcodec_find_decoder_by_name,
-+          AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC(avcodec_find_encoder, AV_FUNC_AVCODEC_ALL)
--  AV_FUNC(avcodec_find_encoder_by_name, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
-+  AV_FUNC(avcodec_find_encoder_by_name,
-+          AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC(avcodec_flush_buffers, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_open2, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_register_all, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 |
-                                     AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58)
--  AV_FUNC(av_init_packet, AV_FUNC_AVCODEC_ALL)
-+  AV_FUNC(av_init_packet, (AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58 |
-+                              AV_FUNC_59 | AV_FUNC_60))
-   AV_FUNC(av_parser_init, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(av_parser_close, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(av_parser_parse2, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_align_dimensions, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_alloc_frame, (AV_FUNC_53 | AV_FUNC_54))
-   AV_FUNC(avcodec_get_frame_defaults, (AV_FUNC_53 | AV_FUNC_54))
-   AV_FUNC(avcodec_free_frame, AV_FUNC_54)
--  AV_FUNC(avcodec_send_packet, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
--  AV_FUNC(avcodec_receive_packet, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
--  AV_FUNC(avcodec_send_frame, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
--  AV_FUNC(avcodec_receive_frame, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
--  AV_FUNC(avcodec_default_get_buffer2, (AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57 |
--                                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60))
--  AV_FUNC(av_packet_alloc, (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60))
--  AV_FUNC(av_packet_unref, (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60))
--  AV_FUNC(av_packet_free, (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60))
-+  AV_FUNC(avcodec_send_packet,
-+          AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-+  AV_FUNC(avcodec_receive_packet,
-+          AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-+  AV_FUNC(avcodec_send_frame, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-+  AV_FUNC(avcodec_receive_frame,
-+          AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-+  AV_FUNC(avcodec_default_get_buffer2,
-+          (AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 |
-+           AV_FUNC_60 | AV_FUNC_61))
-+  AV_FUNC(av_packet_alloc,
-+          (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61))
-+  AV_FUNC(av_packet_unref,
-+          (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61))
-+  AV_FUNC(av_packet_free,
-+          (AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61))
-   AV_FUNC(avcodec_descriptor_get, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(av_log_set_level, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC(av_malloc, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC(av_freep, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC(av_frame_alloc,
-           (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
--           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
-+           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 |
-+           AV_FUNC_AVUTIL_61))
-   AV_FUNC(av_frame_free,
-           (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
--           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
-+           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 |
-+           AV_FUNC_AVUTIL_61))
-   AV_FUNC(av_frame_unref,
-           (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
--           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
-+           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 |
-+           AV_FUNC_AVUTIL_61))
-   AV_FUNC(av_frame_get_buffer,
-           (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
--           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
-+           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 |
-+           AV_FUNC_AVUTIL_61))
-   AV_FUNC(av_frame_make_writable,
-           (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
--           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
-+           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 |
-+           AV_FUNC_AVUTIL_61))
-   AV_FUNC(av_image_check_size, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC(av_image_get_buffer_size, AV_FUNC_AVUTIL_ALL)
--  AV_FUNC_OPTION(av_channel_layout_default, AV_FUNC_AVUTIL_60)
--  AV_FUNC_OPTION(av_channel_layout_from_mask, AV_FUNC_AVUTIL_60)
--  AV_FUNC_OPTION(av_channel_layout_copy, AV_FUNC_AVUTIL_60)
-+  AV_FUNC_OPTION(av_channel_layout_default,
-+                 AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61)
-+  AV_FUNC_OPTION(av_channel_layout_from_mask,
-+                 AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61)
-+  AV_FUNC_OPTION(av_channel_layout_copy, AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61)
-   AV_FUNC_OPTION(av_buffer_get_opaque,
-                  (AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58 |
--                  AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
--  AV_FUNC(av_buffer_create,
--          (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
--           AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
-+                  AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61))
-+  AV_FUNC(
-+      av_buffer_create,
-+      (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
-+       AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | AV_FUNC_61))
-   AV_FUNC_OPTION(av_frame_get_colorspace,
-                  AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
-                      AV_FUNC_AVUTIL_58)
-   AV_FUNC_OPTION(av_frame_get_color_range,
-                  AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
-                      AV_FUNC_AVUTIL_58)
--  AV_FUNC(av_strerror,
--          AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60)
-+  AV_FUNC(av_strerror, AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 |
-+                           AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61)
-   AV_FUNC(av_get_sample_fmt_name, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC(av_dict_set, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC(av_dict_free, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC(av_opt_set, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC(av_opt_set_double, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC(av_opt_set_int, AV_FUNC_AVUTIL_ALL)
- 
- #ifdef MOZ_WIDGET_GTK
-   AV_FUNC_OPTION_SILENT(avcodec_get_hw_config,
--                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
--  AV_FUNC_OPTION_SILENT(av_codec_iterate, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-+  AV_FUNC_OPTION_SILENT(av_codec_iterate,
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(av_codec_is_decoder,
--                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_init,
--                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_alloc,
--                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(av_hwdevice_hwconfig_alloc,
--                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(av_hwdevice_get_hwframe_constraints,
--                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(av_hwframe_constraints_free,
--                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
--  AV_FUNC_OPTION_SILENT(av_buffer_ref,
--                        AV_FUNC_AVUTIL_58 | AV_FUNC_59 | AV_FUNC_60)
--  AV_FUNC_OPTION_SILENT(av_buffer_unref,
--                        AV_FUNC_AVUTIL_58 | AV_FUNC_59 | AV_FUNC_60)
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-+  AV_FUNC_OPTION_SILENT(av_buffer_ref, AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 |
-+                                           AV_FUNC_AVUTIL_60 |
-+                                           AV_FUNC_AVUTIL_61)
-+  AV_FUNC_OPTION_SILENT(av_buffer_unref, AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 |
-+                                             AV_FUNC_AVUTIL_60 |
-+                                             AV_FUNC_AVUTIL_61)
-   AV_FUNC_OPTION_SILENT(av_hwframe_transfer_get_formats,
--                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_create_derived,
--                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(av_hwframe_ctx_alloc,
--                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
--  AV_FUNC_OPTION_SILENT(avcodec_get_name,
--                        AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
--  AV_FUNC_OPTION_SILENT(av_get_pix_fmt_string, AV_FUNC_AVUTIL_58 |
--                                                   AV_FUNC_AVUTIL_59 |
--                                                   AV_FUNC_AVUTIL_60)
-+                        AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-+  AV_FUNC_OPTION_SILENT(avcodec_get_name, AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 |
-+                                              AV_FUNC_60 | AV_FUNC_61)
-+  AV_FUNC_OPTION_SILENT(
-+      av_get_pix_fmt_string,
-+      AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61)
- #endif
- 
-   AV_FUNC_OPTION(av_tx_init, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC_OPTION(av_tx_uninit, AV_FUNC_AVUTIL_ALL)
- 
- #undef AV_FUNC
- #undef AV_FUNC_OPTION
- 
-diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
---- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
-+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
-@@ -133,20 +133,22 @@ struct MOZ_ONLY_USED_TO_AVOID_STATIC_CON
-   // libavcodec v54 only
-   void (*avcodec_free_frame)(AVFrame** frame);
- 
-   // libavcodec >= v55
-   int (*avcodec_default_get_buffer2)(AVCodecContext* s, AVFrame* frame,
-                                      int flags);
- 
-   // libavcodec >= v57
--  AVPacket* (*av_packet_alloc)(void);
-   void (*av_packet_unref)(AVPacket* pkt);
-   void (*av_packet_free)(AVPacket** pkt);
- 
-+  // libavcodec >= 61
-+  AVPacket* (*av_packet_alloc)();
-+
-   // libavcodec v58 and later only
-   int (*avcodec_send_packet)(AVCodecContext* avctx, const AVPacket* avpkt);
-   int (*avcodec_receive_packet)(AVCodecContext* avctx, AVPacket* avpkt);
-   int (*avcodec_send_frame)(AVCodecContext* avctx, const AVFrame* frame);
-   int (*avcodec_receive_frame)(AVCodecContext* avctx, AVFrame* frame);
- 
-   // libavutil
-   void (*av_log_set_level)(int level);
-diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
---- a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
-+++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
-@@ -28,28 +28,30 @@ class FFmpegEncoderModule {
-   static already_AddRefed<PlatformEncoderModule> Create(FFmpegLibWrapper*);
- };
- 
- static FFmpegLibWrapper sLibAV;
- 
- static const char* sLibs[] = {
- // clang-format off
- #if defined(XP_DARWIN)
-+  "libavcodec.61.dylib",
-   "libavcodec.60.dylib",
-   "libavcodec.59.dylib",
-   "libavcodec.58.dylib",
-   "libavcodec.57.dylib",
-   "libavcodec.56.dylib",
-   "libavcodec.55.dylib",
-   "libavcodec.54.dylib",
-   "libavcodec.53.dylib",
- #elif defined(XP_OPENBSD)
-   "libavcodec.so", // OpenBSD hardly controls the major/minor library version
-                    // of ffmpeg and update it regulary on ABI/API changes
- #else
-+  "libavcodec.so.61",
-   "libavcodec.so.60",
-   "libavcodec.so.59",
-   "libavcodec.so.58",
-   "libavcodec-ffmpeg.so.58",
-   "libavcodec-ffmpeg.so.57",
-   "libavcodec-ffmpeg.so.56",
-   "libavcodec.so.57",
-   "libavcodec.so.56",
-@@ -169,16 +171,19 @@ already_AddRefed<PlatformDecoderModule> 
-       module = FFmpegDecoderModule<58>::Create(&sLibAV);
-       break;
-     case 59:
-       module = FFmpegDecoderModule<59>::Create(&sLibAV);
-       break;
-     case 60:
-       module = FFmpegDecoderModule<60>::Create(&sLibAV);
-       break;
-+    case 61:
-+      module = FFmpegDecoderModule<61>::Create(&sLibAV);
-+      break;
-     default:
-       module = nullptr;
-   }
-   return module.forget();
- }
- 
- /* static */
- already_AddRefed<PlatformEncoderModule> FFmpegRuntimeLinker::CreateEncoder() {
-@@ -204,16 +209,19 @@ already_AddRefed<PlatformEncoderModule> 
-       module = FFmpegEncoderModule<58>::Create(&sLibAV);
-       break;
-     case 59:
-       module = FFmpegEncoderModule<59>::Create(&sLibAV);
-       break;
-     case 60:
-       module = FFmpegEncoderModule<60>::Create(&sLibAV);
-       break;
-+    case 61:
-+      module = FFmpegEncoderModule<61>::Create(&sLibAV);
-+      break;
-     default:
-       module = nullptr;
-   }
-   return module.forget();
- }
- 
- /* static */ const char* FFmpegRuntimeLinker::LinkStatusString() {
-   switch (sLinkStatus) {
-diff --git a/dom/media/platforms/ffmpeg/FFmpegUtils.h b/dom/media/platforms/ffmpeg/FFmpegUtils.h
---- a/dom/media/platforms/ffmpeg/FFmpegUtils.h
-+++ b/dom/media/platforms/ffmpeg/FFmpegUtils.h
-@@ -46,11 +46,41 @@ inline bool IsVideoCodec(AVCodecID aCode
-     case AV_CODEC_ID_AV1:
- #endif
-       return true;
-     default:
-       return false;
-   }
- }
- 
-+// Access the correct location for the channel count, based on ffmpeg version.
-+template<typename T>
-+inline int& ChannelCount(T* aObject) {
-+#if LIBAVCODEC_VERSION_MAJOR <= 59
-+  return aObject->channels;
-+#else
-+  return aObject->ch_layout.nb_channels;
-+#endif
-+}
-+
-+// Access the correct location for the duration, based on ffmpeg version.
-+template<typename T>
-+inline int64_t& Duration(T* aObject) {
-+#if LIBAVCODEC_VERSION_MAJOR < 61
-+  return aObject->pkt_duration;
-+#else
-+  return aObject->duration;
-+#endif
-+}
-+
-+// Access the correct location for the duration, based on ffmpeg version.
-+template<typename T>
-+inline const int64_t& Duration(const T* aObject) {
-+#if LIBAVCODEC_VERSION_MAJOR < 61
-+  return aObject->pkt_duration;
-+#else
-+  return aObject->duration;
-+#endif
-+}
-+
- }  // namespace mozilla
- 
- #endif  // DOM_MEDIA_PLATFORMS_FFMPEG_FFMPEGUTILS_H_
-diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
---- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
-+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
-@@ -2,16 +2,17 @@
- /* vim:set ts=2 sw=2 sts=2 et cindent: */
- /* This Source Code Form is subject to the terms of the Mozilla Public
-  * License, v. 2.0. If a copy of the MPL was not distributed with this
-  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- 
- #include "FFmpegVideoDecoder.h"
- 
- #include "FFmpegLog.h"
-+#include "FFmpegUtils.h"
- #include "ImageContainer.h"
- #include "MP4Decoder.h"
- #include "MediaInfo.h"
- #include "VideoUtils.h"
- #include "VPXDecoder.h"
- #include "mozilla/layers/KnowsCompositor.h"
- #if LIBAVCODEC_VERSION_MAJOR >= 57
- #  include "mozilla/layers/TextureClient.h"
-@@ -866,17 +867,19 @@ int FFmpegVideoDecoder<LIBAV_VER>::GetVi
-   aFrame->linesize[0] = mapped.y.stride;
-   aFrame->linesize[1] = mapped.cb.stride;
-   aFrame->linesize[2] = mapped.cr.stride;
- 
-   aFrame->width = aCodecContext->coded_width;
-   aFrame->height = aCodecContext->coded_height;
-   aFrame->format = aCodecContext->pix_fmt;
-   aFrame->extended_data = aFrame->data;
-+#  if LIBAVCODEC_VERSION_MAJOR < 61
-   aFrame->reordered_opaque = aCodecContext->reordered_opaque;
-+#endif
-   MOZ_ASSERT(aFrame->data[0] && aFrame->data[1] && aFrame->data[2]);
- 
-   // This will hold a reference to image, and the reference would be dropped
-   // when ffmpeg tells us that the buffer is no longer needed.
-   auto imageWrapper = MakeRefPtr<ImageBufferWrapper>(image.get(), this);
-   aFrame->buf[0] =
-       mLib->av_buffer_create(aFrame->data[0], dataSize.value(),
-                              ReleaseVideoBufferWrapper, imageWrapper.get(), 0);
-@@ -986,22 +989,17 @@ bool FFmpegVideoDecoder<LIBAV_VER>::Deco
- }
- 
- void FFmpegVideoDecoder<LIBAV_VER>::DecodeStats::UpdateDecodeTimes(
-     const AVFrame* aFrame) {
-   TimeStamp now = TimeStamp::Now();
-   float decodeTime = (now - mDecodeStart).ToMilliseconds();
-   mDecodeStart = now;
- 
--  if (aFrame->pkt_duration <= 0) {
--    FFMPEGV_LOG("Incorrect frame duration, skipping decode stats.");
--    return;
--  }
--
--  float frameDuration = aFrame->pkt_duration / 1000.0f;
-+  const float frameDuration = Duration(aFrame) / 1000.0f;
- 
-   mDecodedFrames++;
-   mAverageFrameDuration =
-       (mAverageFrameDuration * (mDecodedFrames - 1) + frameDuration) /
-       mDecodedFrames;
-   mAverageFrameDecodeTime =
-       (mAverageFrameDecodeTime * (mDecodedFrames - 1) + decodeTime) /
-       mDecodedFrames;
-@@ -1039,29 +1037,39 @@ void FFmpegVideoDecoder<LIBAV_VER>::Deco
-   }
- }
- #endif
- 
- MediaResult FFmpegVideoDecoder<LIBAV_VER>::DoDecode(
-     MediaRawData* aSample, uint8_t* aData, int aSize, bool* aGotFrame,
-     MediaDataDecoder::DecodedData& aResults) {
-   MOZ_ASSERT(mTaskQueue->IsOnCurrentThread());
--  AVPacket packet;
--  mLib->av_init_packet(&packet);
-+  AVPacket* packet;
-+
-+#if LIBAVCODEC_VERSION_MAJOR >= 61
-+  packet = mLib->av_packet_alloc();
-+  auto raii = MakeScopeExit([&]() {
-+    mLib->av_packet_free(&packet);
-+  });
-+#else
-+  AVPacket packet_mem;
-+  packet = &packet_mem;
-+  mLib->av_init_packet(packet);
-+#endif
- 
- #if LIBAVCODEC_VERSION_MAJOR >= 58
-   mDecodeStats.DecodeStart();
- #endif
- 
--  packet.data = aData;
--  packet.size = aSize;
--  packet.dts = aSample->mTimecode.ToMicroseconds();
--  packet.pts = aSample->mTime.ToMicroseconds();
--  packet.flags = aSample->mKeyframe ? AV_PKT_FLAG_KEY : 0;
--  packet.pos = aSample->mOffset;
-+  packet->data = aData;
-+  packet->size = aSize;
-+  packet->dts = aSample->mTimecode.ToMicroseconds();
-+  packet->pts = aSample->mTime.ToMicroseconds();
-+  packet->flags = aSample->mKeyframe ? AV_PKT_FLAG_KEY : 0;
-+  packet->pos = aSample->mOffset;
- 
-   mTrackingId.apply([&](const auto& aId) {
-     MediaInfoFlag flag = MediaInfoFlag::None;
-     flag |= (aSample->mKeyframe ? MediaInfoFlag::KeyFrame
-                                 : MediaInfoFlag::NonKeyFrame);
-     flag |= (IsHardwareAccelerated() ? MediaInfoFlag::HardwareDecoding
-                                      : MediaInfoFlag::SoftwareDecoding);
-     switch (mCodecID) {
-@@ -1082,24 +1090,24 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER
-       case AV_CODEC_ID_AV1:
-         flag |= MediaInfoFlag::VIDEO_AV1;
-         break;
- #endif
-       default:
-         break;
-     }
-     mPerformanceRecorder.Start(
--        packet.dts,
-+        packet->dts,
-         nsPrintfCString("FFmpegVideoDecoder(%d)", LIBAVCODEC_VERSION_MAJOR),
-         aId, flag);
-   });
- 
- #if LIBAVCODEC_VERSION_MAJOR >= 58
--  packet.duration = aSample->mDuration.ToMicroseconds();
--  int res = mLib->avcodec_send_packet(mCodecContext, &packet);
-+  packet->duration = aSample->mDuration.ToMicroseconds();
-+  int res = mLib->avcodec_send_packet(mCodecContext, packet);
-   if (res < 0) {
-     // In theory, avcodec_send_packet could sent -EAGAIN should its internal
-     // buffers be full. In practice this can't happen as we only feed one frame
-     // at a time, and we immediately call avcodec_receive_frame right after.
-     char errStr[AV_ERROR_MAX_STRING_SIZE];
-     mLib->av_strerror(res, errStr, AV_ERROR_MAX_STRING_SIZE);
-     FFMPEG_LOG("avcodec_send_packet error: %s", errStr);
-     return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
-@@ -1151,35 +1159,35 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER
-                              "Fallback to SW decode");
-         FFMPEG_LOG("  HW decoding is slow, switch back to SW decode");
-         return MediaResult(
-             NS_ERROR_DOM_MEDIA_DECODE_ERR,
-             RESULT_DETAIL("HW decoding is slow, switch back to SW decode"));
-       }
-       if (mUsingV4L2) {
-         rv = CreateImageV4L2(mFrame->pkt_pos, GetFramePts(mFrame),
--                             mFrame->pkt_duration, aResults);
-+                             Duration(mFrame), aResults);
-       } else {
-         rv = CreateImageVAAPI(mFrame->pkt_pos, GetFramePts(mFrame),
--                              mFrame->pkt_duration, aResults);
-+                              Duration(mFrame), aResults);
-       }
- 
-       // If VA-API/V4L2 playback failed, just quit. Decoder is going to be
-       // restarted without hardware acceleration
-       if (NS_FAILED(rv)) {
-         // Explicitly remove dmabuf surface pool as it's configured
-         // for VA-API/V4L2 support.
-         mVideoFramePool = nullptr;
-         return rv;
-       }
-     } else
- #  endif
-     {
-       rv = CreateImage(mFrame->pkt_pos, GetFramePts(mFrame),
--                       mFrame->pkt_duration, aResults);
-+                       Duration(mFrame), aResults);
-     }
-     if (NS_FAILED(rv)) {
-       return rv;
-     }
- 
-     mPerformanceRecorder.Record(mFrame->pkt_dts, [&](auto& aStage) {
-       aStage.SetResolution(mFrame->width, mFrame->height);
-       auto format = [&]() -> Maybe<DecodeStage::ImageFormat> {
-@@ -1234,24 +1242,24 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER
-     return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__);
-   }
- 
-   // Required with old version of FFmpeg/LibAV
-   mFrame->reordered_opaque = AV_NOPTS_VALUE;
- 
-   int decoded;
-   int bytesConsumed =
--      mLib->avcodec_decode_video2(mCodecContext, mFrame, &decoded, &packet);
-+      mLib->avcodec_decode_video2(mCodecContext, mFrame, &decoded, packet);
- 
-   FFMPEG_LOG(
-       "DoDecodeFrame:decode_video: rv=%d decoded=%d "
-       "(Input: pts(%" PRId64 ") dts(%" PRId64 ") Output: pts(%" PRId64
-       ") "
-       "opaque(%" PRId64 ") pts(%" PRId64 ") pkt_dts(%" PRId64 "))",
--      bytesConsumed, decoded, packet.pts, packet.dts, mFrame->pts,
-+      bytesConsumed, decoded, packet->pts, packet->dts, mFrame->pts,
-       mFrame->reordered_opaque, mFrame->pts, mFrame->pkt_dts);
- 
-   if (bytesConsumed < 0) {
-     return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
-                        RESULT_DETAIL("FFmpeg video error: %d", bytesConsumed));
-   }
- 
-   if (!decoded) {
-@@ -1369,18 +1377,18 @@ gfx::ColorRange FFmpegVideoDecoder<LIBAV
- #endif
-   return GetColorRange(range);
- }
- 
- MediaResult FFmpegVideoDecoder<LIBAV_VER>::CreateImage(
-     int64_t aOffset, int64_t aPts, int64_t aDuration,
-     MediaDataDecoder::DecodedData& aResults) const {
-   FFMPEG_LOG("Got one frame output with pts=%" PRId64 " dts=%" PRId64
--             " duration=%" PRId64 " opaque=%" PRId64,
--             aPts, mFrame->pkt_dts, aDuration, mCodecContext->reordered_opaque);
-+             " duration=%" PRId64,
-+             aPts, mFrame->pkt_dts, aDuration);
- 
-   VideoData::YCbCrBuffer b;
-   b.mPlanes[0].mData = mFrame->data[0];
-   b.mPlanes[1].mData = mFrame->data[1];
-   b.mPlanes[2].mData = mFrame->data[2];
- 
-   b.mPlanes[0].mStride = mFrame->linesize[0];
-   b.mPlanes[1].mStride = mFrame->linesize[1];
-@@ -1498,18 +1506,18 @@ bool FFmpegVideoDecoder<LIBAV_VER>::GetV
-   }
-   return true;
- }
- 
- MediaResult FFmpegVideoDecoder<LIBAV_VER>::CreateImageVAAPI(
-     int64_t aOffset, int64_t aPts, int64_t aDuration,
-     MediaDataDecoder::DecodedData& aResults) {
-   FFMPEG_LOG("VA-API Got one frame output with pts=%" PRId64 " dts=%" PRId64
--             " duration=%" PRId64 " opaque=%" PRId64,
--             aPts, mFrame->pkt_dts, aDuration, mCodecContext->reordered_opaque);
-+             " duration=%" PRId64,
-+             aPts, mFrame->pkt_dts, aDuration);
- 
-   VADRMPRIMESurfaceDescriptor vaDesc;
-   if (!GetVAAPISurfaceDescriptor(&vaDesc)) {
-     return MediaResult(
-         NS_ERROR_DOM_MEDIA_DECODE_ERR,
-         RESULT_DETAIL("Unable to get frame by vaExportSurfaceHandle()"));
-   }
-   auto releaseSurfaceDescriptor = MakeScopeExit(
-@@ -1544,18 +1552,18 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER
-   aResults.AppendElement(std::move(vp));
-   return NS_OK;
- }
- 
- MediaResult FFmpegVideoDecoder<LIBAV_VER>::CreateImageV4L2(
-     int64_t aOffset, int64_t aPts, int64_t aDuration,
-     MediaDataDecoder::DecodedData& aResults) {
-   FFMPEG_LOG("V4L2 Got one frame output with pts=%" PRId64 " dts=%" PRId64
--             " duration=%" PRId64 " opaque=%" PRId64,
--             aPts, mFrame->pkt_dts, aDuration, mCodecContext->reordered_opaque);
-+             " duration=%" PRId64,
-+             aPts, mFrame->pkt_dts, aDuration);
- 
-   AVDRMFrameDescriptor* desc = (AVDRMFrameDescriptor*)mFrame->data[0];
-   if (!desc) {
-     return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR,
-                        RESULT_DETAIL("Missing DRM PRIME descriptor in frame"));
-   }
- 
-   // Note that the FDs in desc are owned by FFmpeg and it will reuse them
-diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoEncoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoEncoder.cpp
---- a/dom/media/platforms/ffmpeg/FFmpegVideoEncoder.cpp
-+++ b/dom/media/platforms/ffmpeg/FFmpegVideoEncoder.cpp
-@@ -505,17 +505,17 @@ Result<MediaDataEncoder::EncodedData, ns
- #  endif
-   mFrame->pts = aSample->mTime.ToMicroseconds();
- #  if LIBAVCODEC_VERSION_MAJOR >= 60
-   mFrame->duration = aSample->mDuration.ToMicroseconds();
- #  else
-   // Save duration in the time_base unit.
-   mDurationMap.Insert(mFrame->pts, aSample->mDuration.ToMicroseconds());
- #  endif
--  mFrame->pkt_duration = aSample->mDuration.ToMicroseconds();
-+  Duration(mFrame) = aSample->mDuration.ToMicroseconds();
- 
-   // Now send the AVFrame to ffmpeg for encoding, same code for audio and video.
-   return FFmpegDataEncoder<LIBAV_VER>::EncodeWithModernAPIs();
- }
- #endif  // if LIBAVCODEC_VERSION_MAJOR >= 58
- 
- RefPtr<MediaRawData> FFmpegVideoEncoder<LIBAV_VER>::ToMediaRawData(
-     AVPacket* aPacket) {
-
diff --git a/5759fe6ed8a5.patch b/5759fe6ed8a5.patch
deleted file mode 100644
index 8831401..0000000
--- a/5759fe6ed8a5.patch
+++ /dev/null
@@ -1,20606 +0,0 @@
-
-# HG changeset patch
-# User Paul Adenot <paul@paul.cx>
-# Date 1714486905 0
-# Node ID 5759fe6ed8a53b22ffac43c073687e127c07b0f7
-# Parent  5970587d9a7a05549c7e9f8bb5723c4e6866a3c8
-Bug 1889978 - Vendor ffmpeg master, after 7.0, update and reapply patch, remove old files, move bsf files into the bsf directory. r=media-playback-reviewers,alwu
-
-This stubs out `libavcodec/dovi_rpu.h`.
-
-Differential Revision: https://phabricator.services.mozilla.com/D206923
-
-diff --git a/config/system-headers.mozbuild b/config/system-headers.mozbuild
---- a/config/system-headers.mozbuild
-+++ b/config/system-headers.mozbuild
-@@ -407,16 +407,18 @@ system_headers = [
-     "LEditText.h",
-     "LEventDispatcher.h",
-     "LFile.h",
-     "LFileStream.h",
-     "LFileTypeList.h",
-     "LFocusBox.h",
-     "LGrafPortView.h",
-     "LHandleStream.h",
-+    "libavutil/mem.h",
-+    "libavutil/cpu.h",
-     "libc_r.h",
-     "libelf.h",
-     "libelf/libelf.h",
-     "libgen.h",
-     "libgnome/gnome-url.h",
-     "libgnome/libgnome.h",
-     "libgnomeui/gnome-icon-lookup.h",
-     "libgnomeui/gnome-icon-theme.h",
-diff --git a/media/ffvpx/README_MOZILLA b/media/ffvpx/README_MOZILLA
---- a/media/ffvpx/README_MOZILLA
-+++ b/media/ffvpx/README_MOZILLA
-@@ -31,16 +31,19 @@ Then, make sure the files:
- 
- - `libavcodec/codec_list.c`
- - `libavcodec/bsf_list.c`
- - `libavcodec/parser_list.c`
- 
- include conditional compilation directives, by probably reverting them (or
- reverting and adjusting them if new codecs are added).
- 
-+Revert and adjust libavcodec `dovi_rpu.h` so that it contains just the necessary
-+stubs to compile.
-+
- ## Add headers for a new major ffmpeg version
- 
- If a new major version of ffmpeg is being imported in the tree, it's necessary
- to vendor the new ffmpeg headers in `dom/media/platforms/ffmpeg/ffmpegxx` where
- xx is the new ffmpeg major version number, and to modify the dynamic linker
- wrapper in
- `dom/media/platforms/dom/media/platforms/ffmpeg/{FFmpegLibWrapper.cpp,FFmpegRungtimeLinker.cpp}` with the new version and the new API in this new version.
- 
-diff --git a/media/ffvpx/changes.patch b/media/ffvpx/changes.patch
---- a/media/ffvpx/changes.patch
-+++ b/media/ffvpx/changes.patch
-@@ -1,82 +1,86 @@
--diff --git a/media/ffvpx/libavutil/eval.c b/media/ffvpx/libavutil/eval.c
--index 7642b91..e938bd5 100644
----- a/media/ffvpx/libavutil/eval.c
--+++ b/media/ffvpx/libavutil/eval.c
--@@ -34,7 +34,7 @@
-- #include "internal.h"
-- #include "log.h"
-- #include "mathematics.h"
---#include "time.h"
--+#include "fftime.h"
-- #include "avstring.h"
-- #include "timer.h"
-- 
--diff --git a/media/ffvpx/libavutil/time.c b/media/ffvpx/libavutil/time.c
--index dbaee02..69419e6 100644
----- a/media/ffvpx/libavutil/time.c
--+++ b/media/ffvpx/libavutil/time.c
--@@ -33,7 +33,7 @@
-+--- a/libavutil/time.c	2024-02-14 14:57:10.389087159 +0100
-++++ b/libavutil/time.c	2024-04-05 14:43:19.097889433 +0200
-+@@ -28,17 +28,17 @@
-+ #endif
-+ #if HAVE_UNISTD_H
-+ #include <unistd.h>
-+ #endif
-+ #if HAVE_WINDOWS_H
-  #include <windows.h>
-  #endif
-  
- -#include "time.h"
- +#include "fftime.h"
-  #include "error.h"
-  
-  int64_t av_gettime(void)
--diff --git a/media/ffvpx/libavutil/parseutils.c b/media/ffvpx/libavutil/parseutils.c
--index 9fb8d0a..97ad3b9 100644
----- a/media/ffvpx/libavutil/parseutils.c
--+++ b/media/ffvpx/libavutil/parseutils.c
--@@ -28,7 +28,7 @@
-+ {
-+ #if HAVE_GETTIMEOFDAY
-+     struct timeval tv;
-+     gettimeofday(&tv, NULL);
-+     return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
-+--- a/libavutil/parseutils.c	2024-03-26 14:03:12.080640731 +0100
-++++ b/libavutil/parseutils.c	2024-04-05 14:44:56.508766832 +0200
-+@@ -23,20 +23,20 @@
-+ 
-+ #include <time.h>
-+ 
-+ #include "avstring.h"
-+ #include "avutil.h"
-  #include "common.h"
-  #include "eval.h"
-  #include "log.h"
- -#include "random_seed.h"
- +/* #include "random_seed.h" */
-  #include "time_internal.h"
-  #include "parseutils.h"
-+-#include "time.h"
-++#include "fftime.h"
-  
--@@ -367,7 +367,7 @@ int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,
-+ #ifdef TEST
-+ 
-+ #define av_get_random_seed av_get_random_seed_deterministic
-+ static uint32_t av_get_random_seed_deterministic(void);
-+ 
-+ #define av_gettime() 1331972053200000
-+ 
-+@@ -370,17 +370,17 @@
-+     av_strlcpy(color_string2, color_string + hex_offset,
-+                FFMIN(slen-hex_offset+1, sizeof(color_string2)));
-+     if ((tail = strchr(color_string2, ALPHA_SEP)))
-+         *tail++ = 0;
-+     len = strlen(color_string2);
-      rgba_color[3] = 255;
-  
-      if (!av_strcasecmp(color_string2, "random") || !av_strcasecmp(color_string2, "bikeshed")) {
- -        int rgba = av_get_random_seed();
- +        int rgba = 0xffffffff; /* av_get_random_seed(); */
-          rgba_color[0] = rgba >> 24;
-          rgba_color[1] = rgba >> 16;
-          rgba_color[2] = rgba >> 8;
--diff -up media/ffvpx/libavutil/fftime.h media/ffvpx/libavutil/fftime.h
----- media/ffvpx/libavutil/fftime.h	2021-12-06 14:51:40.378642713 +0100
--+++ media/ffvpx/libavutil/fftime.h	2021-12-06 14:51:54.618098212 +0100
--@@ -22,6 +22,7 @@
-- #define AVUTIL_TIME_H
-- 
-- #include <stdint.h>
--+#include <time.h>
-+         rgba_color[3] = rgba;
-+     } else if (hex_offset ||
-+                strspn(color_string2, "0123456789ABCDEFabcdef") == len) {
-+         char *tail;
-+         unsigned int rgba = strtoul(color_string2, &tail, 16);
-+--- a/libavutil/eval.c	2024-04-05 14:40:56.917791496 +0200
-++++ b/libavutil/eval.c	2024-04-05 17:39:45.061516936 +0200
-+@@ -31,17 +31,17 @@
-+ #include "avutil.h"
-+ #include "common.h"
-+ #include "eval.h"
-+ #include "ffmath.h"
-+ #include "log.h"
-+ #include "mathematics.h"
-+ #include "mem.h"
-+ #include "sfc64.h"
-+-#include "time.h"
-++#include "fftime.h"
-+ #include "avstring.h"
-+ #include "reverse.h"
-  
-- /**
--  * Get the current time in microseconds.
--  *
--diff --git a/media/ffvpx/compat/w32pthreads.h b/media/ffvpx/compat/w32pthreads.h
----- a/media/ffvpx/compat/w32pthreads.h
--+++ b/media/ffvpx/compat/w32pthreads.h
--@@ -39,17 +39,17 @@
-- #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"
--+#include "libavutil/fftime.h"
-- 
-- typedef struct pthread_t {
--     void *handle;
--     void *(*func)(void* arg);
--     void *arg;
--     void *ret;
-- } pthread_t;
-- 
-+ typedef struct Parser {
-+     const AVClass *class;
-+     int stack_index;
-+     char *s;
-+     const double *const_values;
-diff --git a/media/ffvpx/libavcodec/allcodecs.c b/media/ffvpx/libavcodec/allcodecs.c
---- a/media/ffvpx/libavcodec/allcodecs.c
-+++ b/media/ffvpx/libavcodec/allcodecs.c
-@@ -56,20 +56,16 @@ extern const FFCodec ff_asv2_decoder;
- extern const FFCodec ff_aura_decoder;
- extern const FFCodec ff_aura2_decoder;
- extern const FFCodec ff_avrp_encoder;
- extern const FFCodec ff_avrp_decoder;
- extern const FFCodec ff_avrn_decoder;
- extern const FFCodec ff_avs_decoder;
- extern const FFCodec ff_avui_encoder;
- extern const FFCodec ff_avui_decoder;
--#if FF_API_AYUV_CODECID
--extern const FFCodec ff_ayuv_encoder;
--extern const FFCodec ff_ayuv_decoder;
--#endif
- extern const FFCodec ff_bethsoftvid_decoder;
- extern const FFCodec ff_bfi_decoder;
- extern const FFCodec ff_bink_decoder;
- extern const FFCodec ff_bitpacked_decoder;
- extern const FFCodec ff_bitpacked_encoder;
- extern const FFCodec ff_bmp_encoder;
- extern const FFCodec ff_bmp_decoder;
- extern const FFCodec ff_bmv_video_decoder;
-@@ -147,17 +143,16 @@ extern const FFCodec ff_h261_encoder;
- extern const FFCodec ff_h261_decoder;
- extern const FFCodec ff_h263_encoder;
- extern const FFCodec ff_h263_decoder;
- extern const FFCodec ff_h263i_decoder;
- extern const FFCodec ff_h263p_encoder;
- extern const FFCodec ff_h263p_decoder;
- extern const FFCodec ff_h263_v4l2m2m_decoder;
- extern const FFCodec ff_h264_decoder;
--extern const FFCodec ff_h264_crystalhd_decoder;
- extern const FFCodec ff_h264_v4l2m2m_decoder;
- extern const FFCodec ff_h264_mediacodec_decoder;
- extern const FFCodec ff_h264_mediacodec_encoder;
- extern const FFCodec ff_h264_mmal_decoder;
- extern const FFCodec ff_h264_qsv_decoder;
- extern const FFCodec ff_h264_rkmpp_decoder;
- extern const FFCodec ff_hap_encoder;
- extern const FFCodec ff_hap_decoder;
-@@ -206,34 +201,31 @@ extern const FFCodec ff_mmvideo_decoder;
- extern const FFCodec ff_mobiclip_decoder;
- extern const FFCodec ff_motionpixels_decoder;
- extern const FFCodec ff_mpeg1video_encoder;
- extern const FFCodec ff_mpeg1video_decoder;
- extern const FFCodec ff_mpeg2video_encoder;
- extern const FFCodec ff_mpeg2video_decoder;
- extern const FFCodec ff_mpeg4_encoder;
- extern const FFCodec ff_mpeg4_decoder;
--extern const FFCodec ff_mpeg4_crystalhd_decoder;
- extern const FFCodec ff_mpeg4_v4l2m2m_decoder;
- extern const FFCodec ff_mpeg4_mmal_decoder;
- extern const FFCodec ff_mpegvideo_decoder;
- extern const FFCodec ff_mpeg1_v4l2m2m_decoder;
- extern const FFCodec ff_mpeg2_mmal_decoder;
--extern const FFCodec ff_mpeg2_crystalhd_decoder;
- extern const FFCodec ff_mpeg2_v4l2m2m_decoder;
- extern const FFCodec ff_mpeg2_qsv_decoder;
- extern const FFCodec ff_mpeg2_mediacodec_decoder;
- extern const FFCodec ff_msa1_decoder;
- extern const FFCodec ff_mscc_decoder;
- extern const FFCodec ff_msmpeg4v1_decoder;
- extern const FFCodec ff_msmpeg4v2_encoder;
- extern const FFCodec ff_msmpeg4v2_decoder;
- extern const FFCodec ff_msmpeg4v3_encoder;
- extern const FFCodec ff_msmpeg4v3_decoder;
--extern const FFCodec ff_msmpeg4_crystalhd_decoder;
- extern const FFCodec ff_msp2_decoder;
- extern const FFCodec ff_msrle_encoder;
- extern const FFCodec ff_msrle_decoder;
- extern const FFCodec ff_mss1_decoder;
- extern const FFCodec ff_mss2_decoder;
- extern const FFCodec ff_msvideo1_encoder;
- extern const FFCodec ff_msvideo1_decoder;
- extern const FFCodec ff_mszh_decoder;
-@@ -360,17 +352,16 @@ extern const FFCodec ff_v408_encoder;
- extern const FFCodec ff_v408_decoder;
- extern const FFCodec ff_v410_encoder;
- extern const FFCodec ff_v410_decoder;
- extern const FFCodec ff_vb_decoder;
- extern const FFCodec ff_vbn_encoder;
- extern const FFCodec ff_vbn_decoder;
- extern const FFCodec ff_vble_decoder;
- extern const FFCodec ff_vc1_decoder;
--extern const FFCodec ff_vc1_crystalhd_decoder;
- extern const FFCodec ff_vc1image_decoder;
- extern const FFCodec ff_vc1_mmal_decoder;
- extern const FFCodec ff_vc1_qsv_decoder;
- extern const FFCodec ff_vc1_v4l2m2m_decoder;
- extern const FFCodec ff_vc2_encoder;
- extern const FFCodec ff_vcr1_decoder;
- extern const FFCodec ff_vmdvideo_decoder;
- extern const FFCodec ff_vmix_decoder;
-@@ -397,17 +388,16 @@ extern const FFCodec ff_webp_decoder;
- extern const FFCodec ff_wcmv_decoder;
- extern const FFCodec ff_wrapped_avframe_encoder;
- extern const FFCodec ff_wrapped_avframe_decoder;
- extern const FFCodec ff_wmv1_encoder;
- extern const FFCodec ff_wmv1_decoder;
- extern const FFCodec ff_wmv2_encoder;
- extern const FFCodec ff_wmv2_decoder;
- extern const FFCodec ff_wmv3_decoder;
--extern const FFCodec ff_wmv3_crystalhd_decoder;
- extern const FFCodec ff_wmv3image_decoder;
- extern const FFCodec ff_wnv1_decoder;
- extern const FFCodec ff_xan_wc3_decoder;
- extern const FFCodec ff_xan_wc4_decoder;
- extern const FFCodec ff_xbm_encoder;
- extern const FFCodec ff_xbm_decoder;
- extern const FFCodec ff_xface_encoder;
- extern const FFCodec ff_xface_decoder;
-@@ -781,16 +771,18 @@ extern const FFCodec ff_libfdk_aac_decod
- extern const FFCodec ff_libgsm_encoder;
- extern const FFCodec ff_libgsm_decoder;
- extern const FFCodec ff_libgsm_ms_encoder;
- extern const FFCodec ff_libgsm_ms_decoder;
- extern const FFCodec ff_libilbc_encoder;
- extern const FFCodec ff_libilbc_decoder;
- extern const FFCodec ff_libjxl_decoder;
- extern const FFCodec ff_libjxl_encoder;
-+extern const FFCodec ff_liblc3_encoder;
-+extern const FFCodec ff_liblc3_decoder;
- extern const FFCodec ff_libmp3lame_encoder;
- extern const FFCodec ff_libopencore_amrnb_encoder;
- extern const FFCodec ff_libopencore_amrnb_decoder;
- extern const FFCodec ff_libopencore_amrwb_decoder;
- extern const FFCodec ff_libopenjpeg_encoder;
- extern const FFCodec ff_libopus_encoder;
- extern const FFCodec ff_libopus_decoder;
- extern const FFCodec ff_librav1e_encoder;
-diff --git a/media/ffvpx/libavcodec/atsc_a53.c b/media/ffvpx/libavcodec/atsc_a53.c
---- a/media/ffvpx/libavcodec/atsc_a53.c
-+++ b/media/ffvpx/libavcodec/atsc_a53.c
-@@ -14,16 +14,17 @@
-  * 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 <stddef.h>
- #include <stdint.h>
- 
-+#include "libavutil/mem.h"
- #include "atsc_a53.h"
- #include "get_bits.h"
- 
- int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len,
-                      void **data, size_t *sei_size)
- {
-     AVFrameSideData *side_data = NULL;
-     uint8_t *sei_data;
-diff --git a/media/ffvpx/libavcodec/audio_frame_queue.c b/media/ffvpx/libavcodec/audio_frame_queue.c
---- a/media/ffvpx/libavcodec/audio_frame_queue.c
-+++ b/media/ffvpx/libavcodec/audio_frame_queue.c
-@@ -15,17 +15,17 @@
-  * 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/common.h"
-+#include "libavutil/mem.h"
- #include "audio_frame_queue.h"
- #include "encode.h"
- #include "libavutil/avassert.h"
- 
- av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
- {
-     afq->avctx = avctx;
-     afq->remaining_delay   = avctx->initial_padding;
-diff --git a/media/ffvpx/libavcodec/av1.h b/media/ffvpx/libavcodec/av1.h
---- a/media/ffvpx/libavcodec/av1.h
-+++ b/media/ffvpx/libavcodec/av1.h
-@@ -53,16 +53,17 @@ enum {
-     AV1_FRAME_KEY        = 0,
-     AV1_FRAME_INTER      = 1,
-     AV1_FRAME_INTRA_ONLY = 2,
-     AV1_FRAME_SWITCH     = 3,
- };
- 
- // Reference frames (section 6.10.24).
- enum {
-+    AV1_REF_FRAME_NONE    = -1,
-     AV1_REF_FRAME_INTRA   = 0,
-     AV1_REF_FRAME_LAST    = 1,
-     AV1_REF_FRAME_LAST2   = 2,
-     AV1_REF_FRAME_LAST3   = 3,
-     AV1_REF_FRAME_GOLDEN  = 4,
-     AV1_REF_FRAME_BWDREF  = 5,
-     AV1_REF_FRAME_ALTREF2 = 6,
-     AV1_REF_FRAME_ALTREF  = 7,
-diff --git a/media/ffvpx/libavcodec/av1_parse.h b/media/ffvpx/libavcodec/av1_parse.h
---- a/media/ffvpx/libavcodec/av1_parse.h
-+++ b/media/ffvpx/libavcodec/av1_parse.h
-@@ -25,16 +25,17 @@
- #include <stdint.h>
- 
- #include "libavutil/error.h"
- #include "libavutil/intmath.h"
- #include "libavutil/macros.h"
- 
- #include "av1.h"
- #include "get_bits.h"
-+#include "leb.h"
- 
- // OBU header fields + max leb128 length
- #define MAX_OBU_HEADER_SIZE (2 + 8)
- 
- typedef struct AV1OBU {
-     /** Size of payload */
-     int size;
-     const uint8_t *data;
-@@ -83,29 +84,16 @@ int ff_av1_extract_obu(AV1OBU *obu, cons
- int ff_av1_packet_split(AV1Packet *pkt, const uint8_t *buf, int length,
-                         void *logctx);
- 
- /**
-  * Free all the allocated memory in the packet.
-  */
- void ff_av1_packet_uninit(AV1Packet *pkt);
- 
--static inline int64_t leb128(GetBitContext *gb) {
--    int64_t ret = 0;
--    int i;
--
--    for (i = 0; i < 8; i++) {
--        int byte = get_bits(gb, 8);
--        ret |= (int64_t)(byte & 0x7f) << (i * 7);
--        if (!(byte & 0x80))
--            break;
--    }
--    return ret;
--}
--
- static inline int parse_obu_header(const uint8_t *buf, int buf_size,
-                                    int64_t *obu_size, int *start_pos, int *type,
-                                    int *temporal_id, int *spatial_id)
- {
-     GetBitContext gb;
-     int ret, extension_flag, has_size_flag;
-     int64_t size;
- 
-@@ -124,17 +112,17 @@ static inline int parse_obu_header(const
-     if (extension_flag) {
-         *temporal_id = get_bits(&gb, 3);
-         *spatial_id  = get_bits(&gb, 2);
-         skip_bits(&gb, 3); // extension_header_reserved_3bits
-     } else {
-         *temporal_id = *spatial_id = 0;
-     }
- 
--    *obu_size  = has_size_flag ? leb128(&gb)
-+    *obu_size  = has_size_flag ? get_leb128(&gb)
-                                : buf_size - 1 - extension_flag;
- 
-     if (get_bits_left(&gb) < 0)
-         return AVERROR_INVALIDDATA;
- 
-     *start_pos = get_bits_count(&gb) / 8;
- 
-     size = *obu_size + *start_pos;
-diff --git a/media/ffvpx/libavcodec/av1dec.c b/media/ffvpx/libavcodec/av1dec.c
---- a/media/ffvpx/libavcodec/av1dec.c
-+++ b/media/ffvpx/libavcodec/av1dec.c
-@@ -18,27 +18,29 @@
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-  */
- 
- #include "config_components.h"
- 
- #include "libavutil/hdr_dynamic_metadata.h"
- #include "libavutil/film_grain_params.h"
- #include "libavutil/mastering_display_metadata.h"
-+#include "libavutil/mem.h"
- #include "libavutil/pixdesc.h"
- #include "libavutil/opt.h"
- #include "avcodec.h"
- #include "av1_parse.h"
- #include "av1dec.h"
- #include "atsc_a53.h"
- #include "bytestream.h"
- #include "codec_internal.h"
- #include "decode.h"
- #include "hwaccel_internal.h"
- #include "internal.h"
-+#include "itut35.h"
- #include "hwconfig.h"
- #include "profiles.h"
- #include "refstruct.h"
- #include "thread.h"
- 
- /**< same with Div_Lut defined in spec 7.11.3.7 */
- static const uint16_t div_lut[AV1_DIV_LUT_NUM] = {
-   16384, 16320, 16257, 16194, 16132, 16070, 16009, 15948, 15888, 15828, 15768,
-@@ -615,16 +617,22 @@ static int get_pixel_format(AVCodecConte
-         *fmtp++ = AV_PIX_FMT_CUDA;
- #endif
-         break;
-     }
- 
-     *fmtp++ = pix_fmt;
-     *fmtp = AV_PIX_FMT_NONE;
- 
-+    for (int i = 0; pix_fmts[i] != pix_fmt; i++)
-+        if (pix_fmts[i] == avctx->pix_fmt) {
-+            s->pix_fmt = pix_fmt;
-+            return 1;
-+        }
-+
-     ret = ff_get_format(avctx, pix_fmts);
- 
-     /**
-      * check if the HW accel is inited correctly. If not, return un-implemented.
-      * Since now the av1 decoder doesn't support native decode, if it will be
-      * implemented in the future, need remove this check.
-      */
-     if (!avctx->hwaccel) {
-@@ -710,45 +718,47 @@ static av_cold int av1_decode_free(AVCod
-             av1_frame_unref(&s->ref[i]);
-             av_frame_free(&s->ref[i].f);
-         }
-     }
-     if (s->cur_frame.f) {
-         av1_frame_unref(&s->cur_frame);
-         av_frame_free(&s->cur_frame.f);
-     }
-+    av_buffer_unref(&s->seq_data_ref);
-     ff_refstruct_unref(&s->seq_ref);
-     ff_refstruct_unref(&s->header_ref);
-     ff_refstruct_unref(&s->cll_ref);
-     ff_refstruct_unref(&s->mdcv_ref);
-     av_freep(&s->tile_group_info);
- 
-     while (s->itut_t35_fifo && av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0)
-         av_buffer_unref(&itut_t35.payload_ref);
-     av_fifo_freep2(&s->itut_t35_fifo);
- 
-     ff_cbs_fragment_free(&s->current_obu);
-     ff_cbs_close(&s->cbc);
-+    ff_dovi_ctx_unref(&s->dovi);
- 
-     return 0;
- }
- 
- static int set_context_with_sequence(AVCodecContext *avctx,
-                                      const AV1RawSequenceHeader *seq)
- {
-     int width = seq->max_frame_width_minus_1 + 1;
-     int height = seq->max_frame_height_minus_1 + 1;
- 
-     avctx->profile = seq->seq_profile;
-     avctx->level = seq->seq_level_idx[0];
- 
-     avctx->color_range =
-         seq->color_config.color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
-     avctx->color_primaries = seq->color_config.color_primaries;
--    avctx->colorspace = seq->color_config.color_primaries;
-+    avctx->colorspace = seq->color_config.matrix_coefficients;
-     avctx->color_trc = seq->color_config.transfer_characteristics;
- 
-     switch (seq->color_config.chroma_sample_position) {
-     case AV1_CSP_VERTICAL:
-         avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
-         break;
-     case AV1_CSP_COLOCATED:
-         avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
-@@ -766,16 +776,19 @@ static int set_context_with_sequence(AVC
-             return ret;
-     }
- 
-     if (seq->timing_info_present_flag)
-         avctx->framerate = ff_av1_framerate(1LL + seq->timing_info.num_ticks_per_picture_minus_1,
-                                             seq->timing_info.num_units_in_display_tick,
-                                             seq->timing_info.time_scale);
- 
-+    if (avctx->pix_fmt == AV_PIX_FMT_NONE)
-+        avctx->pix_fmt = get_sw_pixel_format(avctx, seq);
-+
-     return 0;
- }
- 
- static int update_context_with_frame_header(AVCodecContext *avctx,
-                                             const AV1RawFrameHeader *header)
- {
-     AVRational aspect_ratio;
-     int width = header->frame_width_minus_1 + 1;
-@@ -813,16 +826,17 @@ static const CodedBitstreamUnitType deco
-     AV1_OBU_TEMPORAL_DELIMITER,
-     AV1_OBU_TILE_GROUP,
- };
- 
- static av_cold int av1_decode_init(AVCodecContext *avctx)
- {
-     AV1DecContext *s = avctx->priv_data;
-     AV1RawSequenceHeader *seq;
-+    const AVPacketSideData *sd;
-     int ret;
- 
-     s->avctx = avctx;
-     s->pkt = avctx->internal->in_pkt;
-     s->pix_fmt = AV_PIX_FMT_NONE;
- 
-     for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++) {
-         s->ref[i].f = av_frame_alloc();
-@@ -864,22 +878,26 @@ static av_cold int av1_decode_init(AVCod
-         }
- 
-         ret = set_context_with_sequence(avctx, seq);
-         if (ret < 0) {
-             av_log(avctx, AV_LOG_WARNING, "Failed to set decoder context.\n");
-             goto end;
-         }
- 
--        avctx->pix_fmt = get_sw_pixel_format(avctx, seq);
--
-         end:
-         ff_cbs_fragment_reset(&s->current_obu);
-     }
- 
-+    s->dovi.logctx = avctx;
-+    s->dovi.dv_profile = 10; // default for AV1
-+    sd = ff_get_coded_side_data(avctx, AV_PKT_DATA_DOVI_CONF);
-+    if (sd && sd->size > 0)
-+        ff_dovi_update_cfg(&s->dovi, (AVDOVIDecoderConfigurationRecord *) sd->data);
-+
-     return ret;
- }
- 
- static int av1_frame_alloc(AVCodecContext *avctx, AV1Frame *f)
- {
-     AV1DecContext *s = avctx->priv_data;
-     AV1RawFrameHeader *header= s->raw_frame_header;
-     AVFrame *frame;
-@@ -923,130 +941,168 @@ fail:
-     av1_frame_unref(f);
-     return ret;
- }
- 
- static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame,
-                            const AV1RawMetadataITUTT35 *itut_t35)
- {
-     GetByteContext gb;
-+    AV1DecContext *s = avctx->priv_data;
-     int ret, provider_code;
- 
-     bytestream2_init(&gb, itut_t35->payload, itut_t35->payload_size);
- 
-     provider_code = bytestream2_get_be16(&gb);
-     switch (provider_code) {
--    case 0x31: { // atsc_provider_code
-+    case ITU_T_T35_PROVIDER_CODE_ATSC: {
-         uint32_t user_identifier = bytestream2_get_be32(&gb);
-         switch (user_identifier) {
-         case MKBETAG('G', 'A', '9', '4'): { // closed captions
-             AVBufferRef *buf = NULL;
- 
-             ret = ff_parse_a53_cc(&buf, gb.buffer, bytestream2_get_bytes_left(&gb));
-             if (ret < 0)
-                 return ret;
-             if (!ret)
-                 break;
- 
--            if (!av_frame_new_side_data_from_buf(frame, AV_FRAME_DATA_A53_CC, buf))
--                av_buffer_unref(&buf);
-+            ret = ff_frame_new_side_data_from_buf(avctx, frame, AV_FRAME_DATA_A53_CC, &buf, NULL);
-+            if (ret < 0)
-+                return ret;
- 
-             avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
-             break;
-         }
-         default: // ignore unsupported identifiers
-             break;
-         }
-         break;
-     }
--    case 0x3C: { // smpte_provider_code
-+    case ITU_T_T35_PROVIDER_CODE_SMTPE: {
-         AVDynamicHDRPlus *hdrplus;
-         int provider_oriented_code = bytestream2_get_be16(&gb);
-         int application_identifier = bytestream2_get_byte(&gb);
- 
--        if (itut_t35->itu_t_t35_country_code != 0xB5 ||
-+        if (itut_t35->itu_t_t35_country_code != ITU_T_T35_COUNTRY_CODE_US ||
-             provider_oriented_code != 1 || application_identifier != 4)
-             break;
- 
-         hdrplus = av_dynamic_hdr_plus_create_side_data(frame);
-         if (!hdrplus)
-             return AVERROR(ENOMEM);
- 
-         ret = av_dynamic_hdr_plus_from_t35(hdrplus, gb.buffer,
-                                            bytestream2_get_bytes_left(&gb));
-         if (ret < 0)
-             return ret;
-         break;
-     }
-+    case ITU_T_T35_PROVIDER_CODE_DOLBY: {
-+        int provider_oriented_code = bytestream2_get_be32(&gb);
-+        if (itut_t35->itu_t_t35_country_code != ITU_T_T35_COUNTRY_CODE_US ||
-+            provider_oriented_code != 0x800)
-+            break;
-+
-+        ret = ff_dovi_rpu_parse(&s->dovi, gb.buffer, gb.buffer_end - gb.buffer,
-+                                avctx->err_recognition);
-+        if (ret < 0) {
-+            av_log(avctx, AV_LOG_WARNING, "Error parsing DOVI OBU.\n");
-+            break; // ignore
-+        }
-+
-+        ret = ff_dovi_attach_side_data(&s->dovi, frame);
-+        if (ret < 0)
-+            return ret;
-+        break;
-+    }
-     default: // ignore unsupported provider codes
-         break;
-     }
- 
-     return 0;
- }
- 
- static int export_metadata(AVCodecContext *avctx, AVFrame *frame)
- {
-     AV1DecContext *s = avctx->priv_data;
-     AV1RawMetadataITUTT35 itut_t35;
-     int ret = 0;
- 
-     if (s->mdcv) {
--        AVMasteringDisplayMetadata *mastering = av_mastering_display_metadata_create_side_data(frame);
--        if (!mastering)
--            return AVERROR(ENOMEM);
-+        AVMasteringDisplayMetadata *mastering;
-+
-+        ret = ff_decode_mastering_display_new(avctx, frame, &mastering);
-+        if (ret < 0)
-+            return ret;
- 
--        for (int i = 0; i < 3; i++) {
--            mastering->display_primaries[i][0] = av_make_q(s->mdcv->primary_chromaticity_x[i], 1 << 16);
--            mastering->display_primaries[i][1] = av_make_q(s->mdcv->primary_chromaticity_y[i], 1 << 16);
-+        if (mastering) {
-+            for (int i = 0; i < 3; i++) {
-+                mastering->display_primaries[i][0] = av_make_q(s->mdcv->primary_chromaticity_x[i], 1 << 16);
-+                mastering->display_primaries[i][1] = av_make_q(s->mdcv->primary_chromaticity_y[i], 1 << 16);
-+            }
-+            mastering->white_point[0] = av_make_q(s->mdcv->white_point_chromaticity_x, 1 << 16);
-+            mastering->white_point[1] = av_make_q(s->mdcv->white_point_chromaticity_y, 1 << 16);
-+
-+            mastering->max_luminance = av_make_q(s->mdcv->luminance_max, 1 << 8);
-+            mastering->min_luminance = av_make_q(s->mdcv->luminance_min, 1 << 14);
-+
-+            mastering->has_primaries = 1;
-+            mastering->has_luminance = 1;
-         }
--        mastering->white_point[0] = av_make_q(s->mdcv->white_point_chromaticity_x, 1 << 16);
--        mastering->white_point[1] = av_make_q(s->mdcv->white_point_chromaticity_y, 1 << 16);
--
--        mastering->max_luminance = av_make_q(s->mdcv->luminance_max, 1 << 8);
--        mastering->min_luminance = av_make_q(s->mdcv->luminance_min, 1 << 14);
--
--        mastering->has_primaries = 1;
--        mastering->has_luminance = 1;
-     }
- 
-     if (s->cll) {
--        AVContentLightMetadata *light = av_content_light_metadata_create_side_data(frame);
--        if (!light)
--            return AVERROR(ENOMEM);
-+        AVContentLightMetadata *light;
- 
--        light->MaxCLL = s->cll->max_cll;
--        light->MaxFALL = s->cll->max_fall;
-+        ret = ff_decode_content_light_new(avctx, frame, &light);
-+        if (ret < 0)
-+            return ret;
-+
-+        if (light) {
-+            light->MaxCLL = s->cll->max_cll;
-+            light->MaxFALL = s->cll->max_fall;
-+        }
-     }
- 
-     while (av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0) {
-         if (ret >= 0)
-             ret = export_itut_t35(avctx, frame, &itut_t35);
-         av_buffer_unref(&itut_t35.payload_ref);
-     }
- 
-     return ret;
- }
- 
- static int export_film_grain(AVCodecContext *avctx, AVFrame *frame)
- {
-     AV1DecContext *s = avctx->priv_data;
-     const AV1RawFilmGrainParams *film_grain = &s->cur_frame.film_grain;
-+    const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(frame->format);
-     AVFilmGrainParams *fgp;
-     AVFilmGrainAOMParams *aom;
- 
-+    av_assert0(pixdesc);
-     if (!film_grain->apply_grain)
-         return 0;
- 
-     fgp = av_film_grain_params_create_side_data(frame);
-     if (!fgp)
-         return AVERROR(ENOMEM);
- 
-     fgp->type = AV_FILM_GRAIN_PARAMS_AV1;
-     fgp->seed = film_grain->grain_seed;
-+    fgp->width = frame->width;
-+    fgp->height = frame->height;
-+    fgp->color_range = frame->color_range;
-+    fgp->color_primaries = frame->color_primaries;
-+    fgp->color_trc = frame->color_trc;
-+    fgp->color_space = frame->colorspace;
-+    fgp->subsampling_x = pixdesc->log2_chroma_w;
-+    fgp->subsampling_y = pixdesc->log2_chroma_h;
- 
-     aom = &fgp->codec.aom;
-     aom->chroma_scaling_from_luma = film_grain->chroma_scaling_from_luma;
-     aom->scaling_shift = film_grain->grain_scaling_minus_8 + 8;
-     aom->ar_coeff_lag = film_grain->ar_coeff_lag;
-     aom->ar_coeff_shift = film_grain->ar_coeff_shift_minus_6 + 6;
-     aom->grain_scale_shift = film_grain->grain_scale_shift;
-     aom->overlap_flag = film_grain->overlap_flag;
-@@ -1169,16 +1225,33 @@ static int get_current_frame(AVCodecCont
-     if ((avctx->skip_frame >= AVDISCARD_NONINTRA &&
-             (s->raw_frame_header->frame_type != AV1_FRAME_KEY &&
-              s->raw_frame_header->frame_type != AV1_FRAME_INTRA_ONLY)) ||
-         (avctx->skip_frame >= AVDISCARD_NONKEY   &&
-              s->raw_frame_header->frame_type != AV1_FRAME_KEY) ||
-         avctx->skip_frame >= AVDISCARD_ALL)
-         return 0;
- 
-+    if (s->pix_fmt == AV_PIX_FMT_NONE) {
-+        ret = get_pixel_format(avctx);
-+        if (ret < 0) {
-+            av_log(avctx, AV_LOG_ERROR, "Failed to get pixel format.\n");
-+            return ret;
-+        }
-+
-+        if (!ret && FF_HW_HAS_CB(avctx, decode_params)) {
-+            ret = FF_HW_CALL(avctx, decode_params, AV1_OBU_SEQUENCE_HEADER,
-+                             s->seq_data_ref->data, s->seq_data_ref->size);
-+            if (ret < 0) {
-+                av_log(avctx, AV_LOG_ERROR, "HW accel decode params fail.\n");
-+                return ret;
-+            }
-+        }
-+    }
-+
-     ret = av1_frame_alloc(avctx, &s->cur_frame);
-     if (ret < 0) {
-         av_log(avctx, AV_LOG_ERROR,
-                "Failed to allocate space for current frame.\n");
-         return ret;
-     }
- 
-     global_motion_params(s);
-@@ -1195,56 +1268,52 @@ static int av1_receive_frame_internal(AV
-     AV1RawTileGroup *raw_tile_group = NULL;
-     int i = 0, ret;
- 
-     for (i = s->nb_unit; i < s->current_obu.nb_units; i++) {
-         CodedBitstreamUnit *unit = &s->current_obu.units[i];
-         AV1RawOBU *obu = unit->content;
-         const AV1RawOBUHeader *header;
- 
-+        av_log(avctx, AV_LOG_DEBUG, "OBU idx:%d, type:%d, content available:%d.\n", i, unit->type, !!obu);
-+
-+        if (unit->type == AV1_OBU_TILE_LIST) {
-+            av_log(avctx, AV_LOG_ERROR, "Large scale tile decoding is unsupported.\n");
-+            ret = AVERROR_PATCHWELCOME;
-+            goto end;
-+        }
-+
-         if (!obu)
-             continue;
- 
-         header = &obu->header;
--        av_log(avctx, AV_LOG_DEBUG, "Obu idx:%d, obu type:%d.\n", i, unit->type);
- 
-         switch (unit->type) {
-         case AV1_OBU_SEQUENCE_HEADER:
-+            ret = av_buffer_replace(&s->seq_data_ref, unit->data_ref);
-+            if (ret < 0)
-+                goto end;
-+
-+            s->seq_data_ref->data = unit->data;
-+            s->seq_data_ref->size = unit->data_size;
-             ff_refstruct_replace(&s->seq_ref, unit->content_ref);
- 
-             s->raw_seq = &obu->obu.sequence_header;
- 
-             ret = set_context_with_sequence(avctx, s->raw_seq);
-             if (ret < 0) {
-                 av_log(avctx, AV_LOG_ERROR, "Failed to set context.\n");
-                 s->raw_seq = NULL;
-                 goto end;
-             }
- 
-             s->operating_point_idc = s->raw_seq->operating_point_idc[s->operating_point];
- 
--            if (s->pix_fmt == AV_PIX_FMT_NONE) {
--                ret = get_pixel_format(avctx);
--                if (ret < 0) {
--                    av_log(avctx, AV_LOG_ERROR,
--                           "Failed to get pixel format.\n");
--                    s->raw_seq = NULL;
--                    goto end;
--                }
--            }
-+            s->pix_fmt = AV_PIX_FMT_NONE;
- 
--            if (FF_HW_HAS_CB(avctx, decode_params)) {
--                ret = FF_HW_CALL(avctx, decode_params, unit->type,
--                                 unit->data, unit->data_size);
--                if (ret < 0) {
--                    av_log(avctx, AV_LOG_ERROR, "HW accel decode params fail.\n");
--                    s->raw_seq = NULL;
--                    goto end;
--                }
--            }
-             break;
-         case AV1_OBU_REDUNDANT_FRAME_HEADER:
-             if (s->raw_frame_header)
-                 break;
-         // fall-through
-         case AV1_OBU_FRAME:
-         case AV1_OBU_FRAME_HEADER:
-             if (!s->raw_seq) {
-@@ -1411,16 +1480,18 @@ end:
- 
-     if ((ret < 0 && ret != AVERROR(EAGAIN)) || s->current_obu.nb_units == i) {
-         if (ret < 0)
-             s->raw_frame_header = NULL;
-         av_packet_unref(s->pkt);
-         ff_cbs_fragment_reset(&s->current_obu);
-         s->nb_unit = 0;
-     }
-+    if (!ret && !frame->buf[0])
-+        ret = AVERROR(EAGAIN);
- 
-     return ret;
- }
- 
- static int av1_receive_frame(AVCodecContext *avctx, AVFrame *frame)
- {
-     AV1DecContext *s = avctx->priv_data;
-     int ret;
-@@ -1495,17 +1566,17 @@ const FFCodec ff_av1_decoder = {
-     CODEC_LONG_NAME("Alliance for Open Media AV1"),
-     .p.type                = AVMEDIA_TYPE_VIDEO,
-     .p.id                  = AV_CODEC_ID_AV1,
-     .priv_data_size        = sizeof(AV1DecContext),
-     .init                  = av1_decode_init,
-     .close                 = av1_decode_free,
-     FF_CODEC_RECEIVE_FRAME_CB(av1_receive_frame),
-     .p.capabilities        = AV_CODEC_CAP_DR1,
--    .caps_internal         = FF_CODEC_CAP_INIT_CLEANUP,
-+    .caps_internal         = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
-     .flush                 = av1_decode_flush,
-     .p.profiles            = NULL_IF_CONFIG_SMALL(ff_av1_profiles),
-     .p.priv_class          = &av1_class,
-     .hw_configs            = (const AVCodecHWConfigInternal *const []) {
- #if CONFIG_AV1_DXVA2_HWACCEL
-         HWACCEL_DXVA2(av1),
- #endif
- #if CONFIG_AV1_D3D11VA_HWACCEL
-diff --git a/media/ffvpx/libavcodec/av1dec.h b/media/ffvpx/libavcodec/av1dec.h
---- a/media/ffvpx/libavcodec/av1dec.h
-+++ b/media/ffvpx/libavcodec/av1dec.h
-@@ -18,23 +18,25 @@
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-  */
- 
- #ifndef AVCODEC_AV1DEC_H
- #define AVCODEC_AV1DEC_H
- 
- #include <stdint.h>
- 
-+#include "libavutil/buffer.h"
- #include "libavutil/fifo.h"
- #include "libavutil/frame.h"
- #include "libavutil/pixfmt.h"
- #include "avcodec.h"
- #include "packet.h"
- #include "cbs.h"
- #include "cbs_av1.h"
-+#include "dovi_rpu.h"
- 
- typedef struct AV1Frame {
-     AVFrame *f;
- 
-     void *hwaccel_picture_private; ///< RefStruct reference
- 
-     AV1RawOBU *header_ref; ///< RefStruct reference backing raw_frame_header.
-     AV1RawFrameHeader *raw_frame_header;
-@@ -64,26 +66,28 @@ typedef struct AV1DecContext {
-     const AVClass *class;
-     AVCodecContext *avctx;
- 
-     enum AVPixelFormat pix_fmt;
-     CodedBitstreamContext *cbc;
-     CodedBitstreamFragment current_obu;
-     AVPacket *pkt;
- 
-+    AVBufferRef *seq_data_ref;
-     AV1RawOBU *seq_ref;    ///< RefStruct reference backing raw_seq
-     AV1RawSequenceHeader *raw_seq;
-     AV1RawOBU *header_ref; ///< RefStruct reference backing raw_frame_header
-     AV1RawFrameHeader *raw_frame_header;
-     TileGroupInfo *tile_group_info;
- 
-     AV1RawOBU *cll_ref;    ///< RefStruct reference backing cll
-     AV1RawMetadataHDRCLL *cll;
-     AV1RawOBU *mdcv_ref;   ///< RefStruct reference backing mdcv
-     AV1RawMetadataHDRMDCV *mdcv;
-+    DOVIContext dovi;
-     AVFifo *itut_t35_fifo;
- 
-     uint16_t tile_num;
-     uint16_t tg_start;
-     uint16_t tg_end;
- 
-     int operating_point_idc;
- 
-diff --git a/media/ffvpx/libavcodec/avcodec.c b/media/ffvpx/libavcodec/avcodec.c
---- a/media/ffvpx/libavcodec/avcodec.c
-+++ b/media/ffvpx/libavcodec/avcodec.c
-@@ -49,16 +49,30 @@
- 
- /**
-  * Maximum size in bytes of extradata.
-  * This value was chosen such that every bit of the buffer is
-  * addressable by a 32-bit signed integer as used by get_bits.
-  */
- #define FF_MAX_EXTRADATA_SIZE ((1 << 28) - AV_INPUT_BUFFER_PADDING_SIZE)
- 
-+const SideDataMap ff_sd_global_map[] = {
-+    { AV_PKT_DATA_REPLAYGAIN ,                AV_FRAME_DATA_REPLAYGAIN },
-+    { AV_PKT_DATA_DISPLAYMATRIX,              AV_FRAME_DATA_DISPLAYMATRIX },
-+    { AV_PKT_DATA_SPHERICAL,                  AV_FRAME_DATA_SPHERICAL },
-+    { AV_PKT_DATA_STEREO3D,                   AV_FRAME_DATA_STEREO3D },
-+    { AV_PKT_DATA_AUDIO_SERVICE_TYPE,         AV_FRAME_DATA_AUDIO_SERVICE_TYPE },
-+    { 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_ICC_PROFILE,                AV_FRAME_DATA_ICC_PROFILE },
-+    { AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT,AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT },
-+    { AV_PKT_DATA_NB },
-+};
-+
-+
- int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2), void *arg, int *ret, int count, int size)
- {
-     size_t i;
- 
-     for (i = 0; i < count; i++) {
-         size_t offset = i * size;
-         int r = func(c, FF_PTR_ADD((char *)arg, offset));
-         if (ret)
-@@ -236,36 +250,16 @@ int attribute_align_arg avcodec_open2(AV
-         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;
-     }
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    /* compat wrapper for old-style callers */
--    if (avctx->channel_layout && !avctx->channels)
--        avctx->channels = av_popcount64(avctx->channel_layout);
--
--    if ((avctx->channels && avctx->ch_layout.nb_channels != avctx->channels) ||
--        (avctx->channel_layout && (avctx->ch_layout.order != AV_CHANNEL_ORDER_NATIVE ||
--                                   avctx->ch_layout.u.mask != avctx->channel_layout))) {
--        av_channel_layout_uninit(&avctx->ch_layout);
--        if (avctx->channel_layout) {
--            av_channel_layout_from_mask(&avctx->ch_layout, avctx->channel_layout);
--        } else {
--            avctx->ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
--        }
--        avctx->ch_layout.nb_channels = avctx->channels;
--    }
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
-     /* AV_CODEC_CAP_CHANNEL_CONF is a decoder-only flag; so the code below
-      * in particular checks that nb_channels is set for all audio encoders. */
-     if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && !avctx->ch_layout.nb_channels
-         && !(codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)) {
-         av_log(avctx, AV_LOG_ERROR, "%s requires channel layout to be set\n",
-                av_codec_is_decoder(codec) ? "Decoder" : "Encoder");
-         ret = AVERROR(EINVAL);
-         goto free_and_end;
-@@ -277,21 +271,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
-     }
-     if (avctx->ch_layout.nb_channels > FF_SANE_NB_CHANNELS) {
-         av_log(avctx, AV_LOG_ERROR, "Too many channels: %d\n", avctx->ch_layout.nb_channels);
-         ret = AVERROR(EINVAL);
-         goto free_and_end;
-     }
- 
-     avctx->frame_num = 0;
--#if FF_API_AVCTX_FRAME_NUMBER
--FF_DISABLE_DEPRECATION_WARNINGS
--    avctx->frame_number = avctx->frame_num;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     avctx->codec_descriptor = avcodec_descriptor_get(avctx->codec_id);
- 
-     if ((avctx->codec->capabilities & AV_CODEC_CAP_EXPERIMENTAL) &&
-         avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
-         const char *codec_string = av_codec_is_encoder(codec) ? "encoder" : "decoder";
-         const AVCodec *codec2;
-         av_log(avctx, AV_LOG_ERROR,
-                "The %s '%s' is experimental but experimental codecs are not enabled, "
-@@ -345,25 +334,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
-     }
- 
-     ret=0;
- 
-     if (av_codec_is_decoder(avctx->codec)) {
-         if (!avctx->bit_rate)
-             avctx->bit_rate = get_bit_rate(avctx);
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--        /* update the deprecated fields for old-style callers */
--        avctx->channels = avctx->ch_layout.nb_channels;
--        avctx->channel_layout = avctx->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
--                                avctx->ch_layout.u.mask : 0;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
-         /* validate channel layout from the decoder */
-         if ((avctx->ch_layout.nb_channels && !av_channel_layout_check(&avctx->ch_layout)) ||
-             avctx->ch_layout.nb_channels > FF_SANE_NB_CHANNELS) {
-             ret = AVERROR(EINVAL);
-             goto free_and_end;
-         }
-         if (avctx->bits_per_coded_sample < 0) {
-             ret = AVERROR(EINVAL);
-@@ -372,17 +352,17 @@ FF_ENABLE_DEPRECATION_WARNINGS
-     }
-     if (codec->priv_class)
-         av_assert0(*(const AVClass **)avctx->priv_data == codec->priv_class);
- 
- end:
- 
-     return ret;
- free_and_end:
--    avcodec_close(avctx);
-+    ff_codec_close(avctx);
-     goto end;
- }
- 
- void avcodec_flush_buffers(AVCodecContext *avctx)
- {
-     AVCodecInternal *avci = avctx->internal;
- 
-     if (av_codec_is_encoder(avctx->codec)) {
-@@ -427,22 +407,22 @@ void avsubtitle_free(AVSubtitle *sub)
-         av_freep(&sub->rects[i]);
-     }
- 
-     av_freep(&sub->rects);
- 
-     memset(sub, 0, sizeof(*sub));
- }
- 
--av_cold int avcodec_close(AVCodecContext *avctx)
-+av_cold void ff_codec_close(AVCodecContext *avctx)
- {
-     int i;
- 
-     if (!avctx)
--        return 0;
-+        return;
- 
-     if (avcodec_is_open(avctx)) {
-         AVCodecInternal *avci = avctx->internal;
- 
-         if (CONFIG_FRAME_THREAD_ENCODER &&
-             avci->frame_thread_encoder && avctx->thread_count > 1) {
-             ff_frame_thread_encoder_free(avctx);
-         }
-@@ -492,19 +472,25 @@ av_cold int avcodec_close(AVCodecContext
-     if (av_codec_is_encoder(avctx->codec)) {
-         av_freep(&avctx->extradata);
-         avctx->extradata_size = 0;
-     } else if (av_codec_is_decoder(avctx->codec))
-         av_freep(&avctx->subtitle_header);
- 
-     avctx->codec = NULL;
-     avctx->active_thread_type = 0;
-+}
- 
-+#if FF_API_AVCODEC_CLOSE
-+int avcodec_close(AVCodecContext *avctx)
-+{
-+    ff_codec_close(avctx);
-     return 0;
- }
-+#endif
- 
- static const char *unknown_if_null(const char *str)
- {
-     return str ? str : "unknown";
- }
- 
- void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
- {
-@@ -614,16 +600,17 @@ void avcodec_string(char *buf, int buf_s
-             }
-         }
- 
-         if (enc->width) {
-             av_bprintf(&bprint, "%s%dx%d", new_line ? separator : ", ",
-                        enc->width, enc->height);
- 
-             if (av_log_get_level() >= AV_LOG_VERBOSE &&
-+                enc->coded_width && enc->coded_height &&
-                 (enc->width != enc->coded_width ||
-                  enc->height != enc->coded_height))
-                 av_bprintf(&bprint, " (%dx%d)",
-                            enc->coded_width, enc->coded_height);
- 
-             if (enc->sample_aspect_ratio.num) {
-                 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
-                           enc->width * (int64_t)enc->sample_aspect_ratio.num,
-diff --git a/media/ffvpx/libavcodec/avcodec.h b/media/ffvpx/libavcodec/avcodec.h
---- a/media/ffvpx/libavcodec/avcodec.h
-+++ b/media/ffvpx/libavcodec/avcodec.h
-@@ -182,22 +182,26 @@ struct AVCodecParameters;
-  * @defgroup lavc_core Core functions/structures.
-  * @ingroup libavc
-  *
-  * Basic definitions, functions for querying libavcodec capabilities,
-  * allocating core structures, etc.
-  * @{
-  */
- 
-+#if FF_API_BUFFER_MIN_SIZE
- /**
-  * @ingroup lavc_encoding
-  * minimum encoding buffer size
-  * Used to avoid some checks during header writing.
-+ * @deprecated Unused: avcodec_receive_packet() does not work
-+ *             with preallocated packet buffers.
-  */
- #define AV_INPUT_BUFFER_MIN_SIZE 16384
-+#endif
- 
- /**
-  * @ingroup lavc_encoding
-  */
- typedef struct RcOverride{
-     int start_frame;
-     int end_frame;
-     int qscale; // If this is 0 then quality_factor will be used instead.
-@@ -486,39 +490,16 @@ typedef struct AVCodecContext {
-      * the average bitrate
-      * - encoding: Set by user; unused for constant quantizer encoding.
-      * - decoding: Set by user, may be overwritten by libavcodec
-      *             if this info is available in the stream
-      */
-     int64_t bit_rate;
- 
-     /**
--     * number of bits the bitstream is allowed to diverge from the reference.
--     *           the reference can be CBR (for CBR pass1) or VBR (for pass2)
--     * - encoding: Set by user; unused for constant quantizer encoding.
--     * - decoding: unused
--     */
--    int bit_rate_tolerance;
--
--    /**
--     * Global quality for codecs which cannot change it per frame.
--     * This should be proportional to MPEG-1/2/4 qscale.
--     * - encoding: Set by user.
--     * - decoding: unused
--     */
--    int global_quality;
--
--    /**
--     * - encoding: Set by user.
--     * - decoding: unused
--     */
--    int compression_level;
--#define FF_COMPRESSION_DEFAULT -1
--
--    /**
-      * AV_CODEC_FLAG_*.
-      * - encoding: Set by user.
-      * - decoding: Set by user.
-      */
-     int flags;
- 
-     /**
-      * AV_CODEC_FLAG2_*
-@@ -557,16 +538,32 @@ typedef struct AVCodecContext {
-      * vop_time_increment_resolution and fixed_vop_rate
-      * (fixed_vop_rate == 0 implies that it is different from the framerate)
-      *
-      * - encoding: MUST be set by user.
-      * - decoding: unused.
-      */
-     AVRational time_base;
- 
-+    /**
-+     * Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
-+     * - encoding: unused.
-+     * - decoding: set by user.
-+     */
-+    AVRational pkt_timebase;
-+
-+    /**
-+     * - decoding: For codecs that store a framerate value in the compressed
-+     *             bitstream, the decoder may export it here. { 0, 1} when
-+     *             unknown.
-+     * - encoding: May be used to signal the framerate of CFR content to an
-+     *             encoder.
-+     */
-+    AVRational framerate;
-+
- #if FF_API_TICKS_PER_FRAME
-     /**
-      * For some codecs, the time base is closer to the field rate than the frame rate.
-      * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration
-      * if no telecine is used ...
-      *
-      * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2.
-      *
-@@ -631,21 +628,23 @@ typedef struct AVCodecContext {
-      * - encoding: unused
-      * - decoding: May be set by the user before opening the decoder if known
-      *             e.g. from the container. During decoding, the decoder may
-      *             overwrite those values as required while parsing the data.
-      */
-     int coded_width, coded_height;
- 
-     /**
--     * the number of pictures in a group of pictures, or 0 for intra_only
-+     * sample aspect ratio (0 if unknown)
-+     * That is the width of a pixel divided by the height of the pixel.
-+     * Numerator and denominator must be relatively prime and smaller than 256 for some video standards.
-      * - encoding: Set by user.
--     * - decoding: unused
-+     * - decoding: Set by libavcodec.
-      */
--    int gop_size;
-+    AVRational sample_aspect_ratio;
- 
-     /**
-      * Pixel format, see AV_PIX_FMT_xxx.
-      * May be set by the demuxer if known from headers.
-      * May be overridden by the decoder if it knows better.
-      *
-      * @note This field may not match the value of the last
-      * AVFrame output by avcodec_receive_frame() due frame
-@@ -653,16 +652,92 @@ typedef struct AVCodecContext {
-      *
-      * - encoding: Set by user.
-      * - decoding: Set by user if known, overridden by libavcodec while
-      *             parsing the data.
-      */
-     enum AVPixelFormat pix_fmt;
- 
-     /**
-+     * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
-+     * - encoding: unused.
-+     * - decoding: Set by libavcodec before calling get_format()
-+     */
-+    enum AVPixelFormat sw_pix_fmt;
-+
-+    /**
-+     * Chromaticity coordinates of the source primaries.
-+     * - encoding: Set by user
-+     * - decoding: Set by libavcodec
-+     */
-+    enum AVColorPrimaries color_primaries;
-+
-+    /**
-+     * Color Transfer Characteristic.
-+     * - encoding: Set by user
-+     * - decoding: Set by libavcodec
-+     */
-+    enum AVColorTransferCharacteristic color_trc;
-+
-+    /**
-+     * YUV colorspace type.
-+     * - encoding: Set by user
-+     * - decoding: Set by libavcodec
-+     */
-+    enum AVColorSpace colorspace;
-+
-+    /**
-+     * MPEG vs JPEG YUV range.
-+     * - encoding: Set by user to override the default output color range value,
-+     *   If not specified, libavcodec sets the color range depending on the
-+     *   output format.
-+     * - decoding: Set by libavcodec, can be set by the user to propagate the
-+     *   color range to components reading from the decoder context.
-+     */
-+    enum AVColorRange color_range;
-+
-+    /**
-+     * This defines the location of chroma samples.
-+     * - encoding: Set by user
-+     * - decoding: Set by libavcodec
-+     */
-+    enum AVChromaLocation chroma_sample_location;
-+
-+    /** Field order
-+     * - encoding: set by libavcodec
-+     * - decoding: Set by user.
-+     */
-+    enum AVFieldOrder field_order;
-+
-+    /**
-+     * number of reference frames
-+     * - encoding: Set by user.
-+     * - decoding: Set by lavc.
-+     */
-+    int refs;
-+
-+    /**
-+     * Size of the frame reordering buffer in the decoder.
-+     * For MPEG-2 it is 1 IPB or 0 low delay IP.
-+     * - encoding: Set by libavcodec.
-+     * - decoding: Set by libavcodec.
-+     */
-+    int has_b_frames;
-+
-+    /**
-+     * slice flags
-+     * - encoding: unused
-+     * - decoding: Set by user.
-+     */
-+    int slice_flags;
-+#define SLICE_FLAG_CODED_ORDER    0x0001 ///< draw_horiz_band() is called in coded order instead of display
-+#define SLICE_FLAG_ALLOW_FIELD    0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics)
-+#define SLICE_FLAG_ALLOW_PLANE    0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1)
-+
-+    /**
-      * If non NULL, 'draw_horiz_band' is called by the libavcodec
-      * decoder to draw a horizontal band. It improves cache usage. Not
-      * all codecs can do that. You must check the codec capabilities
-      * beforehand.
-      * When multithreading is used, it may be called from multiple threads
-      * at the same time; threads might draw different parts of the same AVFrame,
-      * or multiple AVFrames, and there is no guarantee that slices will be drawn
-      * in order.
-@@ -731,24 +806,16 @@ typedef struct AVCodecContext {
-     /**
-      * qscale offset between IP and B-frames
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-     float b_quant_offset;
- 
-     /**
--     * Size of the frame reordering buffer in the decoder.
--     * For MPEG-2 it is 1 IPB or 0 low delay IP.
--     * - encoding: Set by libavcodec.
--     * - decoding: Set by libavcodec.
--     */
--    int has_b_frames;
--
--    /**
-      * qscale factor between P- and I-frames
-      * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset).
-      * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-     float i_quant_factor;
- 
-@@ -789,42 +856,22 @@ typedef struct AVCodecContext {
- 
-     /**
-      * darkness masking (0-> disabled)
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-     float dark_masking;
- 
--#if FF_API_SLICE_OFFSET
-     /**
--     * slice count
--     * - encoding: Set by libavcodec.
--     * - decoding: Set by user (or 0).
-+     * noise vs. sse weight for the nsse comparison function
-+     * - encoding: Set by user.
-+     * - decoding: unused
-      */
--    attribute_deprecated
--    int slice_count;
--
--    /**
--     * slice offsets in the frame in bytes
--     * - encoding: Set/allocated by libavcodec.
--     * - decoding: Set/allocated by user (or NULL).
--     */
--    attribute_deprecated
--    int *slice_offset;
--#endif
--
--    /**
--     * sample aspect ratio (0 if unknown)
--     * That is the width of a pixel divided by the height of the pixel.
--     * Numerator and denominator must be relatively prime and smaller than 256 for some video standards.
--     * - encoding: Set by user.
--     * - decoding: Set by libavcodec.
--     */
--    AVRational sample_aspect_ratio;
-+     int nsse_weight;
- 
-     /**
-      * motion estimation comparison function
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-     int me_cmp;
-     /**
-@@ -903,26 +950,16 @@ typedef struct AVCodecContext {
-      * If 0 then no limit.
-      *
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-     int me_range;
- 
-     /**
--     * slice flags
--     * - encoding: unused
--     * - decoding: Set by user.
--     */
--    int slice_flags;
--#define SLICE_FLAG_CODED_ORDER    0x0001 ///< draw_horiz_band() is called in coded order instead of display
--#define SLICE_FLAG_ALLOW_FIELD    0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics)
--#define SLICE_FLAG_ALLOW_PLANE    0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1)
--
--    /**
-      * macroblock decision mode
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-     int mb_decision;
- #define FF_MB_DECISION_SIMPLE 0        ///< uses mb_cmp
- #define FF_MB_DECISION_BITS   1        ///< chooses the one which needs the fewest bits
- #define FF_MB_DECISION_RD     2        ///< rate distortion
-@@ -941,37 +978,30 @@ typedef struct AVCodecContext {
-      * 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;
- 
-     /**
-+     * custom intra quantization matrix
-+     * - encoding: Set by user, can be NULL.
-+     * - decoding: unused.
-+     */
-+    uint16_t *chroma_intra_matrix;
-+
-+    /**
-      * precision of the intra DC coefficient - 8
-      * - encoding: Set by user.
-      * - decoding: Set by libavcodec
-      */
-     int intra_dc_precision;
- 
-     /**
--     * Number of macroblock rows at the top which are skipped.
--     * - encoding: unused
--     * - decoding: Set by user.
--     */
--    int skip_top;
--
--    /**
--     * Number of macroblock rows at the bottom which are skipped.
--     * - encoding: unused
--     * - decoding: Set by user.
--     */
--    int skip_bottom;
--
--    /**
-      * minimum MB Lagrange multiplier
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-     int mb_lmin;
- 
-     /**
-      * maximum MB Lagrange multiplier
-@@ -989,177 +1019,132 @@ typedef struct AVCodecContext {
-     /**
-      * minimum GOP size
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-     int keyint_min;
- 
-     /**
--     * number of reference frames
-+     * the number of pictures in a group of pictures, or 0 for intra_only
-      * - encoding: Set by user.
--     * - decoding: Set by lavc.
-+     * - decoding: unused
-      */
--    int refs;
-+    int gop_size;
- 
-     /**
-      * Note: Value depends upon the compare function used for fullpel ME.
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-     int mv0_threshold;
- 
-     /**
--     * Chromaticity coordinates of the source primaries.
--     * - encoding: Set by user
--     * - decoding: Set by libavcodec
--     */
--    enum AVColorPrimaries color_primaries;
--
--    /**
--     * Color Transfer Characteristic.
--     * - encoding: Set by user
--     * - decoding: Set by libavcodec
--     */
--    enum AVColorTransferCharacteristic color_trc;
--
--    /**
--     * YUV colorspace type.
--     * - encoding: Set by user
--     * - decoding: Set by libavcodec
--     */
--    enum AVColorSpace colorspace;
--
--    /**
--     * MPEG vs JPEG YUV range.
--     * - encoding: Set by user to override the default output color range value,
--     *   If not specified, libavcodec sets the color range depending on the
--     *   output format.
--     * - decoding: Set by libavcodec, can be set by the user to propagate the
--     *   color range to components reading from the decoder context.
--     */
--    enum AVColorRange color_range;
--
--    /**
--     * This defines the location of chroma samples.
--     * - encoding: Set by user
--     * - decoding: Set by libavcodec
--     */
--    enum AVChromaLocation chroma_sample_location;
--
--    /**
-      * Number of slices.
-      * Indicates number of picture subdivisions. Used for parallelized
-      * decoding.
-      * - encoding: Set by user
-      * - decoding: unused
-      */
-     int slices;
- 
--    /** Field order
--     * - encoding: set by libavcodec
--     * - decoding: Set by user.
--     */
--    enum AVFieldOrder field_order;
--
-     /* audio only */
-     int sample_rate; ///< samples per second
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--    /**
--     * number of audio channels
--     * @deprecated use ch_layout.nb_channels
--     */
--    attribute_deprecated
--    int channels;
--#endif
--
-     /**
-      * audio sample format
-      * - encoding: Set by user.
-      * - decoding: Set by libavcodec.
-      */
-     enum AVSampleFormat sample_fmt;  ///< sample format
- 
-+    /**
-+     * Audio channel layout.
-+     * - encoding: must be set by the caller, to one of AVCodec.ch_layouts.
-+     * - decoding: may be set by the caller if known e.g. from the container.
-+     *             The decoder can then override during decoding as needed.
-+     */
-+    AVChannelLayout ch_layout;
-+
-     /* The following data should not be initialized. */
-     /**
-      * Number of samples per channel in an audio frame.
-      *
-      * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame
-      *   except the last must contain exactly frame_size samples per channel.
-      *   May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the
-      *   frame size is not restricted.
-      * - decoding: may be set by some decoders to indicate constant frame size
-      */
-     int frame_size;
- 
--#if FF_API_AVCTX_FRAME_NUMBER
--    /**
--     * Frame counter, set by libavcodec.
--     *
--     * - decoding: total number of frames returned from the decoder so far.
--     * - encoding: total number of frames passed to the encoder so far.
--     *
--     *   @note the counter is not incremented if encoding/decoding resulted in
--     *   an error.
--     *   @deprecated use frame_num instead
--     */
--    attribute_deprecated
--    int frame_number;
--#endif
--
-     /**
-      * number of bytes per packet if constant and known or 0
-      * Used by some WAV based audio codecs.
-      */
-     int block_align;
- 
-     /**
-      * Audio cutoff bandwidth (0 means "automatic")
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-     int cutoff;
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--    /**
--     * Audio channel layout.
--     * - encoding: set by user.
--     * - decoding: set by user, may be overwritten by libavcodec.
--     * @deprecated use ch_layout
--     */
--    attribute_deprecated
--    uint64_t channel_layout;
--
--    /**
--     * Request decoder to use this channel layout if it can (0 for default)
--     * - encoding: unused
--     * - decoding: Set by user.
--     * @deprecated use "downmix" codec private option
--     */
--    attribute_deprecated
--    uint64_t request_channel_layout;
--#endif
--
-     /**
-      * Type of service that the audio stream conveys.
-      * - encoding: Set by user.
-      * - decoding: Set by libavcodec.
-      */
-     enum AVAudioServiceType audio_service_type;
- 
-     /**
-      * desired sample format
-      * - encoding: Not used.
-      * - decoding: Set by user.
-      * Decoder will decode to this format if it can.
-      */
-     enum AVSampleFormat request_sample_fmt;
- 
-     /**
-+     * Audio only. The number of "priming" samples (padding) inserted by the
-+     * encoder at the beginning of the audio. I.e. this number of leading
-+     * decoded samples must be discarded by the caller to get the original audio
-+     * without leading padding.
-+     *
-+     * - decoding: unused
-+     * - encoding: Set by libavcodec. The timestamps on the output packets are
-+     *             adjusted by the encoder so that they always refer to the
-+     *             first sample of the data actually contained in the packet,
-+     *             including any added padding.  E.g. if the timebase is
-+     *             1/samplerate and the timestamp of the first input sample is
-+     *             0, the timestamp of the first output packet will be
-+     *             -initial_padding.
-+     */
-+    int initial_padding;
-+
-+    /**
-+     * Audio only. The amount of padding (in samples) appended by the encoder to
-+     * the end of the audio. I.e. this number of decoded samples must be
-+     * discarded by the caller from the end of the stream to get the original
-+     * audio without any trailing padding.
-+     *
-+     * - decoding: unused
-+     * - encoding: unused
-+     */
-+    int trailing_padding;
-+
-+    /**
-+     * Number of samples to skip after a discontinuity
-+     * - decoding: unused
-+     * - encoding: set by libavcodec
-+     */
-+    int seek_preroll;
-+
-+    /**
-      * This callback is called at the beginning of each frame to get data
-      * buffer(s) for it. There may be one contiguous buffer for all the data or
-      * there may be a buffer per each data plane or anything in between. What
-      * this means is, you may set however many entries in buf[] you feel necessary.
-      * Each buffer must be reference-counted using the AVBuffer API (see description
-      * of buf[] below).
-      *
-      * The following fields will be set in the frame before this callback is
-@@ -1232,16 +1217,39 @@ typedef struct AVCodecContext {
-      * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
-      *
-      * - encoding: unused
-      * - decoding: Set by libavcodec, user can override.
-      */
-     int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags);
- 
-     /* - encoding parameters */
-+    /**
-+     * number of bits the bitstream is allowed to diverge from the reference.
-+     *           the reference can be CBR (for CBR pass1) or VBR (for pass2)
-+     * - encoding: Set by user; unused for constant quantizer encoding.
-+     * - decoding: unused
-+     */
-+    int bit_rate_tolerance;
-+
-+    /**
-+     * Global quality for codecs which cannot change it per frame.
-+     * This should be proportional to MPEG-1/2/4 qscale.
-+     * - encoding: Set by user.
-+     * - decoding: unused
-+     */
-+    int global_quality;
-+
-+    /**
-+     * - encoding: Set by user.
-+     * - decoding: unused
-+     */
-+    int compression_level;
-+#define FF_COMPRESSION_DEFAULT -1
-+
-     float qcompress;  ///< amount of qscale change between easy & hard scenes (0.0-1.0)
-     float qblur;      ///< amount of qscale smoothing over time (0.0-1.0)
- 
-     /**
-      * minimum quantizer
-      * - encoding: Set by user.
-      * - decoding: unused
-      */
-@@ -1406,32 +1414,16 @@ typedef struct AVCodecContext {
-      * Error recognition; may misdetect some more or less valid parts as errors.
-      * This is a bitfield of the AV_EF_* values defined in defs.h.
-      *
-      * - encoding: Set by user.
-      * - decoding: Set by user.
-      */
-     int err_recognition;
- 
--#if FF_API_REORDERED_OPAQUE
--    /**
--     * opaque 64-bit number (generally a PTS) that will be reordered and
--     * output in AVFrame.reordered_opaque
--     * - 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.
--     *
--     * @deprecated Use AV_CODEC_FLAG_COPY_OPAQUE instead
--     */
--    attribute_deprecated
--    int64_t reordered_opaque;
--#endif
--
-     /**
-      * Hardware accelerator in use
-      * - encoding: unused.
-      * - decoding: Set by libavcodec
-      */
-     const struct AVHWAccel *hwaccel;
- 
-     /**
-@@ -1454,16 +1446,85 @@ typedef struct AVCodecContext {
-      *             valid until avcodec_free_context().
-      * - decoding: May be set by the caller in the get_format() callback.
-      *             Must remain valid until the next get_format() call,
-      *             or avcodec_free_context() (whichever comes first).
-      */
-     void *hwaccel_context;
- 
-     /**
-+     * A reference to the AVHWFramesContext describing the input (for encoding)
-+     * or output (decoding) frames. The reference is set by the caller and
-+     * afterwards owned (and freed) by libavcodec - it should never be read by
-+     * the caller after being set.
-+     *
-+     * - decoding: This field should be set by the caller from the get_format()
-+     *             callback. The previous reference (if any) will always be
-+     *             unreffed by libavcodec before the get_format() call.
-+     *
-+     *             If the default get_buffer2() is used with a hwaccel pixel
-+     *             format, then this AVHWFramesContext will be used for
-+     *             allocating the frame buffers.
-+     *
-+     * - encoding: For hardware encoders configured to use a hwaccel pixel
-+     *             format, this field should be set by the caller to a reference
-+     *             to the AVHWFramesContext describing input frames.
-+     *             AVHWFramesContext.format must be equal to
-+     *             AVCodecContext.pix_fmt.
-+     *
-+     *             This field should be set before avcodec_open2() is called.
-+     */
-+    AVBufferRef *hw_frames_ctx;
-+
-+    /**
-+     * A reference to the AVHWDeviceContext describing the device which will
-+     * be used by a hardware encoder/decoder.  The reference is set by the
-+     * caller and afterwards owned (and freed) by libavcodec.
-+     *
-+     * This should be used if either the codec device does not require
-+     * hardware frames or any that are used are to be allocated internally by
-+     * libavcodec.  If the user wishes to supply any of the frames used as
-+     * encoder input or decoder output then hw_frames_ctx should be used
-+     * instead.  When hw_frames_ctx is set in get_format() for a decoder, this
-+     * field will be ignored while decoding the associated stream segment, but
-+     * may again be used on a following one after another get_format() call.
-+     *
-+     * For both encoders and decoders this field should be set before
-+     * avcodec_open2() is called and must not be written to thereafter.
-+     *
-+     * Note that some decoders may require this field to be set initially in
-+     * order to support hw_frames_ctx at all - in that case, all frames
-+     * contexts used must be created on the same device.
-+     */
-+    AVBufferRef *hw_device_ctx;
-+
-+    /**
-+     * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated
-+     * decoding (if active).
-+     * - encoding: unused
-+     * - decoding: Set by user (either before avcodec_open2(), or in the
-+     *             AVCodecContext.get_format callback)
-+     */
-+    int hwaccel_flags;
-+
-+    /**
-+     * Video decoding only.  Sets the number of extra hardware frames which
-+     * the decoder will allocate for use by the caller.  This must be set
-+     * before avcodec_open2() is called.
-+     *
-+     * Some hardware decoders require all frames that they will use for
-+     * output to be defined in advance before decoding starts.  For such
-+     * decoders, the hardware frame pool must therefore be of a fixed size.
-+     * The extra frames set here are on top of any number that the decoder
-+     * needs internally in order to operate normally (for example, frames
-+     * used as reference pictures).
-+     */
-+    int extra_hw_frames;
-+
-+    /**
-      * error
-      * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR.
-      * - decoding: unused
-      */
-     uint64_t error[AV_NUM_DATA_POINTERS];
- 
-     /**
-      * DCT algorithm, see FF_DCT_* below
-@@ -1491,20 +1552,16 @@ typedef struct AVCodecContext {
- #define FF_IDCT_ARM           7
- #define FF_IDCT_ALTIVEC       8
- #define FF_IDCT_SIMPLEARM     10
- #define FF_IDCT_XVID          14
- #define FF_IDCT_SIMPLEARMV5TE 16
- #define FF_IDCT_SIMPLEARMV6   17
- #define FF_IDCT_FAAN          20
- #define FF_IDCT_SIMPLENEON    22
--#if FF_API_IDCT_NONE
--// formerly used by xvmc
--#define FF_IDCT_NONE          24
--#endif
- #define FF_IDCT_SIMPLEAUTO    128
- 
-     /**
-      * bits per sample/pixel from the demuxer (needed for huffyuv).
-      * - encoding: Set by libavcodec.
-      * - decoding: Set by user.
-      */
-      int bits_per_coded_sample;
-@@ -1512,23 +1569,16 @@ typedef struct AVCodecContext {
-     /**
-      * Bits per sample/pixel of internal libavcodec pixel/sample format.
-      * - encoding: set by user.
-      * - decoding: set by libavcodec.
-      */
-     int bits_per_raw_sample;
- 
-     /**
--     * low resolution decoding, 1-> 1/2 size, 2->1/4 size
--     * - encoding: unused
--     * - decoding: Set by user.
--     */
--     int lowres;
--
--    /**
-      * thread count
-      * is used to decide how many independent tasks should be passed to execute()
-      * - encoding: Set by user.
-      * - decoding: Set by user.
-      */
-     int thread_count;
- 
-     /**
-@@ -1576,23 +1626,16 @@ typedef struct AVCodecContext {
-      * @return always 0 currently, but code should handle a future improvement where when any call to func
-      *         returns < 0 no further calls to func may be done and < 0 is returned.
-      * - encoding: Set by libavcodec, user can override.
-      * - decoding: Set by libavcodec, user can override.
-      */
-     int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count);
- 
-     /**
--     * noise vs. sse weight for the nsse comparison function
--     * - encoding: Set by user.
--     * - decoding: unused
--     */
--     int nsse_weight;
--
--    /**
-      * profile
-      * - encoding: Set by user.
-      * - decoding: Set by libavcodec.
-      * See the AV_PROFILE_* defines in defs.h.
-      */
-      int profile;
- #if FF_API_FF_PROFILE_LEVEL
-     /** @deprecated The following defines are deprecated; use AV_PROFILE_*
-@@ -1740,16 +1783,26 @@ typedef struct AVCodecContext {
-      int level;
- #if FF_API_FF_PROFILE_LEVEL
-     /** @deprecated The following define is deprecated; use AV_LEVEL_UNKOWN
-      * in defs.h instead. */
- #define FF_LEVEL_UNKNOWN -99
- #endif
- 
-     /**
-+     * Properties of the stream that gets decoded
-+     * - encoding: unused
-+     * - decoding: set by libavcodec
-+     */
-+    unsigned properties;
-+#define FF_CODEC_PROPERTY_LOSSLESS        0x00000001
-+#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002
-+#define FF_CODEC_PROPERTY_FILM_GRAIN      0x00000004
-+
-+    /**
-      * Skip loop filtering for selected frames.
-      * - encoding: unused
-      * - decoding: Set by user.
-      */
-     enum AVDiscard skip_loop_filter;
- 
-     /**
-      * Skip IDCT/dequantization for selected frames.
-@@ -1761,84 +1814,58 @@ typedef struct AVCodecContext {
-     /**
-      * Skip decoding for selected frames.
-      * - encoding: unused
-      * - decoding: Set by user.
-      */
-     enum AVDiscard skip_frame;
- 
-     /**
--     * Header containing style information for text subtitles.
--     * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
--     * [Script Info] and [V4+ Styles] section, plus the [Events] line and
--     * the Format line following. It shouldn't include any Dialogue line.
--     * - encoding: Set/allocated/freed by user (before avcodec_open2())
--     * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
-+     * Skip processing alpha if supported by codec.
-+     * Note that if the format uses pre-multiplied alpha (common with VP6,
-+     * and recommended due to better video quality/compression)
-+     * the image will look as if alpha-blended onto a black background.
-+     * However for formats that do not use pre-multiplied alpha
-+     * there might be serious artefacts (though e.g. libswscale currently
-+     * assumes pre-multiplied alpha anyway).
-+     *
-+     * - decoding: set by user
-+     * - encoding: unused
-      */
--    uint8_t *subtitle_header;
--    int subtitle_header_size;
-+    int skip_alpha;
- 
-     /**
--     * Audio only. The number of "priming" samples (padding) inserted by the
--     * encoder at the beginning of the audio. I.e. this number of leading
--     * decoded samples must be discarded by the caller to get the original audio
--     * without leading padding.
--     *
--     * - decoding: unused
--     * - encoding: Set by libavcodec. The timestamps on the output packets are
--     *             adjusted by the encoder so that they always refer to the
--     *             first sample of the data actually contained in the packet,
--     *             including any added padding.  E.g. if the timebase is
--     *             1/samplerate and the timestamp of the first input sample is
--     *             0, the timestamp of the first output packet will be
--     *             -initial_padding.
-+     * Number of macroblock rows at the top which are skipped.
-+     * - encoding: unused
-+     * - decoding: Set by user.
-      */
--    int initial_padding;
-+    int skip_top;
- 
-     /**
--     * - decoding: For codecs that store a framerate value in the compressed
--     *             bitstream, the decoder may export it here. { 0, 1} when
--     *             unknown.
--     * - encoding: May be used to signal the framerate of CFR content to an
--     *             encoder.
-+     * Number of macroblock rows at the bottom which are skipped.
-+     * - encoding: unused
-+     * - decoding: Set by user.
-      */
--    AVRational framerate;
-+    int skip_bottom;
- 
-     /**
--     * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
--     * - encoding: unused.
--     * - decoding: Set by libavcodec before calling get_format()
-+     * low resolution decoding, 1-> 1/2 size, 2->1/4 size
-+     * - encoding: unused
-+     * - decoding: Set by user.
-      */
--    enum AVPixelFormat sw_pix_fmt;
--
--    /**
--     * Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
--     * - encoding: unused.
--     * - decoding: set by user.
--     */
--    AVRational pkt_timebase;
-+     int lowres;
- 
-     /**
-      * AVCodecDescriptor
-      * - encoding: unused.
-      * - decoding: set by libavcodec.
-      */
-     const struct AVCodecDescriptor *codec_descriptor;
- 
-     /**
--     * Current statistics for PTS correction.
--     * - decoding: maintained and used by libavcodec, not intended to be used by user apps
--     * - encoding: unused
--     */
--    int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far
--    int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far
--    int64_t pts_correction_last_pts;       /// PTS of the last frame
--    int64_t pts_correction_last_dts;       /// DTS of the last frame
--
--    /**
-      * Character encoding of the input subtitles file.
-      * - decoding: set by user
-      * - encoding: unused
-      */
-     char *sub_charenc;
- 
-     /**
-      * Subtitles character encoding mode. Formats or codecs might be adjusting
-@@ -1848,42 +1875,25 @@ typedef struct AVCodecContext {
-      */
-     int sub_charenc_mode;
- #define FF_SUB_CHARENC_MODE_DO_NOTHING  -1  ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance)
- #define FF_SUB_CHARENC_MODE_AUTOMATIC    0  ///< libavcodec will select the mode itself
- #define FF_SUB_CHARENC_MODE_PRE_DECODER  1  ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv
- #define FF_SUB_CHARENC_MODE_IGNORE       2  ///< neither convert the subtitles, nor check them for valid UTF-8
- 
-     /**
--     * Skip processing alpha if supported by codec.
--     * Note that if the format uses pre-multiplied alpha (common with VP6,
--     * and recommended due to better video quality/compression)
--     * the image will look as if alpha-blended onto a black background.
--     * However for formats that do not use pre-multiplied alpha
--     * there might be serious artefacts (though e.g. libswscale currently
--     * assumes pre-multiplied alpha anyway).
--     *
--     * - decoding: set by user
--     * - encoding: unused
-+     * Header containing style information for text subtitles.
-+     * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
-+     * [Script Info] and [V4+ Styles] section, plus the [Events] line and
-+     * the Format line following. It shouldn't include any Dialogue line.
-+     * - encoding: Set/allocated/freed by user (before avcodec_open2())
-+     * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
-      */
--    int skip_alpha;
--
--    /**
--     * Number of samples to skip after a discontinuity
--     * - decoding: unused
--     * - encoding: set by libavcodec
--     */
--    int seek_preroll;
--
--    /**
--     * custom intra quantization matrix
--     * - encoding: Set by user, can be NULL.
--     * - decoding: unused.
--     */
--    uint16_t *chroma_intra_matrix;
-+    int subtitle_header_size;
-+    uint8_t *subtitle_header;
- 
-     /**
-      * dump format separator.
-      * can be ", " or "\n      " or anything else
-      * - encoding: Set by user.
-      * - decoding: Set by user.
-      */
-     uint8_t *dump_separator;
-@@ -1892,109 +1902,43 @@ typedef struct AVCodecContext {
-      * ',' separated list of allowed decoders.
-      * If NULL then all are allowed
-      * - encoding: unused
-      * - decoding: set by user
-      */
-     char *codec_whitelist;
- 
-     /**
--     * Properties of the stream that gets decoded
--     * - encoding: unused
--     * - decoding: set by libavcodec
--     */
--    unsigned properties;
--#define FF_CODEC_PROPERTY_LOSSLESS        0x00000001
--#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002
--#define FF_CODEC_PROPERTY_FILM_GRAIN      0x00000004
--
--    /**
-      * Additional data associated with the entire coded stream.
-      *
-      * - decoding: may be set by user before calling avcodec_open2().
-      * - encoding: may be set by libavcodec after avcodec_open2().
-      */
-     AVPacketSideData *coded_side_data;
-     int            nb_coded_side_data;
- 
-     /**
--     * A reference to the AVHWFramesContext describing the input (for encoding)
--     * or output (decoding) frames. The reference is set by the caller and
--     * afterwards owned (and freed) by libavcodec - it should never be read by
--     * the caller after being set.
--     *
--     * - decoding: This field should be set by the caller from the get_format()
--     *             callback. The previous reference (if any) will always be
--     *             unreffed by libavcodec before the get_format() call.
--     *
--     *             If the default get_buffer2() is used with a hwaccel pixel
--     *             format, then this AVHWFramesContext will be used for
--     *             allocating the frame buffers.
-+     * 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.
-      *
--     * - encoding: For hardware encoders configured to use a hwaccel pixel
--     *             format, this field should be set by the caller to a reference
--     *             to the AVHWFramesContext describing input frames.
--     *             AVHWFramesContext.format must be equal to
--     *             AVCodecContext.pix_fmt.
--     *
--     *             This field should be set before avcodec_open2() is called.
-+     * - decoding: set by user
-+     * - encoding: set by user
-      */
--    AVBufferRef *hw_frames_ctx;
--
--    /**
--     * Audio only. The amount of padding (in samples) appended by the encoder to
--     * the end of the audio. I.e. this number of decoded samples must be
--     * discarded by the caller from the end of the stream to get the original
--     * audio without any trailing padding.
--     *
--     * - decoding: unused
--     * - encoding: unused
--     */
--    int trailing_padding;
-+    int export_side_data;
- 
-     /**
-      * The number of pixels per image to maximally accept.
-      *
-      * - decoding: set by user
-      * - encoding: set by user
-      */
-     int64_t max_pixels;
- 
-     /**
--     * A reference to the AVHWDeviceContext describing the device which will
--     * be used by a hardware encoder/decoder.  The reference is set by the
--     * caller and afterwards owned (and freed) by libavcodec.
--     *
--     * This should be used if either the codec device does not require
--     * hardware frames or any that are used are to be allocated internally by
--     * libavcodec.  If the user wishes to supply any of the frames used as
--     * encoder input or decoder output then hw_frames_ctx should be used
--     * instead.  When hw_frames_ctx is set in get_format() for a decoder, this
--     * field will be ignored while decoding the associated stream segment, but
--     * may again be used on a following one after another get_format() call.
--     *
--     * For both encoders and decoders this field should be set before
--     * avcodec_open2() is called and must not be written to thereafter.
--     *
--     * Note that some decoders may require this field to be set initially in
--     * order to support hw_frames_ctx at all - in that case, all frames
--     * contexts used must be created on the same device.
--     */
--    AVBufferRef *hw_device_ctx;
--
--    /**
--     * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated
--     * decoding (if active).
--     * - encoding: unused
--     * - decoding: Set by user (either before avcodec_open2(), or in the
--     *             AVCodecContext.get_format callback)
--     */
--    int hwaccel_flags;
--
--    /**
-      * Video decoding only. Certain video codecs support cropping, meaning that
-      * only a sub-rectangle of the decoded frame is intended for display.  This
-      * option controls how cropping is handled by libavcodec.
-      *
-      * When set to 1 (the default), libavcodec will apply cropping internally.
-      * I.e. it will modify the output frame width/height fields and offset the
-      * data pointers (only by as much as possible while preserving alignment, or
-      * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that
-@@ -2011,30 +1955,16 @@ typedef struct AVCodecContext {
-      * @note when this option is set to zero, the width/height fields of the
-      * AVCodecContext and output AVFrames have different meanings. The codec
-      * context fields store display dimensions (with the coded dimensions in
-      * coded_width/height), while the frame fields store the coded dimensions
-      * (with the display dimensions being determined by the crop_* fields).
-      */
-     int apply_cropping;
- 
--    /*
--     * Video decoding only.  Sets the number of extra hardware frames which
--     * the decoder will allocate for use by the caller.  This must be set
--     * before avcodec_open2() is called.
--     *
--     * Some hardware decoders require all frames that they will use for
--     * output to be defined in advance before decoding starts.  For such
--     * decoders, the hardware frame pool must therefore be of a fixed size.
--     * The extra frames set here are on top of any number that the decoder
--     * needs internally in order to operate normally (for example, frames
--     * 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;
- 
-@@ -2042,26 +1972,16 @@ typedef struct AVCodecContext {
-      * 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;
--
--    /**
-      * This callback is called at the beginning of each packet to get a data
-      * buffer for it.
-      *
-      * The following field will be set in the packet before this callback is
-      * called:
-      * - size
-      * This callback must use the above value to calculate the required buffer size,
-      * which must padded by at least AV_INPUT_BUFFER_PADDING_SIZE bytes.
-@@ -2094,33 +2014,72 @@ typedef struct AVCodecContext {
-      * @see avcodec_default_get_encode_buffer()
-      *
-      * - encoding: Set by libavcodec, user can override.
-      * - decoding: unused
-      */
-     int (*get_encode_buffer)(struct AVCodecContext *s, AVPacket *pkt, int flags);
- 
-     /**
--     * Audio channel layout.
--     * - encoding: must be set by the caller, to one of AVCodec.ch_layouts.
--     * - decoding: may be set by the caller if known e.g. from the container.
--     *             The decoder can then override during decoding as needed.
--     */
--    AVChannelLayout ch_layout;
--
--    /**
-      * Frame counter, set by libavcodec.
-      *
-      * - decoding: total number of frames returned from the decoder so far.
-      * - encoding: total number of frames passed to the encoder so far.
-      *
-      *   @note the counter is not incremented if encoding/decoding resulted in
-      *   an error.
-      */
-     int64_t frame_num;
-+
-+    /**
-+     * Decoding only. May be set by the caller before avcodec_open2() to an
-+     * av_malloc()'ed array (or via AVOptions). Owned and freed by the decoder
-+     * afterwards.
-+     *
-+     * Side data attached to decoded frames may come from several sources:
-+     * 1. coded_side_data, which the decoder will for certain types translate
-+     *    from packet-type to frame-type and attach to frames;
-+     * 2. side data attached to an AVPacket sent for decoding (same
-+     *    considerations as above);
-+     * 3. extracted from the coded bytestream.
-+     * The first two cases are supplied by the caller and typically come from a
-+     * container.
-+     *
-+     * This array configures decoder behaviour in cases when side data of the
-+     * same type is present both in the coded bytestream and in the
-+     * user-supplied side data (items 1. and 2. above). In all cases, at most
-+     * one instance of each side data type will be attached to output frames. By
-+     * default it will be the bytestream side data. Adding an
-+     * AVPacketSideDataType value to this array will flip the preference for
-+     * this type, thus making the decoder prefer user-supplied side data over
-+     * bytestream. In case side data of the same type is present both in
-+     * coded_data and attacked to a packet, the packet instance always has
-+     * priority.
-+     *
-+     * The array may also contain a single -1, in which case the preference is
-+     * switched for all side data types.
-+     */
-+    int        *side_data_prefer_packet;
-+    /**
-+     * Number of entries in side_data_prefer_packet.
-+     */
-+    unsigned nb_side_data_prefer_packet;
-+
-+    /**
-+     * Array containing static side data, such as HDR10 CLL / MDCV structures.
-+     * Side data entries should be allocated by usage of helpers defined in
-+     * libavutil/frame.h.
-+     *
-+     * - encoding: may be set by user before calling avcodec_open2() for
-+     *             encoder configuration. Afterwards owned and freed by the
-+     *             encoder.
-+     * - decoding: unused
-+     */
-+    AVFrameSideData  **decoded_side_data;
-+    int             nb_decoded_side_data;
- } AVCodecContext;
- 
- /**
-  * @defgroup lavc_hwaccel AVHWAccel
-  *
-  * @note  Nothing in this structure should be accessed by the user.  At some
-  *        point in future it will not be externally visible at all.
-  *
-@@ -2247,28 +2206,27 @@ typedef struct AVSubtitleRect {
- 
-     /**
-      * data+linesize for the bitmap of this subtitle.
-      * Can be set for text/ass as well once they are rendered.
-      */
-     uint8_t *data[4];
-     int linesize[4];
- 
-+    int flags;
-     enum AVSubtitleType type;
- 
-     char *text;                     ///< 0 terminated plain UTF-8 text
- 
-     /**
-      * 0 terminated ASS/SSA compatible event line.
-      * The presentation of this is unaffected by the other values in this
-      * struct.
-      */
-     char *ass;
--
--    int flags;
- } AVSubtitleRect;
- 
- typedef struct AVSubtitle {
-     uint16_t format; /* 0 = graphics */
-     uint32_t start_display_time; /* relative to packet pts, in ms */
-     uint32_t end_display_time; /* relative to packet pts, in ms */
-     unsigned num_rects;
-     AVSubtitleRect **rects;
-@@ -2406,30 +2364,33 @@ int avcodec_parameters_to_context(AVCode
-  *                options that were not found in the avctx codec context.
-  *
-  * @return zero on success, a negative value on error
-  * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
-  *      av_dict_set(), av_opt_set(), av_opt_find(), avcodec_parameters_to_context()
-  */
- int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
- 
-+#if FF_API_AVCODEC_CLOSE
- /**
-  * Close a given AVCodecContext and free all the data associated with it
-  * (but not the AVCodecContext itself).
-  *
-  * Calling this function on an AVCodecContext that hasn't been opened will free
-  * the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL
-  * codec. Subsequent calls will do nothing.
-  *
-- * @note Do not use this function. Use avcodec_free_context() to destroy a
-+ * @deprecated Do not use this function. Use avcodec_free_context() to destroy a
-  * codec context (either open or closed). Opening and closing a codec context
-  * multiple times is not supported anymore -- use multiple codec contexts
-  * instead.
-  */
-+attribute_deprecated
- int avcodec_close(AVCodecContext *avctx);
-+#endif
- 
- /**
-  * Free all allocated data in the given subtitle struct.
-  *
-  * @param sub AVSubtitle to free.
-  */
- void avsubtitle_free(AVSubtitle *sub);
- 
-@@ -2470,44 +2431,16 @@ void avcodec_align_dimensions(AVCodecCon
-  * buffer that is acceptable for the codec if you also ensure that all
-  * line sizes are a multiple of the respective linesize_align[i].
-  *
-  * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened.
-  */
- void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
-                                int linesize_align[AV_NUM_DATA_POINTERS]);
- 
--#ifdef FF_API_AVCODEC_CHROMA_POS
--/**
-- * Converts AVChromaLocation to swscale x/y chroma position.
-- *
-- * The positions represent the chroma (0,0) position in a coordinates system
-- * with luma (0,0) representing the origin and luma(1,1) representing 256,256
-- *
-- * @param xpos  horizontal chroma sample position
-- * @param ypos  vertical   chroma sample position
-- * @deprecated Use av_chroma_location_enum_to_pos() instead.
-- */
-- attribute_deprecated
--int avcodec_enum_to_chroma_pos(int *xpos, int *ypos, enum AVChromaLocation pos);
--
--/**
-- * Converts swscale x/y chroma position to AVChromaLocation.
-- *
-- * The positions represent the chroma (0,0) position in a coordinates system
-- * with luma (0,0) representing the origin and luma(1,1) representing 256,256
-- *
-- * @param xpos  horizontal chroma sample position
-- * @param ypos  vertical   chroma sample position
-- * @deprecated Use av_chroma_location_pos_to_enum() instead.
-- */
-- attribute_deprecated
--enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos);
--#endif
--
- /**
-  * Decode a subtitle message.
-  * Return a negative value on error, otherwise return the number of bytes used.
-  * 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 expected to be negligible
-  * and reusing a get_buffer written for video codecs would probably perform badly
-diff --git a/media/ffvpx/libavcodec/avcodec.symbols b/media/ffvpx/libavcodec/avcodec.symbols
---- a/media/ffvpx/libavcodec/avcodec.symbols
-+++ b/media/ffvpx/libavcodec/avcodec.symbols
-@@ -4,62 +4,42 @@ av_codec_is_encoder
- av_codec_iterate
- av_fast_padded_malloc
- av_fast_padded_mallocz
- av_get_audio_frame_duration
- av_get_bits_per_sample
- av_get_exact_bits_per_sample
- av_get_pcm_codec
- av_get_profile_name
--av_grow_packet
--av_init_packet
--av_new_packet
- av_packet_alloc
--av_packet_copy_props
--av_packet_free_side_data
--av_packet_from_data
--av_packet_get_side_data
--av_packet_move_ref
--av_packet_new_side_data
--av_packet_pack_dictionary
--av_packet_ref
--av_packet_rescale_ts
--av_packet_shrink_side_data
--av_packet_side_data_name
--av_packet_unpack_dictionary
- av_packet_unref
- av_packet_free
-+av_init_packet
- av_parser_close
- av_parser_init
- av_parser_parse2
--av_rdft_calc
--av_rdft_end
--av_rdft_init
--av_shrink_packet
- av_vorbis_parse_frame
- av_vorbis_parse_frame_flags
- av_vorbis_parse_free
- av_vorbis_parse_init
- av_vorbis_parse_reset
- av_xiphlacing
- avcodec_align_dimensions
- avcodec_align_dimensions2
- avcodec_alloc_context3
--avcodec_chroma_pos_to_enum
- avcodec_close
- avcodec_configuration
- avcodec_decode_subtitle2
- avcodec_default_execute
- avcodec_default_execute2
- avcodec_default_get_buffer2
- avcodec_default_get_format
- avcodec_descriptor_get
- avcodec_descriptor_get_by_name
- avcodec_descriptor_next
--avcodec_enum_to_chroma_pos
- avcodec_fill_audio_frame
- avcodec_find_decoder
- avcodec_find_decoder_by_name
- avcodec_find_encoder
- avcodec_find_encoder_by_name
- avcodec_flush_buffers
- avcodec_free_context
- avcodec_get_class
-diff --git a/media/ffvpx/libavcodec/avcodec_internal.h b/media/ffvpx/libavcodec/avcodec_internal.h
---- a/media/ffvpx/libavcodec/avcodec_internal.h
-+++ b/media/ffvpx/libavcodec/avcodec_internal.h
-@@ -20,18 +20,32 @@
-  * APIs internal to the generic codec layer.
-  *
-  * MUST NOT be included by individual encoders or decoders.
-  */
- 
- #ifndef AVCODEC_AVCODEC_INTERNAL_H
- #define AVCODEC_AVCODEC_INTERNAL_H
- 
-+#include "libavutil/frame.h"
-+
-+#include "packet.h"
-+
- struct AVCodecContext;
--struct AVFrame;
-+
-+typedef struct SideDataMap {
-+    enum AVPacketSideDataType packet;
-+    enum AVFrameSideDataType frame;
-+} SideDataMap;
-+
-+/**
-+ * A map between packet and frame side data types.
-+ * Terminated with an entry where packet=AV_PKT_DATA_NB.
-+ */
-+extern const SideDataMap ff_sd_global_map[];
- 
- /**
-  * avcodec_receive_frame() implementation for decoders.
-  */
- int ff_decode_receive_frame(struct AVCodecContext *avctx, struct AVFrame *frame);
- 
- /**
-  * avcodec_receive_frame() implementation for encoders.
-@@ -51,9 +65,11 @@ int ff_encode_preinit(struct AVCodecCont
- int ff_decode_preinit(struct AVCodecContext *avctx);
- 
- void ff_decode_flush_buffers(struct AVCodecContext *avctx);
- void ff_encode_flush_buffers(struct AVCodecContext *avctx);
- 
- struct AVCodecInternal *ff_decode_internal_alloc(void);
- struct AVCodecInternal *ff_encode_internal_alloc(void);
- 
-+void ff_codec_close(struct AVCodecContext *avctx);
-+
- #endif // AVCODEC_AVCODEC_INTERNAL_H
-diff --git a/media/ffvpx/libavcodec/avdct.c b/media/ffvpx/libavcodec/avdct.c
---- a/media/ffvpx/libavcodec/avdct.c
-+++ b/media/ffvpx/libavcodec/avdct.c
-@@ -13,54 +13,55 @@
-  * 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/mem.h"
- #include "avcodec.h"
- #include "idctdsp.h"
- #include "fdctdsp.h"
- #include "pixblockdsp.h"
- #include "avdct.h"
- 
- #define OFFSET(x) offsetof(AVDCT,x)
- #define DEFAULT 0 //should be NAN but it does not work as it is not a constant in glibc as required by ANSI/ISO C
- //these names are too long to be readable
- #define V AV_OPT_FLAG_VIDEO_PARAM
- #define A AV_OPT_FLAG_AUDIO_PARAM
- #define E AV_OPT_FLAG_ENCODING_PARAM
- #define D AV_OPT_FLAG_DECODING_PARAM
- 
- static const AVOption avdct_options[] = {
--{"dct", "DCT algorithm", OFFSET(dct_algo), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|E, "dct"},
--{"auto", "autoselect a good one", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_AUTO }, INT_MIN, INT_MAX, V|E, "dct"},
--{"fastint", "fast integer (experimental / for debugging)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_FASTINT }, INT_MIN, INT_MAX, V|E, "dct"},
--{"int", "accurate integer", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_INT }, INT_MIN, INT_MAX, V|E, "dct"},
--{"mmx", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_MMX }, INT_MIN, INT_MAX, V|E, "dct"},
--{"altivec", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_ALTIVEC }, INT_MIN, INT_MAX, V|E, "dct"},
--{"faan", "floating point AAN DCT (experimental / for debugging)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_FAAN }, INT_MIN, INT_MAX, V|E, "dct"},
-+{"dct", "DCT algorithm", OFFSET(dct_algo), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|E, .unit = "dct"},
-+{"auto", "autoselect a good one", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_AUTO }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
-+{"fastint", "fast integer (experimental / for debugging)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_FASTINT }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
-+{"int", "accurate integer", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_INT }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
-+{"mmx", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_MMX }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
-+{"altivec", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_ALTIVEC }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
-+{"faan", "floating point AAN DCT (experimental / for debugging)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_FAAN }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
- 
--{"idct", "select IDCT implementation", OFFSET(idct_algo), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|E|D, "idct"},
--{"auto", "autoselect a good one", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_AUTO }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"int", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_INT }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simple", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLE }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simplemmx", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEMMX }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"arm", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_ARM }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"altivec", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_ALTIVEC }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simplearm", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARM }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simplearmv5te", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARMV5TE }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simplearmv6", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARMV6 }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simpleneon", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLENEON }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"xvid", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_XVID }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"xvidmmx", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_XVID }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"faani", "floating point AAN IDCT (experimental / for debugging)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_FAAN }, INT_MIN, INT_MAX, V|D|E, "idct"},
--{"simpleauto", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEAUTO }, INT_MIN, INT_MAX, V|E|D, "idct"},
-+{"idct", "select IDCT implementation", OFFSET(idct_algo), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|E|D, .unit = "idct"},
-+{"auto", "autoselect a good one", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_AUTO }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"int", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_INT }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simple", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLE }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simplemmx", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEMMX }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"arm", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_ARM }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"altivec", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_ALTIVEC }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simplearm", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARM }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simplearmv5te", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARMV5TE }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simplearmv6", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARMV6 }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simpleneon", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLENEON }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"xvid", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_XVID }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"xvidmmx", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_XVID }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"faani", "floating point AAN IDCT (experimental / for debugging)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_FAAN }, INT_MIN, INT_MAX, V|D|E, .unit = "idct"},
-+{"simpleauto", "experimental / for debugging", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEAUTO }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
- 
- {"bits_per_sample", "", OFFSET(bits_per_sample), AV_OPT_TYPE_INT, {.i64 = 8 }, 0, 14, 0,},
- {NULL},
- };
- 
- static const AVClass avdct_class = {
-     .class_name              = "AVDCT",
-     .option                  = avdct_options,
-diff --git a/media/ffvpx/libavcodec/avpicture.c b/media/ffvpx/libavcodec/avpicture.c
-deleted file mode 100644
---- a/media/ffvpx/libavcodec/avpicture.c
-+++ /dev/null
-@@ -1,82 +0,0 @@
--/*
-- * AVPicture management routines
-- * Copyright (c) 2001, 2002, 2003 Fabrice Bellard
-- *
-- * 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
-- * AVPicture management routines
-- */
--
--#include "avcodec.h"
--#include "internal.h"
--#include "libavutil/common.h"
--#include "libavutil/pixdesc.h"
--#include "libavutil/imgutils.h"
--#include "libavutil/internal.h"
--#include "libavutil/colorspace.h"
--
--#if FF_API_AVPICTURE
--FF_DISABLE_DEPRECATION_WARNINGS
--int avpicture_fill(AVPicture *picture, const uint8_t *ptr,
--                   enum AVPixelFormat pix_fmt, int width, int height)
--{
--    return av_image_fill_arrays(picture->data, picture->linesize,
--                                ptr, pix_fmt, width, height, 1);
--}
--
--int avpicture_layout(const AVPicture* src, enum AVPixelFormat pix_fmt, int width, int height,
--                     unsigned char *dest, int dest_size)
--{
--    return av_image_copy_to_buffer(dest, dest_size,
--                                   (const uint8_t * const*)src->data, src->linesize,
--                                   pix_fmt, width, height, 1);
--}
--
--int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height)
--{
--    return av_image_get_buffer_size(pix_fmt, width, height, 1);
--}
--
--int avpicture_alloc(AVPicture *picture,
--                    enum AVPixelFormat pix_fmt, int width, int height)
--{
--    int ret = av_image_alloc(picture->data, picture->linesize,
--                             width, height, pix_fmt, 1);
--    if (ret < 0) {
--        memset(picture, 0, sizeof(AVPicture));
--        return ret;
--    }
--
--    return 0;
--}
--
--void avpicture_free(AVPicture *picture)
--{
--    av_freep(&picture->data[0]);
--}
--
--void av_picture_copy(AVPicture *dst, const AVPicture *src,
--                     enum AVPixelFormat pix_fmt, int width, int height)
--{
--    av_image_copy(dst->data, dst->linesize, (const uint8_t **)src->data,
--                  src->linesize, pix_fmt, width, height);
--}
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif /* FF_API_AVPICTURE */
-diff --git a/media/ffvpx/libavcodec/bitstream_filters.c b/media/ffvpx/libavcodec/bitstream_filters.c
---- a/media/ffvpx/libavcodec/bitstream_filters.c
-+++ b/media/ffvpx/libavcodec/bitstream_filters.c
-@@ -41,28 +41,28 @@ extern const FFBitStreamFilter ff_h264_m
- extern const FFBitStreamFilter ff_h264_redundant_pps_bsf;
- extern const FFBitStreamFilter ff_hapqa_extract_bsf;
- extern const FFBitStreamFilter ff_hevc_metadata_bsf;
- extern const FFBitStreamFilter ff_hevc_mp4toannexb_bsf;
- extern const FFBitStreamFilter ff_imx_dump_header_bsf;
- extern const FFBitStreamFilter ff_media100_to_mjpegb_bsf;
- extern const FFBitStreamFilter ff_mjpeg2jpeg_bsf;
- extern const FFBitStreamFilter ff_mjpega_dump_header_bsf;
--extern const FFBitStreamFilter ff_mp3_header_decompress_bsf;
- extern const FFBitStreamFilter ff_mpeg2_metadata_bsf;
- extern const FFBitStreamFilter ff_mpeg4_unpack_bframes_bsf;
- extern const FFBitStreamFilter ff_mov2textsub_bsf;
- extern const FFBitStreamFilter ff_noise_bsf;
- extern const FFBitStreamFilter ff_null_bsf;
- extern const FFBitStreamFilter ff_opus_metadata_bsf;
- extern const FFBitStreamFilter ff_pcm_rechunk_bsf;
- extern const FFBitStreamFilter ff_pgs_frame_merge_bsf;
- extern const FFBitStreamFilter ff_prores_metadata_bsf;
- extern const FFBitStreamFilter ff_remove_extradata_bsf;
- extern const FFBitStreamFilter ff_setts_bsf;
-+extern const FFBitStreamFilter ff_showinfo_bsf;
- extern const FFBitStreamFilter ff_text2movsub_bsf;
- extern const FFBitStreamFilter ff_trace_headers_bsf;
- extern const FFBitStreamFilter ff_truehd_core_bsf;
- extern const FFBitStreamFilter ff_vp9_metadata_bsf;
- extern const FFBitStreamFilter ff_vp9_raw_reorder_bsf;
- extern const FFBitStreamFilter ff_vp9_superframe_bsf;
- extern const FFBitStreamFilter ff_vp9_superframe_split_bsf;
- extern const FFBitStreamFilter ff_vvc_metadata_bsf;
-diff --git a/media/ffvpx/libavcodec/blockdsp.h b/media/ffvpx/libavcodec/blockdsp.h
---- a/media/ffvpx/libavcodec/blockdsp.h
-+++ b/media/ffvpx/libavcodec/blockdsp.h
-@@ -36,12 +36,13 @@ typedef struct BlockDSPContext {
-     op_fill_func fill_block_tab[2];
- } BlockDSPContext;
- 
- void ff_blockdsp_init(BlockDSPContext *c);
- 
- void ff_blockdsp_init_alpha(BlockDSPContext *c);
- void ff_blockdsp_init_arm(BlockDSPContext *c);
- void ff_blockdsp_init_ppc(BlockDSPContext *c);
-+void ff_blockdsp_init_riscv(BlockDSPContext *c);
- void ff_blockdsp_init_x86(BlockDSPContext *c);
- void ff_blockdsp_init_mips(BlockDSPContext *c);
- 
- #endif /* AVCODEC_BLOCKDSP_H */
-diff --git a/media/ffvpx/libavcodec/av1_frame_split_bsf.c b/media/ffvpx/libavcodec/bsf/av1_frame_split.c
-rename from media/ffvpx/libavcodec/av1_frame_split_bsf.c
-rename to media/ffvpx/libavcodec/bsf/av1_frame_split.c
-diff --git a/media/ffvpx/libavcodec/bsf/moz.build b/media/ffvpx/libavcodec/bsf/moz.build
-new file mode 100644
---- /dev/null
-+++ b/media/ffvpx/libavcodec/bsf/moz.build
-@@ -0,0 +1,21 @@
-+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-+# vim: set filetype=python:
-+# This Source Code Form is subject to the terms of the Mozilla Public
-+# License, v. 2.0. If a copy of the MPL was not distributed with this
-+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-+#
-+if not CONFIG['MOZ_FFVPX_AUDIOONLY']:
-+    SOURCES += [
-+      'av1_frame_split.c',
-+      'vp9_superframe_split.c',
-+    ]
-+
-+SOURCES += [
-+    'null.c',
-+]
-+
-+LOCAL_INCLUDES += [ "../" ]
-+
-+FINAL_LIBRARY = 'mozavcodec'
-+
-+include('/media/ffvpx/ffvpxcommon.mozbuild')
-diff --git a/media/ffvpx/libavcodec/null_bsf.c b/media/ffvpx/libavcodec/bsf/null.c
-rename from media/ffvpx/libavcodec/null_bsf.c
-rename to media/ffvpx/libavcodec/bsf/null.c
-diff --git a/media/ffvpx/libavcodec/vp9_superframe_split_bsf.c b/media/ffvpx/libavcodec/bsf/vp9_superframe_split.c
-rename from media/ffvpx/libavcodec/vp9_superframe_split_bsf.c
-rename to media/ffvpx/libavcodec/bsf/vp9_superframe_split.c
-diff --git a/media/ffvpx/libavcodec/cbs.c b/media/ffvpx/libavcodec/cbs.c
---- a/media/ffvpx/libavcodec/cbs.c
-+++ b/media/ffvpx/libavcodec/cbs.c
-@@ -18,16 +18,17 @@
- 
- #include <string.h>
- 
- #include "config.h"
- 
- #include "libavutil/avassert.h"
- #include "libavutil/buffer.h"
- #include "libavutil/common.h"
-+#include "libavutil/mem.h"
- #include "libavutil/opt.h"
- 
- #include "avcodec.h"
- #include "cbs.h"
- #include "cbs_internal.h"
- #include "refstruct.h"
- 
- 
-diff --git a/media/ffvpx/libavcodec/cbs_av1.h b/media/ffvpx/libavcodec/cbs_av1.h
---- a/media/ffvpx/libavcodec/cbs_av1.h
-+++ b/media/ffvpx/libavcodec/cbs_av1.h
-@@ -422,16 +422,18 @@ typedef struct AV1ReferenceFrameState {
-     int render_width;   // RefRenderWidth
-     int render_height;  // RefRenderHeight
-     int frame_type;     // RefFrameType
-     int subsampling_x;  // RefSubsamplingX
-     int subsampling_y;  // RefSubsamplingY
-     int bit_depth;      // RefBitDepth
-     int order_hint;     // RefOrderHint
- 
-+    int saved_order_hints[AV1_TOTAL_REFS_PER_FRAME]; // SavedOrderHints[ref]
-+
-     int8_t  loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME];
-     int8_t  loop_filter_mode_deltas[2];
-     uint8_t feature_enabled[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX];
-     int16_t feature_value[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX];
- } AV1ReferenceFrameState;
- 
- typedef struct CodedBitstreamAV1Context {
-     const AVClass *class;
-@@ -459,16 +461,19 @@ typedef struct CodedBitstreamAV1Context 
- 
-     int num_planes;
-     int coded_lossless;
-     int all_lossless;
-     int tile_cols;
-     int tile_rows;
-     int tile_num;
- 
-+    int order_hints[AV1_TOTAL_REFS_PER_FRAME];         // OrderHints
-+    int ref_frame_sign_bias[AV1_TOTAL_REFS_PER_FRAME]; // RefFrameSignBias
-+
-     AV1ReferenceFrameState ref[AV1_NUM_REF_FRAMES];
- 
-     // AVOptions
-     int operating_point;
-     // When writing, fix the length in bytes of the obu_size field.
-     // Writing will fail with an error if an OBU larger than can be
-     // represented by the fixed size is encountered.
-     int fixed_obu_size_length;
-diff --git a/media/ffvpx/libavcodec/cbs_av1_syntax_template.c b/media/ffvpx/libavcodec/cbs_av1_syntax_template.c
---- a/media/ffvpx/libavcodec/cbs_av1_syntax_template.c
-+++ b/media/ffvpx/libavcodec/cbs_av1_syntax_template.c
-@@ -355,17 +355,17 @@ static int FUNC(set_frame_refs)(CodedBit
-         AV1_REF_FRAME_ALTREF2, AV1_REF_FRAME_ALTREF
-     };
-     int8_t ref_frame_idx[AV1_REFS_PER_FRAME], used_frame[AV1_NUM_REF_FRAMES];
-     int16_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[i] = AV1_REF_FRAME_NONE;
-     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;
- 
-@@ -373,78 +373,78 @@ static int FUNC(set_frame_refs)(CodedBit
-     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,
-                                                            priv->order_hint);
- 
-     latest_order_hint = shifted_order_hints[current->last_frame_idx];
-     earliest_order_hint = shifted_order_hints[current->golden_frame_idx];
- 
--    ref = -1;
-+    ref = AV1_REF_FRAME_NONE;
-     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;
-+    ref = AV1_REF_FRAME_NONE;
-     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;
-+    ref = AV1_REF_FRAME_NONE;
-     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;
-+            ref = AV1_REF_FRAME_NONE;
-             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;
-+    ref = AV1_REF_FRAME_NONE;
-     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++) {
-@@ -1409,16 +1409,18 @@ static int FUNC(uncompressed_header)(Cod
-             flag(error_resilient_mode);
-     }
- 
-     if (current->frame_type == AV1_FRAME_KEY && current->show_frame) {
-         for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
-             priv->ref[i].valid = 0;
-             priv->ref[i].order_hint = 0;
-         }
-+        for (i = 0; i < AV1_REFS_PER_FRAME; i++)
-+            priv->order_hints[i + AV1_REF_FRAME_LAST] = 0;
-     }
- 
-     flag(disable_cdf_update);
- 
-     if (seq->seq_force_screen_content_tools ==
-         AV1_SELECT_SCREEN_CONTENT_TOOLS) {
-         flag(allow_screen_content_tools);
-     } else {
-@@ -1563,21 +1565,30 @@ static int FUNC(uncompressed_header)(Cod
-         flag(is_motion_mode_switchable);
- 
-         if (current->error_resilient_mode ||
-             !seq->enable_ref_frame_mvs)
-             infer(use_ref_frame_mvs, 0);
-         else
-             flag(use_ref_frame_mvs);
- 
--        infer(allow_intrabc, 0);
--    }
-+        for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
-+            int ref_frame = AV1_REF_FRAME_LAST + i;
-+            int hint = priv->ref[current->ref_frame_idx[i]].order_hint;
-+            priv->order_hints[ref_frame] = hint;
-+            if (!seq->enable_order_hint) {
-+                priv->ref_frame_sign_bias[ref_frame] = 0;
-+            } else {
-+                priv->ref_frame_sign_bias[ref_frame] =
-+                    cbs_av1_get_relative_dist(seq, hint,
-+                                              current->order_hint) > 0;
-+            }
-+        }
- 
--    if (!frame_is_intra) {
--        // Derive reference frame sign biases.
-+        infer(allow_intrabc, 0);
-     }
- 
-     if (seq->reduced_still_picture_header || current->disable_cdf_update)
-         infer(disable_frame_end_update_cdf, 1);
-     else
-         flag(disable_frame_end_update_cdf);
- 
-     if (current->primary_ref_frame == AV1_PRIMARY_REF_NONE) {
-@@ -1669,16 +1680,22 @@ update_refs:
-                 .render_width   = priv->render_width,
-                 .render_height  = priv->render_height,
-                 .frame_type     = current->frame_type,
-                 .subsampling_x  = seq->color_config.subsampling_x,
-                 .subsampling_y  = seq->color_config.subsampling_y,
-                 .bit_depth      = priv->bit_depth,
-                 .order_hint     = priv->order_hint,
-             };
-+
-+            for (int j = 0; j < AV1_REFS_PER_FRAME; j++) {
-+                priv->ref[i].saved_order_hints[j + AV1_REF_FRAME_LAST] =
-+                    priv->order_hints[j + AV1_REF_FRAME_LAST];
-+            }
-+
-             memcpy(priv->ref[i].loop_filter_ref_deltas, current->loop_filter_ref_deltas,
-                    sizeof(current->loop_filter_ref_deltas));
-             memcpy(priv->ref[i].loop_filter_mode_deltas, current->loop_filter_mode_deltas,
-                    sizeof(current->loop_filter_mode_deltas));
-             memcpy(priv->ref[i].feature_enabled, current->feature_enabled,
-                    sizeof(current->feature_enabled));
-             memcpy(priv->ref[i].feature_value, current->feature_value,
-                    sizeof(current->feature_value));
-diff --git a/media/ffvpx/libavcodec/codec.h b/media/ffvpx/libavcodec/codec.h
---- a/media/ffvpx/libavcodec/codec.h
-+++ b/media/ffvpx/libavcodec/codec.h
-@@ -204,23 +204,16 @@ typedef struct AVCodec {
-      * see AV_CODEC_CAP_*
-      */
-     int capabilities;
-     uint8_t max_lowres;                     ///< maximum value for lowres supported by the decoder
-     const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0}
-     const enum AVPixelFormat *pix_fmts;     ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1
-     const int *supported_samplerates;       ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0
-     const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1
--#if FF_API_OLD_CHANNEL_LAYOUT
--    /**
--     * @deprecated use ch_layouts instead
--     */
--    attribute_deprecated
--    const uint64_t *channel_layouts;         ///< array of support channel layouts, or NULL if unknown. array is terminated by 0
--#endif
-     const AVClass *priv_class;              ///< AVClass for the private context
-     const AVProfile *profiles;              ///< array of recognized profiles, or NULL if unknown, array is terminated by {AV_PROFILE_UNKNOWN}
- 
-     /**
-      * Group name of the codec implementation.
-      * This is a short symbolic name of the wrapper backing this codec. A
-      * wrapper uses some kind of external implementation for the codec, such
-      * as an external library, or a codec implementation provided by the OS or
-diff --git a/media/ffvpx/libavcodec/codec_desc.c b/media/ffvpx/libavcodec/codec_desc.c
---- a/media/ffvpx/libavcodec/codec_desc.c
-+++ b/media/ffvpx/libavcodec/codec_desc.c
-@@ -1465,25 +1465,16 @@ static const AVCodecDescriptor codec_des
-     },
-     {
-         .id        = AV_CODEC_ID_AVUI,
-         .type      = AVMEDIA_TYPE_VIDEO,
-         .name      = "avui",
-         .long_name = NULL_IF_CONFIG_SMALL("Avid Meridien Uncompressed"),
-         .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
-     },
--#if FF_API_AYUV_CODECID
--    {
--        .id        = AV_CODEC_ID_AYUV,
--        .type      = AVMEDIA_TYPE_VIDEO,
--        .name      = "ayuv",
--        .long_name = NULL_IF_CONFIG_SMALL("Uncompressed packed MS 4:4:4:4"),
--        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
--    },
--#endif
-     {
-         .id        = AV_CODEC_ID_TARGA_Y216,
-         .type      = AVMEDIA_TYPE_VIDEO,
-         .name      = "targa_y216",
-         .long_name = NULL_IF_CONFIG_SMALL("Pinnacle TARGA CineWave YUV16"),
-         .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
-     },
-     {
-@@ -3429,16 +3420,23 @@ static const AVCodecDescriptor codec_des
-     },
-     {
-         .id        = AV_CODEC_ID_QOA,
-         .type      = AVMEDIA_TYPE_AUDIO,
-         .name      = "qoa",
-         .long_name = NULL_IF_CONFIG_SMALL("QOA (Quite OK Audio)"),
-         .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
-     },
-+    {
-+        .id        = AV_CODEC_ID_LC3,
-+        .type      = AVMEDIA_TYPE_AUDIO,
-+        .name      = "lc3",
-+        .long_name = NULL_IF_CONFIG_SMALL("LC3 (Low Complexity Communication Codec)"),
-+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
-+    },
- 
-     /* subtitle codecs */
-     {
-         .id        = AV_CODEC_ID_DVD_SUBTITLE,
-         .type      = AVMEDIA_TYPE_SUBTITLE,
-         .name      = "dvd_subtitle",
-         .long_name = NULL_IF_CONFIG_SMALL("DVD subtitles"),
-         .props     = AV_CODEC_PROP_BITMAP_SUB,
-diff --git a/media/ffvpx/libavcodec/codec_id.h b/media/ffvpx/libavcodec/codec_id.h
---- a/media/ffvpx/libavcodec/codec_id.h
-+++ b/media/ffvpx/libavcodec/codec_id.h
-@@ -248,19 +248,16 @@ enum AVCodecID {
-     AV_CODEC_ID_AVS3,
-     AV_CODEC_ID_MSP2,
-     AV_CODEC_ID_VVC,
- #define AV_CODEC_ID_H266 AV_CODEC_ID_VVC
-     AV_CODEC_ID_Y41P,
-     AV_CODEC_ID_AVRP,
-     AV_CODEC_ID_012V,
-     AV_CODEC_ID_AVUI,
--#if FF_API_AYUV_CODECID
--    AV_CODEC_ID_AYUV,
--#endif
-     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,
-@@ -541,16 +538,17 @@ enum AVCodecID {
-     AV_CODEC_ID_MISC4,
-     AV_CODEC_ID_APAC,
-     AV_CODEC_ID_FTR,
-     AV_CODEC_ID_WAVARC,
-     AV_CODEC_ID_RKA,
-     AV_CODEC_ID_AC4,
-     AV_CODEC_ID_OSQ,
-     AV_CODEC_ID_QOA,
-+    AV_CODEC_ID_LC3,
- 
-     /* 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,
-diff --git a/media/ffvpx/libavcodec/codec_internal.h b/media/ffvpx/libavcodec/codec_internal.h
---- a/media/ffvpx/libavcodec/codec_internal.h
-+++ b/media/ffvpx/libavcodec/codec_internal.h
-@@ -279,35 +279,16 @@ typedef struct FFCodec {
-         .update_thread_context_for_user = (func)
- #else
- #define UPDATE_THREAD_CONTEXT(func) \
-         .update_thread_context          = NULL
- #define UPDATE_THREAD_CONTEXT_FOR_USER(func) \
-         .update_thread_context_for_user = NULL
- #endif
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--#define CODEC_OLD_CHANNEL_LAYOUTS(...) CODEC_OLD_CHANNEL_LAYOUTS_ARRAY(((const uint64_t[]) { __VA_ARGS__, 0 }))
--#if defined(__clang__)
--#define CODEC_OLD_CHANNEL_LAYOUTS_ARRAY(array) \
--        FF_DISABLE_DEPRECATION_WARNINGS \
--        .p.channel_layouts = (array), \
--        FF_ENABLE_DEPRECATION_WARNINGS
--#else
--#define CODEC_OLD_CHANNEL_LAYOUTS_ARRAY(array) .p.channel_layouts = (array),
--#endif
--#else
--/* This is only provided to allow to test disabling FF_API_OLD_CHANNEL_LAYOUT
-- * without removing all the FF_API_OLD_CHANNEL_LAYOUT codeblocks.
-- * It is of course still expected to be removed when FF_API_OLD_CHANNEL_LAYOUT
-- * will be finally removed (along with all usages of these macros). */
--#define CODEC_OLD_CHANNEL_LAYOUTS(...)
--#define CODEC_OLD_CHANNEL_LAYOUTS_ARRAY(array)
--#endif
--
- #define FF_CODEC_DECODE_CB(func)                          \
-     .cb_type           = FF_CODEC_CB_TYPE_DECODE,         \
-     .cb.decode         = (func)
- #define FF_CODEC_DECODE_SUB_CB(func)                      \
-     .cb_type           = FF_CODEC_CB_TYPE_DECODE_SUB,     \
-     .cb.decode_sub     = (func)
- #define FF_CODEC_RECEIVE_FRAME_CB(func)                   \
-     .cb_type           = FF_CODEC_CB_TYPE_RECEIVE_FRAME,  \
-diff --git a/media/ffvpx/libavcodec/codec_par.c b/media/ffvpx/libavcodec/codec_par.c
---- a/media/ffvpx/libavcodec/codec_par.c
-+++ b/media/ffvpx/libavcodec/codec_par.c
-@@ -163,42 +163,19 @@ int avcodec_parameters_from_context(AVCo
-         par->color_space         = codec->colorspace;
-         par->chroma_location     = codec->chroma_sample_location;
-         par->sample_aspect_ratio = codec->sample_aspect_ratio;
-         par->video_delay         = codec->has_b_frames;
-         par->framerate           = codec->framerate;
-         break;
-     case AVMEDIA_TYPE_AUDIO:
-         par->format           = codec->sample_fmt;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--        // if the old/new fields are set inconsistently, prefer the old ones
--        if ((codec->channels && codec->channels != codec->ch_layout.nb_channels) ||
--            (codec->channel_layout && (codec->ch_layout.order != AV_CHANNEL_ORDER_NATIVE ||
--                                       codec->ch_layout.u.mask != codec->channel_layout))) {
--            if (codec->channel_layout)
--                av_channel_layout_from_mask(&par->ch_layout, codec->channel_layout);
--            else {
--                par->ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
--                par->ch_layout.nb_channels = codec->channels;
--            }
--FF_ENABLE_DEPRECATION_WARNINGS
--        } else {
--#endif
-         ret = av_channel_layout_copy(&par->ch_layout, &codec->ch_layout);
-         if (ret < 0)
-             return ret;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--        }
--        par->channel_layout  = par->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
--                               par->ch_layout.u.mask : 0;
--        par->channels        = par->ch_layout.nb_channels;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-         par->sample_rate      = codec->sample_rate;
-         par->block_align      = codec->block_align;
-         par->frame_size       = codec->frame_size;
-         par->initial_padding  = codec->initial_padding;
-         par->trailing_padding = codec->trailing_padding;
-         par->seek_preroll     = codec->seek_preroll;
-         break;
-     case AVMEDIA_TYPE_SUBTITLE:
-@@ -250,42 +227,19 @@ int avcodec_parameters_to_context(AVCode
-         codec->colorspace             = par->color_space;
-         codec->chroma_sample_location = par->chroma_location;
-         codec->sample_aspect_ratio    = par->sample_aspect_ratio;
-         codec->has_b_frames           = par->video_delay;
-         codec->framerate              = par->framerate;
-         break;
-     case AVMEDIA_TYPE_AUDIO:
-         codec->sample_fmt       = par->format;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--        // if the old/new fields are set inconsistently, prefer the old ones
--        if ((par->channels && par->channels != par->ch_layout.nb_channels) ||
--            (par->channel_layout && (par->ch_layout.order != AV_CHANNEL_ORDER_NATIVE ||
--                                     par->ch_layout.u.mask != par->channel_layout))) {
--            if (par->channel_layout)
--                av_channel_layout_from_mask(&codec->ch_layout, par->channel_layout);
--            else {
--                codec->ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
--                codec->ch_layout.nb_channels = par->channels;
--            }
--FF_ENABLE_DEPRECATION_WARNINGS
--        } else {
--#endif
-         ret = av_channel_layout_copy(&codec->ch_layout, &par->ch_layout);
-         if (ret < 0)
-             return ret;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--        }
--        codec->channel_layout = codec->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
--                                codec->ch_layout.u.mask : 0;
--        codec->channels       = codec->ch_layout.nb_channels;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-         codec->sample_rate      = par->sample_rate;
-         codec->block_align      = par->block_align;
-         codec->frame_size       = par->frame_size;
-         codec->delay            =
-         codec->initial_padding  = par->initial_padding;
-         codec->trailing_padding = par->trailing_padding;
-         codec->seek_preroll     = par->seek_preroll;
-         break;
-diff --git a/media/ffvpx/libavcodec/codec_par.h b/media/ffvpx/libavcodec/codec_par.h
---- a/media/ffvpx/libavcodec/codec_par.h
-+++ b/media/ffvpx/libavcodec/codec_par.h
-@@ -68,16 +68,29 @@ typedef struct AVCodecParameters {
-      */
-     uint8_t *extradata;
-     /**
-      * Size of the extradata content in bytes.
-      */
-     int      extradata_size;
- 
-     /**
-+     * Additional data associated with the entire stream.
-+     *
-+     * Should be allocated with av_packet_side_data_new() or
-+     * av_packet_side_data_add(), and will be freed by avcodec_parameters_free().
-+     */
-+    AVPacketSideData *coded_side_data;
-+
-+    /**
-+     * Amount of entries in @ref coded_side_data.
-+     */
-+    int nb_coded_side_data;
-+
-+    /**
-      * - video: the pixel format, the value corresponds to enum AVPixelFormat.
-      * - audio: the sample format, the value corresponds to enum AVSampleFormat.
-      */
-     int format;
- 
-     /**
-      * The average bitrate of the encoded data (in bits per second).
-      */
-@@ -126,16 +139,28 @@ typedef struct AVCodecParameters {
-      * should have when displayed.
-      *
-      * When the aspect ratio is unknown / undefined, the numerator should be
-      * set to 0 (the denominator may have any value).
-      */
-     AVRational sample_aspect_ratio;
- 
-     /**
-+     * Video only. Number of frames per second, for streams with constant frame
-+     * durations. Should be set to { 0, 1 } when some frames have differing
-+     * durations or if the value is not known.
-+     *
-+     * @note This field correponds to values that are stored in codec-level
-+     * headers and is typically overridden by container/transport-layer
-+     * timestamps, when available. It should thus be used only as a last resort,
-+     * when no higher-level timing information is available.
-+     */
-+    AVRational framerate;
-+
-+    /**
-      * Video only. The order of the fields in interlaced video.
-      */
-     enum AVFieldOrder                  field_order;
- 
-     /**
-      * Video only. Additional colorspace characteristics.
-      */
-     enum AVColorRange                  color_range;
-@@ -144,32 +169,20 @@ typedef struct AVCodecParameters {
-     enum AVColorSpace                  color_space;
-     enum AVChromaLocation              chroma_location;
- 
-     /**
-      * Video only. Number of delayed frames.
-      */
-     int video_delay;
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
-     /**
--     * Audio only. The channel layout bitmask. May be 0 if the channel layout is
--     * unknown or unspecified, otherwise the number of bits set must be equal to
--     * the channels field.
--     * @deprecated use ch_layout
-+     * Audio only. The channel layout and number of channels.
-      */
--    attribute_deprecated
--    uint64_t channel_layout;
--    /**
--     * Audio only. The number of audio channels.
--     * @deprecated use ch_layout.nb_channels
--     */
--    attribute_deprecated
--    int      channels;
--#endif
-+    AVChannelLayout ch_layout;
-     /**
-      * Audio only. The number of audio samples per second.
-      */
-     int      sample_rate;
-     /**
-      * Audio only. The number of bytes per coded audio frame, required by some
-      * formats.
-      *
-@@ -194,46 +207,16 @@ typedef struct AVCodecParameters {
-      * discarded by the caller from the end of the stream to get the original
-      * audio without any trailing padding.
-      */
-     int trailing_padding;
-     /**
-      * Audio only. Number of samples to skip after a discontinuity.
-      */
-     int seek_preroll;
--
--    /**
--     * Audio only. The channel layout and number of channels.
--     */
--    AVChannelLayout ch_layout;
--
--    /**
--     * Video only. Number of frames per second, for streams with constant frame
--     * durations. Should be set to { 0, 1 } when some frames have differing
--     * durations or if the value is not known.
--     *
--     * @note This field correponds to values that are stored in codec-level
--     * headers and is typically overridden by container/transport-layer
--     * timestamps, when available. It should thus be used only as a last resort,
--     * when no higher-level timing information is available.
--     */
--    AVRational framerate;
--
--    /**
--     * Additional data associated with the entire stream.
--     *
--     * Should be allocated with av_packet_side_data_new() or
--     * av_packet_side_data_add(), and will be freed by avcodec_parameters_free().
--     */
--    AVPacketSideData *coded_side_data;
--
--    /**
--     * Amount of entries in @ref coded_side_data.
--     */
--    int nb_coded_side_data;
- } AVCodecParameters;
- 
- /**
-  * Allocate a new AVCodecParameters and set its fields to default values
-  * (unknown/invalid/0). The returned struct must be freed with
-  * avcodec_parameters_free().
-  */
- AVCodecParameters *avcodec_parameters_alloc(void);
-diff --git a/media/ffvpx/libavcodec/decode.c b/media/ffvpx/libavcodec/decode.c
---- a/media/ffvpx/libavcodec/decode.c
-+++ b/media/ffvpx/libavcodec/decode.c
-@@ -30,16 +30,18 @@
- #include "libavutil/avassert.h"
- #include "libavutil/channel_layout.h"
- #include "libavutil/common.h"
- #include "libavutil/emms.h"
- #include "libavutil/frame.h"
- #include "libavutil/hwcontext.h"
- #include "libavutil/imgutils.h"
- #include "libavutil/internal.h"
-+#include "libavutil/mastering_display_metadata.h"
-+#include "libavutil/mem.h"
- 
- #include "avcodec.h"
- #include "avcodec_internal.h"
- #include "bytestream.h"
- #include "bsf.h"
- #include "codec_desc.h"
- #include "codec_internal.h"
- #include "decode.h"
-@@ -55,16 +57,27 @@ typedef struct DecodeContext {
- 
-     /* to prevent infinite loop on errors when draining */
-     int nb_draining_errors;
- 
-     /**
-      * The caller has submitted a NULL packet on input.
-      */
-     int draining_started;
-+
-+    int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far
-+    int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far
-+    int64_t pts_correction_last_pts;       /// PTS of the last frame
-+    int64_t pts_correction_last_dts;       /// DTS of the last frame
-+
-+    /**
-+     * Bitmask indicating for which side data types we prefer user-supplied
-+     * (global or attached to packets) side data over bytestream.
-+     */
-+    uint64_t side_data_pref_mask;
- } DecodeContext;
- 
- static DecodeContext *decode_ctx(AVCodecInternal *avci)
- {
-     return (DecodeContext *)avci;
- }
- 
- static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt)
-@@ -87,49 +100,16 @@ static int apply_param_change(AVCodecCon
-     }
- 
-     if (size < 4)
-         goto fail;
- 
-     flags = bytestream_get_le32(&data);
-     size -= 4;
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) {
--        if (size < 4)
--            goto fail;
--        val = bytestream_get_le32(&data);
--        if (val <= 0 || val > INT_MAX) {
--            av_log(avctx, AV_LOG_ERROR, "Invalid channel count");
--            ret = AVERROR_INVALIDDATA;
--            goto fail2;
--        }
--        av_channel_layout_uninit(&avctx->ch_layout);
--        avctx->ch_layout.nb_channels = val;
--        avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
--        size -= 4;
--    }
--    if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) {
--        if (size < 8)
--            goto fail;
--        av_channel_layout_uninit(&avctx->ch_layout);
--        ret = av_channel_layout_from_mask(&avctx->ch_layout, bytestream_get_le64(&data));
--        if (ret < 0)
--            goto fail2;
--        size -= 8;
--    }
--    if (flags & (AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT |
--                 AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)) {
--        avctx->channels = avctx->ch_layout.nb_channels;
--        avctx->channel_layout = (avctx->ch_layout.order == AV_CHANNEL_ORDER_NATIVE) ?
--                                avctx->ch_layout.u.mask : 0;
--    }
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     if (flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) {
-         if (size < 4)
-             goto fail;
-         val = bytestream_get_le32(&data);
-         if (val <= 0 || val > INT_MAX) {
-             av_log(avctx, AV_LOG_ERROR, "Invalid sample rate");
-             ret = AVERROR_INVALIDDATA;
-             goto fail2;
-@@ -268,34 +248,34 @@ int ff_decode_get_packet(AVCodecContext 
-  * which might have incorrect times. Input timestamps may wrap around, in
-  * which case the output will as well.
-  *
-  * @param pts the pts field of the decoded AVPacket, as passed through
-  * AVFrame.pts
-  * @param dts the dts field of the decoded AVPacket
-  * @return one of the input values, may be AV_NOPTS_VALUE
-  */
--static int64_t guess_correct_pts(AVCodecContext *ctx,
-+static int64_t guess_correct_pts(DecodeContext *dc,
-                                  int64_t reordered_pts, int64_t dts)
- {
-     int64_t pts = AV_NOPTS_VALUE;
- 
-     if (dts != AV_NOPTS_VALUE) {
--        ctx->pts_correction_num_faulty_dts += dts <= ctx->pts_correction_last_dts;
--        ctx->pts_correction_last_dts = dts;
-+        dc->pts_correction_num_faulty_dts += dts <= dc->pts_correction_last_dts;
-+        dc->pts_correction_last_dts = dts;
-     } else if (reordered_pts != AV_NOPTS_VALUE)
--        ctx->pts_correction_last_dts = reordered_pts;
-+        dc->pts_correction_last_dts = reordered_pts;
- 
-     if (reordered_pts != AV_NOPTS_VALUE) {
--        ctx->pts_correction_num_faulty_pts += reordered_pts <= ctx->pts_correction_last_pts;
--        ctx->pts_correction_last_pts = reordered_pts;
-+        dc->pts_correction_num_faulty_pts += reordered_pts <= dc->pts_correction_last_pts;
-+        dc->pts_correction_last_pts = reordered_pts;
-     } else if(dts != AV_NOPTS_VALUE)
--        ctx->pts_correction_last_pts = dts;
-+        dc->pts_correction_last_pts = dts;
- 
--    if ((ctx->pts_correction_num_faulty_pts<=ctx->pts_correction_num_faulty_dts || dts == AV_NOPTS_VALUE)
-+    if ((dc->pts_correction_num_faulty_pts<=dc->pts_correction_num_faulty_dts || dts == AV_NOPTS_VALUE)
-        && reordered_pts != AV_NOPTS_VALUE)
-         pts = reordered_pts;
-     else
-         pts = dts;
- 
-     return pts;
- }
- 
-@@ -577,25 +557,16 @@ static int fill_frame_props(const AVCode
-     } else if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
-         if (frame->format == AV_SAMPLE_FMT_NONE)
-             frame->format = avctx->sample_fmt;
-         if (!frame->ch_layout.nb_channels) {
-             ret = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);
-             if (ret < 0)
-                 return ret;
-         }
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--        if (!frame->channel_layout)
--            frame->channel_layout = avctx->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
--                                    avctx->ch_layout.u.mask : 0;
--        if (!frame->channels)
--            frame->channels = avctx->ch_layout.nb_channels;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-         if (!frame->sample_rate)
-             frame->sample_rate = avctx->sample_rate;
-     }
- 
-     return 0;
- }
- 
- static int decode_simple_receive_frame(AVCodecContext *avctx, AVFrame *frame)
-@@ -612,16 +583,17 @@ static int decode_simple_receive_frame(A
-     }
- 
-     return 0;
- }
- 
- static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
- {
-     AVCodecInternal *avci = avctx->internal;
-+    DecodeContext     *dc = decode_ctx(avci);
-     const FFCodec *const codec = ffcodec(avctx->codec);
-     int ret, ok;
- 
-     av_assert0(!frame->buf[0]);
- 
-     if (codec->cb_type == FF_CODEC_CB_TYPE_RECEIVE_FRAME) {
-         ret = codec->cb.receive_frame(avctx, frame);
-         emms_c();
-@@ -667,26 +639,20 @@ FF_DISABLE_DEPRECATION_WARNINGS
- FF_ENABLE_DEPRECATION_WARNINGS
- #endif
- #if FF_API_INTERLACED_FRAME
- FF_DISABLE_DEPRECATION_WARNINGS
-         frame->interlaced_frame = !!(frame->flags & AV_FRAME_FLAG_INTERLACED);
-         frame->top_field_first =  !!(frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST);
- FF_ENABLE_DEPRECATION_WARNINGS
- #endif
--        frame->best_effort_timestamp = guess_correct_pts(avctx,
-+        frame->best_effort_timestamp = guess_correct_pts(dc,
-                                                          frame->pts,
-                                                          frame->pkt_dts);
- 
--#if FF_API_PKT_DURATION
--FF_DISABLE_DEPRECATION_WARNINGS
--        frame->pkt_duration = frame->duration;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
-         /* the only case where decode data is not set should be decoders
-          * that do not call ff_get_buffer() */
-         av_assert0((frame->private_ref && frame->private_ref->size == sizeof(FrameDecodeData)) ||
-                    !(avctx->codec->capabilities & AV_CODEC_CAP_DR1));
- 
-         if (frame->private_ref) {
-             FrameDecodeData *fdd = (FrameDecodeData*)frame->private_ref->data;
- 
-@@ -815,21 +781,16 @@ int ff_decode_receive_frame(AVCodecConte
- 
-     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
-         ret = apply_cropping(avctx, frame);
-         if (ret < 0)
-             goto fail;
-     }
- 
-     avctx->frame_num++;
--#if FF_API_AVCTX_FRAME_NUMBER
--FF_DISABLE_DEPRECATION_WARNINGS
--    avctx->frame_number = avctx->frame_num;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
- 
- #if FF_API_DROPCHANGED
-     if (avctx->flags & AV_CODEC_FLAG_DROPCHANGED) {
- 
-         if (avctx->frame_num == 1) {
-             avci->initial_format = frame->format;
-             switch(avctx->codec_type) {
-             case AVMEDIA_TYPE_VIDEO:
-@@ -972,18 +933,18 @@ int avcodec_decode_subtitle2(AVCodecCont
-     int ret = 0;
- 
-     if (!avpkt->data && avpkt->size) {
-         av_log(avctx, AV_LOG_ERROR, "invalid packet: NULL data, size != 0\n");
-         return AVERROR(EINVAL);
-     }
-     if (!avctx->codec)
-         return AVERROR(EINVAL);
--    if (avctx->codec->type != AVMEDIA_TYPE_SUBTITLE) {
--        av_log(avctx, AV_LOG_ERROR, "Invalid media type for subtitles\n");
-+    if (ffcodec(avctx->codec)->cb_type != FF_CODEC_CB_TYPE_DECODE_SUB) {
-+        av_log(avctx, AV_LOG_ERROR, "Codec not subtitle decoder\n");
-         return AVERROR(EINVAL);
-     }
- 
-     *got_sub_ptr = 0;
-     get_subtitle_defaults(sub);
- 
-     if ((avctx->codec->capabilities & AV_CODEC_CAP_DELAY) || avpkt->size) {
-         AVCodecInternal *avci = avctx->internal;
-@@ -1027,21 +988,16 @@ int avcodec_decode_subtitle2(AVCodecCont
-                 avsubtitle_free(sub);
-                 *got_sub_ptr = 0;
-                 return AVERROR_INVALIDDATA;
-             }
-         }
- 
-         if (*got_sub_ptr)
-             avctx->frame_num++;
--#if FF_API_AVCTX_FRAME_NUMBER
--FF_DISABLE_DEPRECATION_WARNINGS
--        avctx->frame_number = avctx->frame_num;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     }
- 
-     return ret;
- }
- 
- enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *avctx,
-                                               const enum AVPixelFormat *fmt)
- {
-@@ -1366,18 +1322,18 @@ int ff_get_format(AVCodecContext *avctx,
-                    AV_CODEC_HW_CONFIG_METHOD_AD_HOC) {
-             // Some ad-hoc configuration we can't see and can't check.
-         } else {
-             av_log(avctx, AV_LOG_ERROR, "Invalid setup for format %s: "
-                    "missing configuration.\n", desc->name);
-             goto try_again;
-         }
-         if (hw_config->hwaccel) {
--            av_log(avctx, AV_LOG_DEBUG, "Format %s requires hwaccel "
--                   "initialisation.\n", desc->name);
-+            av_log(avctx, AV_LOG_DEBUG, "Format %s requires hwaccel %s "
-+                   "initialisation.\n", desc->name, hw_config->hwaccel->p.name);
-             err = hwaccel_init(avctx, hw_config->hwaccel);
-             if (err < 0)
-                 goto try_again;
-         }
-         ret = user_choice;
-         break;
- 
-     try_again:
-@@ -1416,60 +1372,46 @@ static int add_metadata_from_side_data(c
- 
-     AVDictionary **frame_md = &frame->metadata;
- 
-     side_metadata = av_packet_get_side_data(avpkt,
-                                             AV_PKT_DATA_STRINGS_METADATA, &size);
-     return av_packet_unpack_dictionary(side_metadata, size, frame_md);
- }
- 
--static const struct {
--    enum AVPacketSideDataType packet;
--    enum AVFrameSideDataType frame;
--} sd_global_map[] = {
--    { AV_PKT_DATA_REPLAYGAIN ,                AV_FRAME_DATA_REPLAYGAIN },
--    { AV_PKT_DATA_DISPLAYMATRIX,              AV_FRAME_DATA_DISPLAYMATRIX },
--    { AV_PKT_DATA_SPHERICAL,                  AV_FRAME_DATA_SPHERICAL },
--    { AV_PKT_DATA_STEREO3D,                   AV_FRAME_DATA_STEREO3D },
--    { AV_PKT_DATA_AUDIO_SERVICE_TYPE,         AV_FRAME_DATA_AUDIO_SERVICE_TYPE },
--    { 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_ICC_PROFILE,                AV_FRAME_DATA_ICC_PROFILE },
--    { AV_PKT_DATA_DYNAMIC_HDR10_PLUS,         AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
--};
--
- int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx,
-                                    AVFrame *frame, const AVPacket *pkt)
- {
-     static const struct {
-         enum AVPacketSideDataType packet;
-         enum AVFrameSideDataType frame;
-     } sd[] = {
-         { AV_PKT_DATA_A53_CC,                     AV_FRAME_DATA_A53_CC },
-         { AV_PKT_DATA_AFD,                        AV_FRAME_DATA_AFD },
-+        { AV_PKT_DATA_DYNAMIC_HDR10_PLUS,         AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
-         { AV_PKT_DATA_S12M_TIMECODE,              AV_FRAME_DATA_S12M_TIMECODE },
-         { AV_PKT_DATA_SKIP_SAMPLES,               AV_FRAME_DATA_SKIP_SAMPLES },
-     };
- 
-     frame->pts          = pkt->pts;
-     frame->duration     = pkt->duration;
- #if FF_API_FRAME_PKT
- FF_DISABLE_DEPRECATION_WARNINGS
-     frame->pkt_pos      = pkt->pos;
-     frame->pkt_size     = pkt->size;
- FF_ENABLE_DEPRECATION_WARNINGS
- #endif
- 
--    for (int i = 0; i < FF_ARRAY_ELEMS(sd_global_map); i++) {
-+    for (int i = 0; ff_sd_global_map[i].packet < AV_PKT_DATA_NB; i++) {
-         size_t size;
--        const uint8_t *packet_sd = av_packet_get_side_data(pkt, sd_global_map[i].packet, &size);
-+        const uint8_t *packet_sd = av_packet_get_side_data(pkt, ff_sd_global_map[i].packet, &size);
-         if (packet_sd) {
-             AVFrameSideData *frame_sd;
- 
--            frame_sd = av_frame_new_side_data(frame, sd_global_map[i].frame, size);
-+            frame_sd = av_frame_new_side_data(frame, ff_sd_global_map[i].frame, size);
-             if (!frame_sd)
-                 return AVERROR(ENOMEM);
-             memcpy(frame_sd->data, packet_sd, size);
-         }
-     }
-     for (int i = 0; i < FF_ARRAY_ELEMS(sd); i++) {
-         size_t size;
-         uint8_t *packet_sd = av_packet_get_side_data(pkt, sd[i].packet, &size);
-@@ -1500,22 +1442,22 @@ FF_ENABLE_DEPRECATION_WARNINGS
- 
-     return 0;
- }
- 
- int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
- {
-     int ret;
- 
--    for (int i = 0; i < FF_ARRAY_ELEMS(sd_global_map); i++) {
-+    for (int i = 0; ff_sd_global_map[i].packet < AV_PKT_DATA_NB; i++) {
-         const AVPacketSideData *packet_sd = ff_get_coded_side_data(avctx,
--                                                                   sd_global_map[i].packet);
-+                                                                   ff_sd_global_map[i].packet);
-         if (packet_sd) {
-             AVFrameSideData *frame_sd = av_frame_new_side_data(frame,
--                                                               sd_global_map[i].frame,
-+                                                               ff_sd_global_map[i].frame,
-                                                                packet_sd->size);
-             if (!frame_sd)
-                 return AVERROR(ENOMEM);
- 
-             memcpy(frame_sd->data, packet_sd->data, packet_sd->size);
-         }
-     }
- 
-@@ -1526,21 +1468,16 @@ int ff_decode_frame_props(AVCodecContext
-         if (ret < 0)
-             return ret;
- #if FF_API_FRAME_PKT
- FF_DISABLE_DEPRECATION_WARNINGS
-         frame->pkt_size = pkt->stream_index;
- FF_ENABLE_DEPRECATION_WARNINGS
- #endif
-     }
--#if FF_API_REORDERED_OPAQUE
--FF_DISABLE_DEPRECATION_WARNINGS
--    frame->reordered_opaque = avctx->reordered_opaque;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
- 
-     ret = fill_frame_props(avctx, frame);
-     if (ret < 0)
-         return ret;
- 
-     switch (avctx->codec->type) {
-     case AVMEDIA_TYPE_VIDEO:
-         if (frame->width && frame->height &&
-@@ -1637,25 +1574,16 @@ int ff_get_buffer(AVCodecContext *avctx,
-         }
- 
-         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");
-             ret = AVERROR(EINVAL);
-             goto fail;
-         }
-     } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--        /* compat layer for old-style get_buffer() implementations */
--        avctx->channels = avctx->ch_layout.nb_channels;
--        avctx->channel_layout = (avctx->ch_layout.order == AV_CHANNEL_ORDER_NATIVE) ?
--                                avctx->ch_layout.u.mask : 0;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
-         if (frame->nb_samples * (int64_t)avctx->ch_layout.nb_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)
-@@ -1738,16 +1666,17 @@ int ff_reget_buffer(AVCodecContext *avct
-     if (ret < 0)
-         av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
-     return ret;
- }
- 
- int ff_decode_preinit(AVCodecContext *avctx)
- {
-     AVCodecInternal *avci = avctx->internal;
-+    DecodeContext     *dc = decode_ctx(avci);
-     int ret = 0;
- 
-     /* if the decoder init function was already called previously,
-      * free the already allocated subtitle_header before overwriting it */
-     av_freep(&avctx->subtitle_header);
- 
-     if (avctx->codec->max_lowres < avctx->lowres || avctx->lowres < 0) {
-         av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
-@@ -1785,29 +1714,58 @@ int ff_decode_preinit(AVCodecContext *av
-                        "conversion needs a libavcodec built with iconv support "
-                        "for this codec\n");
-                 return AVERROR(ENOSYS);
- #endif
-             }
-         }
-     }
- 
--    avctx->pts_correction_num_faulty_pts =
--    avctx->pts_correction_num_faulty_dts = 0;
--    avctx->pts_correction_last_pts =
--    avctx->pts_correction_last_dts = INT64_MIN;
-+    dc->pts_correction_num_faulty_pts =
-+    dc->pts_correction_num_faulty_dts = 0;
-+    dc->pts_correction_last_pts =
-+    dc->pts_correction_last_dts = INT64_MIN;
- 
-     if (   !CONFIG_GRAY && avctx->flags & AV_CODEC_FLAG_GRAY
-         && 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->nb_side_data_prefer_packet == 1 &&
-+        avctx->side_data_prefer_packet[0] == -1)
-+        dc->side_data_pref_mask = ~0ULL;
-+    else {
-+        for (unsigned i = 0; i < avctx->nb_side_data_prefer_packet; i++) {
-+            int val = avctx->side_data_prefer_packet[i];
-+
-+            if (val < 0 || val >= AV_PKT_DATA_NB) {
-+                av_log(avctx, AV_LOG_ERROR, "Invalid side data type: %d\n", val);
-+                return AVERROR(EINVAL);
-+            }
-+
-+            for (unsigned j = 0; ff_sd_global_map[j].packet < AV_PKT_DATA_NB; j++) {
-+                if (ff_sd_global_map[j].packet == val) {
-+                    val = ff_sd_global_map[j].frame;
-+
-+                    // this code will need to be changed when we have more than
-+                    // 64 frame side data types
-+                    if (val >= 64) {
-+                        av_log(avctx, AV_LOG_ERROR, "Side data type too big\n");
-+                        return AVERROR_BUG;
-+                    }
-+
-+                    dc->side_data_pref_mask |= 1ULL << val;
-+                }
-+            }
-+        }
-+    }
-+
-     avci->in_pkt         = av_packet_alloc();
-     avci->last_pkt_props = av_packet_alloc();
-     if (!avci->in_pkt || !avci->last_pkt_props)
-         return AVERROR(ENOMEM);
- 
-     ret = decode_bsfs_init(avctx);
-     if (ret < 0)
-         return ret;
-@@ -1815,16 +1773,106 @@ int ff_decode_preinit(AVCodecContext *av
- #if FF_API_DROPCHANGED
-     if (avctx->flags & AV_CODEC_FLAG_DROPCHANGED)
-         av_log(avctx, AV_LOG_WARNING, "The dropchanged flag is deprecated.\n");
- #endif
- 
-     return 0;
- }
- 
-+/**
-+ * Check side data preference and clear existing side data from frame
-+ * if needed.
-+ *
-+ * @retval 0 side data of this type can be added to frame
-+ * @retval 1 side data of this type should not be added to frame
-+ */
-+static int side_data_pref(const AVCodecContext *avctx, AVFrame *frame,
-+                          enum AVFrameSideDataType type)
-+{
-+    DecodeContext *dc = decode_ctx(avctx->internal);
-+
-+    // Note: could be skipped for `type` without corresponding packet sd
-+    if (av_frame_get_side_data(frame, type)) {
-+        if (dc->side_data_pref_mask & (1ULL << type))
-+            return 1;
-+        av_frame_remove_side_data(frame, type);
-+    }
-+
-+    return 0;
-+}
-+
-+
-+int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame,
-+                           enum AVFrameSideDataType type, size_t size,
-+                           AVFrameSideData **psd)
-+{
-+    AVFrameSideData *sd;
-+
-+    if (side_data_pref(avctx, frame, type)) {
-+        if (psd)
-+            *psd = NULL;
-+        return 0;
-+    }
-+
-+    sd = av_frame_new_side_data(frame, type, size);
-+    if (psd)
-+        *psd = sd;
-+
-+    return sd ? 0 : AVERROR(ENOMEM);
-+}
-+
-+int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx,
-+                                    AVFrame *frame, enum AVFrameSideDataType type,
-+                                    AVBufferRef **buf, AVFrameSideData **psd)
-+{
-+    AVFrameSideData *sd = NULL;
-+    int ret = 0;
-+
-+    if (side_data_pref(avctx, frame, type))
-+        goto finish;
-+
-+    sd = av_frame_new_side_data_from_buf(frame, type, *buf);
-+    if (sd)
-+        *buf = NULL;
-+    else
-+        ret = AVERROR(ENOMEM);
-+
-+finish:
-+    av_buffer_unref(buf);
-+    if (psd)
-+        *psd = sd;
-+
-+    return ret;
-+}
-+
-+int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame,
-+                                    AVMasteringDisplayMetadata **mdm)
-+{
-+    if (side_data_pref(avctx, frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA)) {
-+        *mdm = NULL;
-+        return 0;
-+    }
-+
-+    *mdm = av_mastering_display_metadata_create_side_data(frame);
-+    return *mdm ? 0 : AVERROR(ENOMEM);
-+}
-+
-+int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame,
-+                                AVContentLightMetadata **clm)
-+{
-+    if (side_data_pref(avctx, frame, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL)) {
-+        *clm = NULL;
-+        return 0;
-+    }
-+
-+    *clm = av_content_light_metadata_create_side_data(frame);
-+    return *clm ? 0 : AVERROR(ENOMEM);
-+}
-+
- int ff_copy_palette(void *dst, const AVPacket *src, void *logctx)
- {
-     size_t size;
-     const void *pal = av_packet_get_side_data(src, AV_PKT_DATA_PALETTE, &size);
- 
-     if (pal && size == AVPALETTE_SIZE) {
-         memcpy(dst, pal, AVPALETTE_SIZE);
-         return 1;
-@@ -1867,18 +1915,18 @@ int ff_hwaccel_frame_priv_alloc(AVCodecC
- void ff_decode_flush_buffers(AVCodecContext *avctx)
- {
-     AVCodecInternal *avci = avctx->internal;
-     DecodeContext     *dc = decode_ctx(avci);
- 
-     av_packet_unref(avci->last_pkt_props);
-     av_packet_unref(avci->in_pkt);
- 
--    avctx->pts_correction_last_pts =
--    avctx->pts_correction_last_dts = INT64_MIN;
-+    dc->pts_correction_last_pts =
-+    dc->pts_correction_last_dts = INT64_MIN;
- 
-     av_bsf_flush(avci->bsf);
- 
-     dc->nb_draining_errors = 0;
-     dc->draining_started   = 0;
- }
- 
- AVCodecInternal *ff_decode_internal_alloc(void)
-diff --git a/media/ffvpx/libavcodec/decode.h b/media/ffvpx/libavcodec/decode.h
---- a/media/ffvpx/libavcodec/decode.h
-+++ b/media/ffvpx/libavcodec/decode.h
-@@ -150,9 +150,50 @@ int ff_side_data_update_matrix_encoding(
- int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private);
- 
- /**
-  * Get side data of the given type from a decoding context.
-  */
- const AVPacketSideData *ff_get_coded_side_data(const AVCodecContext *avctx,
-                                                enum AVPacketSideDataType type);
- 
-+/**
-+ * Wrapper around av_frame_new_side_data, which rejects side data overridden by
-+ * the demuxer. Returns 0 on success, and a negative error code otherwise.
-+ * If successful and sd is not NULL, *sd may either contain a pointer to the new
-+ * side data, or NULL in case the side data was already present.
-+ */
-+int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame,
-+                           enum AVFrameSideDataType type, size_t size,
-+                           AVFrameSideData **sd);
-+
-+/**
-+ * Similar to `ff_frame_new_side_data`, but using an existing buffer ref.
-+ *
-+ * *buf is ALWAYS consumed by this function and NULL written in its place, even
-+ * on failure.
-+ */
-+int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx,
-+                                    AVFrame *frame, enum AVFrameSideDataType type,
-+                                    AVBufferRef **buf, AVFrameSideData **sd);
-+
-+struct AVMasteringDisplayMetadata;
-+struct AVContentLightMetadata;
-+
-+/**
-+ * Wrapper around av_mastering_display_metadata_create_side_data(), which
-+ * rejects side data overridden by the demuxer. Returns 0 on success, and a
-+ * negative error code otherwise. If successful, *mdm may either be a pointer to
-+ * the new side data, or NULL in case the side data was already present.
-+ */
-+int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame,
-+                                    struct AVMasteringDisplayMetadata **mdm);
-+
-+/**
-+ * Wrapper around av_content_light_metadata_create_side_data(), which
-+ * rejects side data overridden by the demuxer. Returns 0 on success, and a
-+ * negative error code otherwise. If successful, *clm may either be a pointer to
-+ * the new side data, or NULL in case the side data was already present.
-+ */
-+int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame,
-+                                struct AVContentLightMetadata **clm);
-+
- #endif /* AVCODEC_DECODE_H */
-diff --git a/media/ffvpx/libavcodec/dovi_rpu.h b/media/ffvpx/libavcodec/dovi_rpu.h
-new file mode 100644
---- /dev/null
-+++ b/media/ffvpx/libavcodec/dovi_rpu.h
-@@ -0,0 +1,29 @@
-+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-+/* vim:set ts=2 sw=2 sts=2 et cindent: */
-+/* This Source Code Form is subject to the terms of the Mozilla Public
-+ * License, v. 2.0. If a copy of the MPL was not distributed with this
-+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-+
-+/* Stubs for dovi_rpu.{c,h} */
-+
-+typedef struct AVCtx AVContext;
-+
-+typedef struct DOVICtx {
-+  int dv_profile;
-+  AVContext* logctx;
-+  int operating_point;
-+} DOVIContext;
-+
-+typedef struct AVDOVICConfRecord {
-+} AVDOVIDecoderConfigurationRecord;
-+
-+inline void ff_dovi_ctx_unref(DOVIContext* ctx) {}
-+inline void ff_dovi_update_cfg(DOVIContext* ctx,
-+                               AVDOVIDecoderConfigurationRecord* record) {}
-+inline int ff_dovi_rpu_parse(DOVIContext* ctx, uint8_t* buf, size_t len,
-+                             int err_recognition) {
-+  return 0;
-+}
-+inline int ff_dovi_attach_side_data(DOVIContext* ctx, AVFrame* frame) {
-+  return 0;
-+}
-diff --git a/media/ffvpx/libavcodec/encode.c b/media/ffvpx/libavcodec/encode.c
---- a/media/ffvpx/libavcodec/encode.c
-+++ b/media/ffvpx/libavcodec/encode.c
-@@ -20,16 +20,17 @@
- 
- #include "libavutil/attributes.h"
- #include "libavutil/avassert.h"
- #include "libavutil/channel_layout.h"
- #include "libavutil/emms.h"
- #include "libavutil/frame.h"
- #include "libavutil/imgutils.h"
- #include "libavutil/internal.h"
-+#include "libavutil/mem.h"
- #include "libavutil/pixdesc.h"
- #include "libavutil/samplefmt.h"
- 
- #include "avcodec.h"
- #include "avcodec_internal.h"
- #include "codec_desc.h"
- #include "codec_internal.h"
- #include "encode.h"
-@@ -193,21 +194,16 @@ int avcodec_encode_subtitle(AVCodecConte
-     int ret;
-     if (sub->start_display_time) {
-         av_log(avctx, AV_LOG_ERROR, "start_display_time must be 0.\n");
-         return -1;
-     }
- 
-     ret = ffcodec(avctx->codec)->cb.encode_sub(avctx, buf, buf_size, sub);
-     avctx->frame_num++;
--#if FF_API_AVCTX_FRAME_NUMBER
--FF_DISABLE_DEPRECATION_WARNINGS
--    avctx->frame_number = avctx->frame_num;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     return ret;
- }
- 
- int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame)
- {
-     AVCodecInternal *avci = avctx->internal;
- 
-     if (avci->draining)
-@@ -234,22 +230,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
- #endif
- 
-     return 0;
- }
- 
- int ff_encode_reordered_opaque(AVCodecContext *avctx,
-                                AVPacket *pkt, const AVFrame *frame)
- {
--#if FF_API_REORDERED_OPAQUE
--FF_DISABLE_DEPRECATION_WARNINGS
--    avctx->reordered_opaque = frame->reordered_opaque;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
-     if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
-         int ret = av_buffer_replace(&pkt->opaque_ref, frame->opaque_ref);
-         if (ret < 0)
-             return ret;
-         pkt->opaque = frame->opaque;
-     }
- 
-     return 0;
-@@ -539,21 +529,16 @@ int attribute_align_arg avcodec_send_fra
- 
-     if (!avci->buffer_pkt->data && !avci->buffer_pkt->side_data) {
-         ret = encode_receive_packet_internal(avctx, avci->buffer_pkt);
-         if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
-             return ret;
-     }
- 
-     avctx->frame_num++;
--#if FF_API_AVCTX_FRAME_NUMBER
--FF_DISABLE_DEPRECATION_WARNINGS
--    avctx->frame_number = avctx->frame_num;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
- 
-     return 0;
- }
- 
- int attribute_align_arg avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
- {
-     AVCodecInternal *avci = avctx->internal;
-     int ret;
-@@ -732,16 +717,18 @@ static int encode_preinit_audio(AVCodecC
-                 ret = av_channel_layout_describe(&c->ch_layouts[p], buf, sizeof(buf));
-                 av_log(avctx, AV_LOG_ERROR, "  %s\n", ret > 0 ? buf : "?");
-             }
-             return AVERROR(EINVAL);
-         }
-     }
- 
-     if (!avctx->bits_per_raw_sample)
-+        avctx->bits_per_raw_sample = av_get_exact_bits_per_sample(avctx->codec_id);
-+    if (!avctx->bits_per_raw_sample)
-         avctx->bits_per_raw_sample = 8 * av_get_bytes_per_sample(avctx->sample_fmt);
- 
-     return 0;
- }
- 
- int ff_encode_preinit(AVCodecContext *avctx)
- {
-     AVCodecInternal *avci = avctx->internal;
-@@ -791,16 +778,39 @@ int ff_encode_preinit(AVCodecContext *av
-             return AVERROR(ENOSYS);
-         }
- 
-         avci->recon_frame = av_frame_alloc();
-         if (!avci->recon_frame)
-             return AVERROR(ENOMEM);
-     }
- 
-+    for (int i = 0; ff_sd_global_map[i].packet < AV_PKT_DATA_NB; i++) {
-+        const enum AVPacketSideDataType type_packet = ff_sd_global_map[i].packet;
-+        const enum AVFrameSideDataType  type_frame  = ff_sd_global_map[i].frame;
-+        const AVFrameSideData *sd_frame;
-+        AVPacketSideData      *sd_packet;
-+
-+        sd_frame = av_frame_side_data_get(avctx->decoded_side_data,
-+                                          avctx->nb_decoded_side_data,
-+                                          type_frame);
-+        if (!sd_frame ||
-+            av_packet_side_data_get(avctx->coded_side_data, avctx->nb_coded_side_data,
-+                                    type_packet))
-+
-+            continue;
-+
-+        sd_packet = av_packet_side_data_new(&avctx->coded_side_data, &avctx->nb_coded_side_data,
-+                                            type_packet, sd_frame->size, 0);
-+        if (!sd_packet)
-+            return AVERROR(ENOMEM);
-+
-+        memcpy(sd_packet->data, sd_frame->data, sd_frame->size);
-+    }
-+
-     if (CONFIG_FRAME_THREAD_ENCODER) {
-         ret = ff_frame_thread_encoder_init(avctx);
-         if (ret < 0)
-             return ret;
-     }
- 
-     return 0;
- }
-diff --git a/media/ffvpx/libavcodec/encode.h b/media/ffvpx/libavcodec/encode.h
---- a/media/ffvpx/libavcodec/encode.h
-+++ b/media/ffvpx/libavcodec/encode.h
-@@ -22,16 +22,22 @@
- #define AVCODEC_ENCODE_H
- 
- #include "libavutil/frame.h"
- 
- #include "avcodec.h"
- #include "packet.h"
- 
- /**
-+ * Used by some encoders as upper bound for the length of headers.
-+ * TODO: Use proper codec-specific upper bounds.
-+ */
-+#define FF_INPUT_BUFFER_MIN_SIZE 16384
-+
-+/**
-  * Called by encoders to get the next frame for encoding.
-  *
-  * @param frame An empty frame to be filled with data.
-  * @return 0 if a new reference has been successfully written to frame
-  *         AVERROR(EAGAIN) if no data is currently available
-  *         AVERROR_EOF if end of stream has been reached, so no more data
-  *                     will be available
-  */
-diff --git a/media/ffvpx/libavcodec/fdctdsp_init.c b/media/ffvpx/libavcodec/fdctdsp_init.c
-deleted file mode 100644
---- a/media/ffvpx/libavcodec/fdctdsp_init.c
-+++ /dev/null
-@@ -1,44 +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/attributes.h"
--#include "libavutil/cpu.h"
--#include "libavutil/x86/cpu.h"
--#include "libavcodec/avcodec.h"
--#include "libavcodec/fdctdsp.h"
--#include "fdct.h"
--
--av_cold void ff_fdctdsp_init_x86(FDCTDSPContext *c, AVCodecContext *avctx,
--                                 unsigned high_bit_depth)
--{
--    int cpu_flags = av_get_cpu_flags();
--    const int dct_algo = avctx->dct_algo;
--
--    if (!high_bit_depth) {
--        if ((dct_algo == FF_DCT_AUTO || dct_algo == FF_DCT_MMX)) {
--            if (INLINE_MMX(cpu_flags))
--                c->fdct = ff_fdct_mmx;
--
--            if (INLINE_MMXEXT(cpu_flags))
--                c->fdct = ff_fdct_mmxext;
--
--            if (INLINE_SSE2(cpu_flags))
--                c->fdct = ff_fdct_sse2;
--        }
--    }
--}
-diff --git a/media/ffvpx/libavcodec/flacdec.c b/media/ffvpx/libavcodec/flacdec.c
---- a/media/ffvpx/libavcodec/flacdec.c
-+++ b/media/ffvpx/libavcodec/flacdec.c
-@@ -30,24 +30,23 @@
-  * 34-byte streaminfo structure through avctx->extradata[_size] followed
-  * by data starting with the 0xFFF8 marker.
-  */
- 
- #include <limits.h>
- 
- #include "libavutil/avassert.h"
- #include "libavutil/crc.h"
-+#include "libavutil/mem.h"
- #include "libavutil/opt.h"
- #include "avcodec.h"
- #include "codec_internal.h"
- #include "get_bits.h"
--#include "bytestream.h"
- #include "golomb.h"
- #include "flac.h"
--#include "flacdata.h"
- #include "flacdsp.h"
- #include "flac_parse.h"
- #include "thread.h"
- #include "unary.h"
- 
- 
- typedef struct FLACContext {
-     AVClass *class;
-diff --git a/media/ffvpx/libavcodec/get_bits.h b/media/ffvpx/libavcodec/get_bits.h
---- a/media/ffvpx/libavcodec/get_bits.h
-+++ b/media/ffvpx/libavcodec/get_bits.h
-@@ -89,17 +89,16 @@ typedef BitstreamContext GetBitContext;
- #define get_sbits_long      bits_read_signed
- #define show_bits           bits_peek
- #define show_bits_long      bits_peek
- #define init_get_bits       bits_init
- #define init_get_bits8      bits_init8
- #define align_get_bits      bits_align
- #define get_vlc2            bits_read_vlc
- #define get_vlc_multi       bits_read_vlc_multi
--#define get_leb             bits_read_leb
- 
- #define init_get_bits8_le(s, buffer, byte_size) bits_init8_le((BitstreamContextLE*)s, buffer, byte_size)
- #define get_bits_le(s, n)                       bits_read_le((BitstreamContextLE*)s, n)
- 
- #define show_bits1(s)       bits_peek(s, 1)
- #define skip_bits1(s)       bits_skip(s, 1)
- 
- #define skip_1stop_8data_bits bits_skip_1stop_8data
-@@ -663,17 +662,18 @@ static av_always_inline int get_vlc2(Get
-     CLOSE_READER(re, s);
- 
-     return code;
- }
- 
- static inline int get_vlc_multi(GetBitContext *s, uint8_t *dst,
-                                 const VLC_MULTI_ELEM *const Jtable,
-                                 const VLCElem *const table,
--                                const int bits, const int max_depth)
-+                                const int bits, const int max_depth,
-+                                const int symbols_size)
- {
-     dst[0] = get_vlc2(s, table, bits, max_depth);
-     return 1;
- }
- 
- static inline int decode012(GetBitContext *gb)
- {
-     int n;
-@@ -706,34 +706,11 @@ static inline int skip_1stop_8data_bits(
-         skip_bits(gb, 8);
-         if (get_bits_left(gb) <= 0)
-             return AVERROR_INVALIDDATA;
-     }
- 
-     return 0;
- }
- 
--/**
-- * Read a unsigned integer coded as a variable number of up to eight
-- * little-endian bytes, where the MSB in a byte signals another byte
-- * must be read.
-- * All coded bits are read, but values > UINT_MAX are truncated.
-- */
--static inline unsigned get_leb(GetBitContext *s) {
--    int more, i = 0;
--    unsigned leb = 0;
--
--    do {
--        int byte = get_bits(s, 8);
--        unsigned bits = byte & 0x7f;
--        more = byte & 0x80;
--        if (i <= 4)
--            leb |= bits << (i * 7);
--        if (++i == 8)
--            break;
--    } while (more);
--
--    return leb;
--}
--
- #endif // CACHED_BITSTREAM_READER
- 
- #endif /* AVCODEC_GET_BITS_H */
-diff --git a/media/ffvpx/libavcodec/get_buffer.c b/media/ffvpx/libavcodec/get_buffer.c
---- a/media/ffvpx/libavcodec/get_buffer.c
-+++ b/media/ffvpx/libavcodec/get_buffer.c
-@@ -65,22 +65,16 @@ static void frame_pool_free(FFRefStructO
- static int update_frame_pool(AVCodecContext *avctx, AVFrame *frame)
- {
-     FramePool *pool = avctx->internal->pool;
-     int i, ret, ch, planes;
- 
-     if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
-         int planar = av_sample_fmt_is_planar(frame->format);
-         ch     = frame->ch_layout.nb_channels;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--        if (!ch)
--            ch = frame->channels;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-         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 &&
-@@ -258,16 +252,32 @@ fail:
- }
- 
- int avcodec_default_get_buffer2(AVCodecContext *avctx, AVFrame *frame, int flags)
- {
-     int ret;
- 
-     if (avctx->hw_frames_ctx) {
-         ret = av_hwframe_get_buffer(avctx->hw_frames_ctx, frame, 0);
-+        if (ret == AVERROR(ENOMEM)) {
-+            AVHWFramesContext *frames_ctx =
-+                (AVHWFramesContext*)avctx->hw_frames_ctx->data;
-+            if (frames_ctx->initial_pool_size > 0 &&
-+                !avctx->internal->warned_on_failed_allocation_from_fixed_pool) {
-+                av_log(avctx, AV_LOG_WARNING, "Failed to allocate a %s/%s "
-+                       "frame from a fixed pool of hardware frames.\n",
-+                       av_get_pix_fmt_name(frames_ctx->format),
-+                       av_get_pix_fmt_name(frames_ctx->sw_format));
-+                av_log(avctx, AV_LOG_WARNING, "Consider setting "
-+                       "extra_hw_frames to a larger value "
-+                       "(currently set to %d, giving a pool size of %d).\n",
-+                       avctx->extra_hw_frames, frames_ctx->initial_pool_size);
-+                avctx->internal->warned_on_failed_allocation_from_fixed_pool = 1;
-+            }
-+        }
-         frame->width  = avctx->coded_width;
-         frame->height = avctx->coded_height;
-         return ret;
-     }
- 
-     if ((ret = update_frame_pool(avctx, frame)) < 0)
-         return ret;
- 
-diff --git a/media/ffvpx/libavcodec/hwaccel.h b/media/ffvpx/libavcodec/hwaccel.h
-deleted file mode 100644
---- a/media/ffvpx/libavcodec/hwaccel.h
-+++ /dev/null
-@@ -1,84 +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
-- */
--
--#ifndef AVCODEC_HWACCEL_H
--#define AVCODEC_HWACCEL_H
--
--#include "avcodec.h"
--#include "hwaccels.h"
--
--
--#define HWACCEL_CAP_ASYNC_SAFE      (1 << 0)
--
--
--typedef struct AVCodecHWConfigInternal {
--    /**
--     * This is the structure which will be returned to the user by
--     * avcodec_get_hw_config().
--     */
--    AVCodecHWConfig public;
--    /**
--     * If this configuration uses a hwaccel, a pointer to it.
--     * If not, NULL.
--     */
--    const AVHWAccel *hwaccel;
--} AVCodecHWConfigInternal;
--
--
--// These macros are used to simplify AVCodecHWConfigInternal definitions.
--
--#define HW_CONFIG_HWACCEL(device, frames, ad_hoc, format, device_type_, name) \
--    &(const AVCodecHWConfigInternal) { \
--        .public          = { \
--            .pix_fmt     = AV_PIX_FMT_ ## format, \
--            .methods     = (device ? AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX : 0) | \
--                           (frames ? AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX : 0) | \
--                           (ad_hoc ? AV_CODEC_HW_CONFIG_METHOD_AD_HOC        : 0),  \
--            .device_type = AV_HWDEVICE_TYPE_ ## device_type_, \
--        }, \
--        .hwaccel         = &name, \
--    }
--
--#define HW_CONFIG_INTERNAL(format) \
--    &(const AVCodecHWConfigInternal) { \
--        .public          = { \
--            .pix_fmt     = AV_PIX_FMT_ ## format, \
--            .methods     = AV_CODEC_HW_CONFIG_METHOD_INTERNAL, \
--            .device_type = AV_HWDEVICE_TYPE_NONE, \
--        }, \
--        .hwaccel         = NULL, \
--    }
--
--#define HWACCEL_DXVA2(codec) \
--    HW_CONFIG_HWACCEL(1, 1, 1, DXVA2_VLD,    DXVA2,        ff_ ## codec ## _dxva2_hwaccel)
--#define HWACCEL_D3D11VA2(codec) \
--    HW_CONFIG_HWACCEL(1, 1, 0, D3D11,        D3D11VA,      ff_ ## codec ## _d3d11va2_hwaccel)
--#define HWACCEL_NVDEC(codec) \
--    HW_CONFIG_HWACCEL(1, 1, 0, CUDA,         CUDA,         ff_ ## codec ## _nvdec_hwaccel)
--#define HWACCEL_VAAPI(codec) \
--    HW_CONFIG_HWACCEL(1, 1, 1, VAAPI,        VAAPI,        ff_ ## codec ## _vaapi_hwaccel)
--#define HWACCEL_VDPAU(codec) \
--    HW_CONFIG_HWACCEL(1, 1, 1, VDPAU,        VDPAU,        ff_ ## codec ## _vdpau_hwaccel)
--#define HWACCEL_VIDEOTOOLBOX(codec) \
--    HW_CONFIG_HWACCEL(1, 1, 1, VIDEOTOOLBOX, VIDEOTOOLBOX, ff_ ## codec ## _videotoolbox_hwaccel)
--#define HWACCEL_D3D11VA(codec) \
--    HW_CONFIG_HWACCEL(0, 0, 1, D3D11VA_VLD,  NONE,         ff_ ## codec ## _d3d11va_hwaccel)
--#define HWACCEL_XVMC(codec) \
--    HW_CONFIG_HWACCEL(0, 0, 1, XVMC,         NONE,         ff_ ## codec ## _xvmc_hwaccel)
--
--#endif /* AVCODEC_HWACCEL_H */
-diff --git a/media/ffvpx/libavcodec/hwaccel_internal.h b/media/ffvpx/libavcodec/hwaccel_internal.h
---- a/media/ffvpx/libavcodec/hwaccel_internal.h
-+++ b/media/ffvpx/libavcodec/hwaccel_internal.h
-@@ -123,17 +123,17 @@ typedef struct FFHWAccel {
-      * hwaccel_context are set and the hwaccel private data in AVCodecInternal
-      * is allocated.
-      */
-     int (*init)(AVCodecContext *avctx);
- 
-     /**
-      * Uninitialize the hwaccel private data.
-      *
--     * This will be called from get_format() or avcodec_close(), after hwaccel
-+     * This will be called from get_format() or ff_codec_close(), after hwaccel
-      * and hwaccel_context are already uninitialized.
-      */
-     int (*uninit)(AVCodecContext *avctx);
- 
-     /**
-      * Fill the given hw_frames context with current codec parameters. Called
-      * from get_format. Refer to avcodec_get_hw_frames_parameters() for
-      * details.
-diff --git a/media/ffvpx/libavcodec/idctdsp.c b/media/ffvpx/libavcodec/idctdsp.c
---- a/media/ffvpx/libavcodec/idctdsp.c
-+++ b/media/ffvpx/libavcodec/idctdsp.c
-@@ -65,17 +65,17 @@ av_cold void ff_init_scantable_permutati
-             idct_permutation[i] = (i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3);
-         break;
-     default:
-         av_log(NULL, AV_LOG_ERROR,
-                "Internal error, IDCT permutation not set\n");
-     }
- }
- 
--void ff_put_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels,
-+void ff_put_pixels_clamped_c(const int16_t *block, uint8_t *restrict pixels,
-                              ptrdiff_t line_size)
- {
-     int i;
- 
-     /* read the pixels */
-     for (i = 0; i < 8; i++) {
-         pixels[0] = av_clip_uint8(block[0]);
-         pixels[1] = av_clip_uint8(block[1]);
-@@ -86,50 +86,50 @@ void ff_put_pixels_clamped_c(const int16
-         pixels[6] = av_clip_uint8(block[6]);
-         pixels[7] = av_clip_uint8(block[7]);
- 
-         pixels += line_size;
-         block  += 8;
-     }
- }
- 
--static void put_pixels_clamped4_c(const int16_t *block, uint8_t *av_restrict pixels,
-+static void put_pixels_clamped4_c(const int16_t *block, uint8_t *restrict pixels,
-                                  int line_size)
- {
-     int i;
- 
-     /* read the pixels */
-     for(i=0;i<4;i++) {
-         pixels[0] = av_clip_uint8(block[0]);
-         pixels[1] = av_clip_uint8(block[1]);
-         pixels[2] = av_clip_uint8(block[2]);
-         pixels[3] = av_clip_uint8(block[3]);
- 
-         pixels += line_size;
-         block += 8;
-     }
- }
- 
--static void put_pixels_clamped2_c(const int16_t *block, uint8_t *av_restrict pixels,
-+static void put_pixels_clamped2_c(const int16_t *block, uint8_t *restrict pixels,
-                                  int line_size)
- {
-     int i;
- 
-     /* read the pixels */
-     for(i=0;i<2;i++) {
-         pixels[0] = av_clip_uint8(block[0]);
-         pixels[1] = av_clip_uint8(block[1]);
- 
-         pixels += line_size;
-         block += 8;
-     }
- }
- 
- static void put_signed_pixels_clamped_c(const int16_t *block,
--                                        uint8_t *av_restrict pixels,
-+                                        uint8_t *restrict pixels,
-                                         ptrdiff_t line_size)
- {
-     int i, j;
- 
-     for (i = 0; i < 8; i++) {
-         for (j = 0; j < 8; j++) {
-             if (*block < -128)
-                 *pixels = 0;
-@@ -139,17 +139,17 @@ static void put_signed_pixels_clamped_c(
-                 *pixels = (uint8_t) (*block + 128);
-             block++;
-             pixels++;
-         }
-         pixels += (line_size - 8);
-     }
- }
- 
--void ff_add_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels,
-+void ff_add_pixels_clamped_c(const int16_t *block, uint8_t *restrict pixels,
-                              ptrdiff_t line_size)
- {
-     int i;
- 
-     /* read the pixels */
-     for (i = 0; i < 8; i++) {
-         pixels[0] = av_clip_uint8(pixels[0] + block[0]);
-         pixels[1] = av_clip_uint8(pixels[1] + block[1]);
-@@ -159,33 +159,33 @@ void ff_add_pixels_clamped_c(const int16
-         pixels[5] = av_clip_uint8(pixels[5] + block[5]);
-         pixels[6] = av_clip_uint8(pixels[6] + block[6]);
-         pixels[7] = av_clip_uint8(pixels[7] + block[7]);
-         pixels   += line_size;
-         block    += 8;
-     }
- }
- 
--static void add_pixels_clamped4_c(const int16_t *block, uint8_t *av_restrict pixels,
-+static void add_pixels_clamped4_c(const int16_t *block, uint8_t *restrict pixels,
-                           int line_size)
- {
-     int i;
- 
-     /* read the pixels */
-     for(i=0;i<4;i++) {
-         pixels[0] = av_clip_uint8(pixels[0] + block[0]);
-         pixels[1] = av_clip_uint8(pixels[1] + block[1]);
-         pixels[2] = av_clip_uint8(pixels[2] + block[2]);
-         pixels[3] = av_clip_uint8(pixels[3] + block[3]);
-         pixels += line_size;
-         block += 8;
-     }
- }
- 
--static void add_pixels_clamped2_c(const int16_t *block, uint8_t *av_restrict pixels,
-+static void add_pixels_clamped2_c(const int16_t *block, uint8_t *restrict pixels,
-                           int line_size)
- {
-     int i;
- 
-     /* read the pixels */
-     for(i=0;i<2;i++) {
-         pixels[0] = av_clip_uint8(pixels[0] + block[0]);
-         pixels[1] = av_clip_uint8(pixels[1] + block[1]);
-diff --git a/media/ffvpx/libavcodec/idctdsp.h b/media/ffvpx/libavcodec/idctdsp.h
---- a/media/ffvpx/libavcodec/idctdsp.h
-+++ b/media/ffvpx/libavcodec/idctdsp.h
-@@ -17,18 +17,16 @@
-  */
- 
- #ifndef AVCODEC_IDCTDSP_H
- #define AVCODEC_IDCTDSP_H
- 
- #include <stddef.h>
- #include <stdint.h>
- 
--#include "config.h"
--
- struct AVCodecContext;
- 
- enum idct_permutation_type {
-     FF_IDCT_PERM_NONE,
-     FF_IDCT_PERM_LIBMPEG2,
-     FF_IDCT_PERM_SIMPLE,
-     FF_IDCT_PERM_TRANSPOSE,
-     FF_IDCT_PERM_PARTTRANS,
-@@ -40,23 +38,23 @@ void ff_permute_scantable(uint8_t dst[64
- void ff_init_scantable_permutation(uint8_t *idct_permutation,
-                                    enum idct_permutation_type perm_type);
- int ff_init_scantable_permutation_x86(uint8_t *idct_permutation,
-                                       enum idct_permutation_type perm_type);
- 
- typedef struct IDCTDSPContext {
-     /* pixel ops : interface with DCT */
-     void (*put_pixels_clamped)(const int16_t *block /* align 16 */,
--                               uint8_t *av_restrict pixels /* align 8 */,
-+                               uint8_t *restrict pixels /* align 8 */,
-                                ptrdiff_t line_size);
-     void (*put_signed_pixels_clamped)(const int16_t *block /* align 16 */,
--                                      uint8_t *av_restrict pixels /* align 8 */,
-+                                      uint8_t *restrict pixels /* align 8 */,
-                                       ptrdiff_t line_size);
-     void (*add_pixels_clamped)(const int16_t *block /* align 16 */,
--                               uint8_t *av_restrict pixels /* align 8 */,
-+                               uint8_t *restrict pixels /* align 8 */,
-                                ptrdiff_t line_size);
- 
-     void (*idct)(int16_t *block /* align 16 */);
- 
-     /**
-      * block -> idct -> clip to unsigned 8 bit -> dest.
-      * (-1392, 0, 0, ...) -> idct -> (-174, -174, ...) -> put -> (0, 0, ...)
-      * @param line_size size in bytes of a horizontal line of dest
-@@ -86,19 +84,19 @@ typedef struct IDCTDSPContext {
-      *    -> simple_idct_mmx -> ...)
-      */
-     uint8_t idct_permutation[64];
-     enum idct_permutation_type perm_type;
- 
-     int mpeg4_studio_profile;
- } IDCTDSPContext;
- 
--void ff_put_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels,
-+void ff_put_pixels_clamped_c(const int16_t *block, uint8_t *restrict pixels,
-                              ptrdiff_t line_size);
--void ff_add_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels,
-+void ff_add_pixels_clamped_c(const int16_t *block, uint8_t *restrict pixels,
-                              ptrdiff_t line_size);
- 
- void ff_idctdsp_init(IDCTDSPContext *c, struct AVCodecContext *avctx);
- 
- void ff_idctdsp_init_aarch64(IDCTDSPContext *c, struct AVCodecContext *avctx,
-                              unsigned high_bit_depth);
- void ff_idctdsp_init_alpha(IDCTDSPContext *c, struct AVCodecContext *avctx,
-                            unsigned high_bit_depth);
-diff --git a/media/ffvpx/libavcodec/internal.h b/media/ffvpx/libavcodec/internal.h
---- a/media/ffvpx/libavcodec/internal.h
-+++ b/media/ffvpx/libavcodec/internal.h
-@@ -21,20 +21,17 @@
-  * common internal api header.
-  */
- 
- #ifndef AVCODEC_INTERNAL_H
- #define AVCODEC_INTERNAL_H
- 
- #include <stdint.h>
- 
--#include "libavutil/buffer.h"
- #include "libavutil/channel_layout.h"
--#include "libavutil/mathematics.h"
--#include "libavutil/pixfmt.h"
- #include "avcodec.h"
- #include "config.h"
- 
- #if CONFIG_LCMS2
- # include "fflcms2.h"
- #endif
- 
- #define FF_SANE_NB_CHANNELS 512U
-@@ -142,45 +139,32 @@ typedef struct AVCodecInternal {
-     int initial_width, initial_height;
-     int initial_sample_rate;
-     AVChannelLayout initial_ch_layout;
- #endif
- 
- #if CONFIG_LCMS2
-     FFIccContext icc; /* used to read and write embedded ICC profiles */
- #endif
-+
-+    /**
-+     * Set when the user has been warned about a failed allocation from
-+     * a fixed frame pool.
-+     */
-+    int warned_on_failed_allocation_from_fixed_pool;
- } AVCodecInternal;
- 
- /**
-  * Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
-  * If there is no such matching pair then size is returned.
-  */
- int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b);
- 
- unsigned int ff_toupper4(unsigned int x);
- 
--/**
-- * 2^(x) for integer x
-- * @return correctly rounded float
-- */
--static av_always_inline float ff_exp2fi(int x) {
--    /* Normal range */
--    if (-126 <= x && x <= 128)
--        return av_int2float((x+127) << 23);
--    /* Too large */
--    else if (x > 128)
--        return INFINITY;
--    /* Subnormal numbers */
--    else if (x > -150)
--        return av_int2float(1 << (x+149));
--    /* Negligibly small */
--    else
--        return 0;
--}
--
- int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx);
- 
- int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec);
- 
- /**
-  * Check AVFrame for S12M timecode side data and allocate and fill TC SEI message with timecode info
-  *
-  * @param frame      Raw frame to get S12M timecode side data from
-diff --git a/media/ffvpx/libavcodec/itut35.h b/media/ffvpx/libavcodec/itut35.h
-new file mode 100644
---- /dev/null
-+++ b/media/ffvpx/libavcodec/itut35.h
-@@ -0,0 +1,30 @@
-+/*
-+ * 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_ITUT35_H
-+#define AVCODEC_ITUT35_H
-+
-+#define ITU_T_T35_COUNTRY_CODE_CN 0x26
-+#define ITU_T_T35_COUNTRY_CODE_US 0xB5
-+
-+#define ITU_T_T35_PROVIDER_CODE_ATSC  0x31
-+#define ITU_T_T35_PROVIDER_CODE_CUVA  0x04
-+#define ITU_T_T35_PROVIDER_CODE_DOLBY 0x3B
-+#define ITU_T_T35_PROVIDER_CODE_SMTPE 0x3C
-+
-+#endif /* AVCODEC_ITUT35_H */
-diff --git a/media/ffvpx/libavcodec/leb.h b/media/ffvpx/libavcodec/leb.h
-new file mode 100644
---- /dev/null
-+++ b/media/ffvpx/libavcodec/leb.h
-@@ -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
-+ */
-+
-+/**
-+ * @file
-+ * leb128 handling implementations
-+ */
-+
-+#ifndef AVCODEC_LEB_H
-+#define AVCODEC_LEB_H
-+
-+#include "get_bits.h"
-+
-+/**
-+ * Read a unsigned integer coded as a variable number of up to eight
-+ * little-endian bytes, where the MSB in a byte signals another byte
-+ * must be read.
-+ * All coded bits are read, but values > UINT_MAX are truncated.
-+ */
-+static inline unsigned get_leb(GetBitContext *s) {
-+    int more, i = 0;
-+    unsigned leb = 0;
-+
-+    do {
-+        int byte = get_bits(s, 8);
-+        unsigned bits = byte & 0x7f;
-+        more = byte & 0x80;
-+        if (i <= 4)
-+            leb |= bits << (i * 7);
-+        if (++i == 8)
-+            break;
-+    } while (more);
-+
-+    return leb;
-+}
-+
-+/**
-+ * Read a unsigned integer coded as a variable number of up to eight
-+ * little-endian bytes, where the MSB in a byte signals another byte
-+ * must be read.
-+ */
-+static inline int64_t get_leb128(GetBitContext *gb) {
-+    int64_t ret = 0;
-+
-+    for (int i = 0; i < 8; i++) {
-+        int byte = get_bits(gb, 8);
-+        ret |= (int64_t)(byte & 0x7f) << (i * 7);
-+        if (!(byte & 0x80))
-+            break;
-+    }
-+
-+    return ret;
-+}
-+
-+#endif /* AVCODEC_LEB_H */
-diff --git a/media/ffvpx/libavcodec/libaomenc.c b/media/ffvpx/libavcodec/libaomenc.c
---- a/media/ffvpx/libavcodec/libaomenc.c
-+++ b/media/ffvpx/libavcodec/libaomenc.c
-@@ -30,16 +30,17 @@
- #include <aom/aomcx.h>
- 
- #include "libavutil/avassert.h"
- #include "libavutil/base64.h"
- #include "libavutil/common.h"
- #include "libavutil/cpu.h"
- #include "libavutil/imgutils.h"
- #include "libavutil/mathematics.h"
-+#include "libavutil/mem.h"
- #include "libavutil/opt.h"
- #include "libavutil/pixdesc.h"
- 
- #include "av1.h"
- #include "avcodec.h"
- #include "bsf.h"
- #include "codec_internal.h"
- #include "encode.h"
-@@ -1462,23 +1463,23 @@ static av_cold int av1_init(AVCodecConte
- static const AVOption options[] = {
-     { "cpu-used",        "Quality/Speed ratio modifier",           OFFSET(cpu_used),        AV_OPT_TYPE_INT, {.i64 = 1}, 0, 8, VE},
-     { "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 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"},
-+    { "aq-mode",         "adaptive quantization mode",             OFFSET(aq_mode),         AV_OPT_TYPE_INT, {.i64 = -1},      -1,      4, VE, .unit = "aq_mode"},
-+    { "none",            "Aq not used",         0, AV_OPT_TYPE_CONST, {.i64 = 0}, 0, 0, VE, .unit = "aq_mode"},
-+    { "variance",        "Variance based Aq",   0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, .unit = "aq_mode"},
-+    { "complexity",      "Complexity based Aq", 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, .unit = "aq_mode"},
-+    { "cyclic",          "Cyclic Refresh Aq",   0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0, VE, .unit = "aq_mode"},
-+    { "error-resilience", "Error resilience configuration", OFFSET(error_resilient), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, VE, .unit = "er"},
-+    { "default",         "Improve resiliency against losses of whole frames", 0, AV_OPT_TYPE_CONST, {.i64 = AOM_ERROR_RESILIENT_DEFAULT}, 0, 0, VE, .unit = "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 },
-     { "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},
-@@ -1487,23 +1488,23 @@ static const AVOption options[] = {
-     { "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"},
--    { "allintra",        "All Intra encoding", 0, AV_OPT_TYPE_CONST, {.i64 = 2 /* AOM_USAGE_ALL_INTRA */},    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"},
-+    { "usage",           "Quality and compression efficiency vs speed trade-off", OFFSET(usage), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, VE, .unit = "usage"},
-+    { "good",            "Good quality",      0, AV_OPT_TYPE_CONST, {.i64 = 0 /* AOM_USAGE_GOOD_QUALITY */}, 0, 0, VE, .unit = "usage"},
-+    { "realtime",        "Realtime encoding", 0, AV_OPT_TYPE_CONST, {.i64 = 1 /* AOM_USAGE_REALTIME */},     0, 0, VE, .unit = "usage"},
-+    { "allintra",        "All Intra encoding", 0, AV_OPT_TYPE_CONST, {.i64 = 2 /* AOM_USAGE_ALL_INTRA */},    0, 0, VE, .unit = "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, .unit = "tune"},
-+    { "psnr",            NULL,         0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_PSNR}, 0, 0, VE, .unit = "tune"},
-+    { "ssim",            NULL,         0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_SSIM}, 0, 0, VE, .unit = "tune"},
-     FF_AV1_PROFILE_OPTS
-     { "still-picture", "Encode in single frame mode (typically used for still AVIF images).", OFFSET(still_picture), AV_OPT_TYPE_BOOL, {.i64 = 0}, -1, 1, VE },
-     { "enable-rect-partitions", "Enable rectangular partitions", OFFSET(enable_rect_partitions), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
-     { "enable-1to4-partitions", "Enable 1:4/4:1 partitions",     OFFSET(enable_1to4_partitions), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
-     { "enable-ab-partitions",   "Enable ab shape partitions",    OFFSET(enable_ab_partitions),   AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
-     { "enable-angle-delta",       "Enable angle delta intra prediction",                OFFSET(enable_angle_delta),       AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
-     { "enable-cfl-intra",         "Enable chroma predicted from luma intra prediction", OFFSET(enable_cfl_intra),         AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
-     { "enable-filter-intra",      "Enable filter intra predictor",                      OFFSET(enable_filter_intra),      AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
-diff --git a/media/ffvpx/libavcodec/libdav1d.c b/media/ffvpx/libavcodec/libdav1d.c
---- a/media/ffvpx/libavcodec/libdav1d.c
-+++ b/media/ffvpx/libavcodec/libdav1d.c
-@@ -30,25 +30,28 @@
- #include "libavutil/opt.h"
- 
- #include "atsc_a53.h"
- #include "av1_parse.h"
- #include "avcodec.h"
- #include "bytestream.h"
- #include "codec_internal.h"
- #include "decode.h"
-+#include "dovi_rpu.h"
- #include "internal.h"
-+#include "itut35.h"
- 
- #define FF_DAV1D_VERSION_AT_LEAST(x,y) \
-     (DAV1D_API_VERSION_MAJOR > (x) || DAV1D_API_VERSION_MAJOR == (x) && DAV1D_API_VERSION_MINOR >= (y))
- 
- typedef struct Libdav1dContext {
-     AVClass *class;
-     Dav1dContext *c;
-     AVBufferPool *pool;
-+    DOVIContext dovi;
-     int pool_size;
- 
-     Dav1dData data;
-     int tile_threads;
-     int frame_threads;
-     int max_frame_delay;
-     int apply_grain;
-     int operating_point;
-@@ -208,19 +211,20 @@ static av_cold int libdav1d_init(AVCodec
- {
-     Libdav1dContext *dav1d = c->priv_data;
-     Dav1dSettings s;
- #if FF_DAV1D_VERSION_AT_LEAST(6,0)
-     int threads = c->thread_count;
- #else
-     int threads = (c->thread_count ? c->thread_count : av_cpu_count()) * 3 / 2;
- #endif
-+    const AVPacketSideData *sd;
-     int res;
- 
--    av_log(c, AV_LOG_INFO, "libdav1d %s\n", dav1d_version());
-+    av_log(c, AV_LOG_VERBOSE, "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;
-@@ -280,44 +284,41 @@ static av_cold int libdav1d_init(AVCodec
-     res = dav1d_get_frame_delay(&s);
-     if (res < 0) // Should not happen
-         return AVERROR_EXTERNAL;
- 
-     // When dav1d_get_frame_delay() returns 1, there's no delay whatsoever
-     c->delay = res > 1 ? res : 0;
- #endif
- 
-+    dav1d->dovi.logctx = c;
-+    dav1d->dovi.dv_profile = 10; // default for AV1
-+    sd = ff_get_coded_side_data(c, AV_PKT_DATA_DOVI_CONF);
-+    if (sd && sd->size > 0)
-+        ff_dovi_update_cfg(&dav1d->dovi, (AVDOVIDecoderConfigurationRecord *) sd->data);
-     return 0;
- }
- 
- static void libdav1d_flush(AVCodecContext *c)
- {
-     Libdav1dContext *dav1d = c->priv_data;
- 
-     dav1d_data_unref(&dav1d->data);
-     dav1d_flush(dav1d->c);
- }
- 
--typedef struct OpaqueData {
--    void    *pkt_orig_opaque;
--#if FF_API_REORDERED_OPAQUE
--    int64_t  reordered_opaque;
--#endif
--} OpaqueData;
--
- 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) {
-     AVPacket *pkt = opaque;
-     av_assert0(data == opaque);
--    av_free(pkt->opaque);
-     av_packet_free(&pkt);
- }
- 
- static int libdav1d_receive_frame_internal(AVCodecContext *c, Dav1dPicture *p)
- {
-     Libdav1dContext *dav1d = c->priv_data;
-     Dav1dData *data = &dav1d->data;
-     int res;
-@@ -330,51 +331,28 @@ static int libdav1d_receive_frame_intern
- 
-         res = ff_decode_get_packet(c, pkt);
-         if (res < 0 && res != AVERROR_EOF) {
-             av_packet_free(&pkt);
-             return res;
-         }
- 
-         if (pkt->size) {
--            OpaqueData *od = NULL;
--
-             res = dav1d_data_wrap(data, pkt->data, pkt->size,
-                                   libdav1d_data_free, pkt->buf);
-             if (res < 0) {
-                 av_packet_free(&pkt);
-                 return res;
-             }
- 
-             pkt->buf = NULL;
- 
--FF_DISABLE_DEPRECATION_WARNINGS
--            if (
--#if FF_API_REORDERED_OPAQUE
--                c->reordered_opaque != AV_NOPTS_VALUE ||
--#endif
--                (pkt->opaque && (c->flags & AV_CODEC_FLAG_COPY_OPAQUE))) {
--                od = av_mallocz(sizeof(*od));
--                if (!od) {
--                    av_packet_free(&pkt);
--                    dav1d_data_unref(data);
--                    return AVERROR(ENOMEM);
--                }
--                od->pkt_orig_opaque  = pkt->opaque;
--#if FF_API_REORDERED_OPAQUE
--                od->reordered_opaque = c->reordered_opaque;
--#endif
--FF_ENABLE_DEPRECATION_WARNINGS
--            }
--            pkt->opaque = od;
--
-             res = dav1d_data_wrap_user_data(data, (const uint8_t *)pkt,
-                                             libdav1d_user_data_free, pkt);
-             if (res < 0) {
--                av_free(pkt->opaque);
-                 av_packet_free(&pkt);
-                 dav1d_data_unref(data);
-                 return res;
-             }
-             pkt = NULL;
-         } else {
-             av_packet_free(&pkt);
-             if (res >= 0)
-@@ -403,17 +381,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
-     return res;
- }
- 
- static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
- {
-     Libdav1dContext *dav1d = c->priv_data;
-     Dav1dPicture pic = { 0 }, *p = &pic;
-     AVPacket *pkt;
--    OpaqueData *od = NULL;
- #if FF_DAV1D_VERSION_AT_LEAST(5,1)
-     enum Dav1dEventFlags event_flags = 0;
- #endif
-     int res;
- 
-     do {
-         res = libdav1d_receive_frame_internal(c, p);
-     } while (res > 0);
-@@ -458,34 +435,19 @@ static int libdav1d_receive_frame(AVCode
-     av_reduce(&frame->sample_aspect_ratio.num,
-               &frame->sample_aspect_ratio.den,
-               frame->height * (int64_t)p->frame_hdr->render_width,
-               frame->width  * (int64_t)p->frame_hdr->render_height,
-               INT_MAX);
-     ff_set_sar(c, frame->sample_aspect_ratio);
- 
-     pkt = (AVPacket *)p->m.user_data.data;
--    od  = pkt->opaque;
--#if FF_API_REORDERED_OPAQUE
--FF_DISABLE_DEPRECATION_WARNINGS
--    if (od && od->reordered_opaque != AV_NOPTS_VALUE)
--        frame->reordered_opaque = od->reordered_opaque;
--    else
--        frame->reordered_opaque = AV_NOPTS_VALUE;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
--    // restore the original user opaque value for
--    // ff_decode_frame_props_from_pkt()
--    pkt->opaque = od ? od->pkt_orig_opaque : NULL;
--    av_freep(&od);
- 
-     // match timestamps and packet size
-     res = ff_decode_frame_props_from_pkt(c, frame, pkt);
--    pkt->opaque = NULL;
-     if (res < 0)
-         goto fail;
- 
-     frame->pkt_dts = pkt->pts;
-     if (p->frame_hdr->frame_type == DAV1D_FRAME_TYPE_KEY)
-         frame->flags |= AV_FRAME_FLAG_KEY;
-     else
-         frame->flags &= ~AV_FRAME_FLAG_KEY;
-@@ -502,119 +464,153 @@ FF_ENABLE_DEPRECATION_WARNINGS
-         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);
-+        AVMasteringDisplayMetadata *mastering;
-+
-+        res = ff_decode_mastering_display_new(c, frame, &mastering);
-+        if (res < 0)
-             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);
-+        if (mastering) {
-+            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;
-         }
--        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);
-+        AVContentLightMetadata *light;
-+
-+        res = ff_decode_content_light_new(c, frame, &light);
-+        if (res < 0)
-             goto fail;
-+
-+        if (light) {
-+            light->MaxCLL = p->content_light->max_content_light_level;
-+            light->MaxFALL = p->content_light->max_frame_average_light_level;
-         }
--        light->MaxCLL = p->content_light->max_content_light_level;
--        light->MaxFALL = p->content_light->max_frame_average_light_level;
-     }
-     if (p->itut_t35) {
- #if FF_DAV1D_VERSION_AT_LEAST(6,9)
-         for (size_t i = 0; i < p->n_itut_t35; i++) {
-             const Dav1dITUTT35 *itut_t35 = &p->itut_t35[i];
- #else
-         const Dav1dITUTT35 *itut_t35 = p->itut_t35;
- #endif
-         GetByteContext gb;
-         int provider_code;
- 
-         bytestream2_init(&gb, itut_t35->payload, itut_t35->payload_size);
- 
-         provider_code = bytestream2_get_be16(&gb);
-         switch (provider_code) {
--        case 0x31: { // atsc_provider_code
-+        case ITU_T_T35_PROVIDER_CODE_ATSC: {
-             uint32_t user_identifier = bytestream2_get_be32(&gb);
-             switch (user_identifier) {
-             case MKBETAG('G', 'A', '9', '4'): { // closed captions
-                 AVBufferRef *buf = NULL;
- 
-                 res = ff_parse_a53_cc(&buf, gb.buffer, bytestream2_get_bytes_left(&gb));
-                 if (res < 0)
-                     goto fail;
-                 if (!res)
-                     break;
- 
--                if (!av_frame_new_side_data_from_buf(frame, AV_FRAME_DATA_A53_CC, buf))
--                    av_buffer_unref(&buf);
-+                res = ff_frame_new_side_data_from_buf(c, frame, AV_FRAME_DATA_A53_CC, &buf, NULL);
-+                if (res < 0)
-+                    goto fail;
- 
-                 c->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
-                 break;
-             }
-             default: // ignore unsupported identifiers
-                 break;
-             }
-             break;
-         }
--        case 0x3C: { // smpte_provider_code
-+        case ITU_T_T35_PROVIDER_CODE_SMTPE: {
-             AVDynamicHDRPlus *hdrplus;
-             int provider_oriented_code = bytestream2_get_be16(&gb);
-             int application_identifier = bytestream2_get_byte(&gb);
- 
--            if (itut_t35->country_code != 0xB5 ||
-+            if (itut_t35->country_code != ITU_T_T35_COUNTRY_CODE_US ||
-                 provider_oriented_code != 1 || application_identifier != 4)
-                 break;
- 
-             hdrplus = av_dynamic_hdr_plus_create_side_data(frame);
-             if (!hdrplus) {
-                 res = AVERROR(ENOMEM);
-                 goto fail;
-             }
- 
-             res = av_dynamic_hdr_plus_from_t35(hdrplus, gb.buffer,
-                                                bytestream2_get_bytes_left(&gb));
-             if (res < 0)
-                 goto fail;
-             break;
-         }
-+        case ITU_T_T35_PROVIDER_CODE_DOLBY: {
-+            int provider_oriented_code = bytestream2_get_be32(&gb);
-+            if (itut_t35->country_code != ITU_T_T35_COUNTRY_CODE_US ||
-+                provider_oriented_code != 0x800)
-+                break;
-+
-+            res = ff_dovi_rpu_parse(&dav1d->dovi, gb.buffer, gb.buffer_end - gb.buffer,
-+                                    c->err_recognition);
-+            if (res < 0) {
-+                av_log(c, AV_LOG_WARNING, "Error parsing DOVI OBU.\n");
-+                break; // ignore
-+            }
-+
-+            res = ff_dovi_attach_side_data(&dav1d->dovi, frame);
-+            if (res < 0)
-+                goto fail;
-+            break;
-+        }
-         default: // ignore unsupported provider codes
-             break;
-         }
- #if FF_DAV1D_VERSION_AT_LEAST(6,9)
-         }
- #endif
-     }
-     if (p->frame_hdr->film_grain.present && (!dav1d->apply_grain ||
-         (c->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN))) {
-         AVFilmGrainParams *fgp = av_film_grain_params_create_side_data(frame);
-+        const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(frame->format);
-+        av_assert0(pixdesc);
-         if (!fgp) {
-             res = AVERROR(ENOMEM);
-             goto fail;
-         }
- 
-         fgp->type = AV_FILM_GRAIN_PARAMS_AV1;
-         fgp->seed = p->frame_hdr->film_grain.data.seed;
-+        fgp->width = frame->width;
-+        fgp->height = frame->height;
-+        fgp->color_range = frame->color_range;
-+        fgp->color_primaries = frame->color_primaries;
-+        fgp->color_trc = frame->color_trc;
-+        fgp->color_space = frame->colorspace;
-+        fgp->subsampling_x = pixdesc->log2_chroma_w;
-+        fgp->subsampling_y = pixdesc->log2_chroma_h;
-         fgp->codec.aom.num_y_points = p->frame_hdr->film_grain.data.num_y_points;
-         fgp->codec.aom.chroma_scaling_from_luma = p->frame_hdr->film_grain.data.chroma_scaling_from_luma;
-         fgp->codec.aom.scaling_shift = p->frame_hdr->film_grain.data.scaling_shift;
-         fgp->codec.aom.ar_coeff_lag = p->frame_hdr->film_grain.data.ar_coeff_lag;
-         fgp->codec.aom.ar_coeff_shift = p->frame_hdr->film_grain.data.ar_coeff_shift;
-         fgp->codec.aom.grain_scale_shift = p->frame_hdr->film_grain.data.grain_scale_shift;
-         fgp->codec.aom.overlap_flag = p->frame_hdr->film_grain.data.overlap_flag;
-         fgp->codec.aom.limit_output_range = p->frame_hdr->film_grain.data.clip_to_restricted_range;
-@@ -647,16 +643,17 @@ fail:
-     return res;
- }
- 
- static av_cold int libdav1d_close(AVCodecContext *c)
- {
-     Libdav1dContext *dav1d = c->priv_data;
- 
-     av_buffer_pool_uninit(&dav1d->pool);
-+    ff_dovi_ctx_unref(&dav1d->dovi);
-     dav1d_data_unref(&dav1d->data);
-     dav1d_close(&dav1d->c);
- 
-     return 0;
- }
- 
- #ifndef DAV1D_MAX_FRAME_THREADS
- #define DAV1D_MAX_FRAME_THREADS DAV1D_MAX_THREADS
-diff --git a/media/ffvpx/libavcodec/libopusenc.c b/media/ffvpx/libavcodec/libopusenc.c
---- a/media/ffvpx/libavcodec/libopusenc.c
-+++ b/media/ffvpx/libavcodec/libopusenc.c
-@@ -18,16 +18,17 @@
-  * License along with FFmpeg; if not, write to the Free Software
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-  */
- 
- #include <opus.h>
- #include <opus_multistream.h>
- 
- #include "libavutil/channel_layout.h"
-+#include "libavutil/mem.h"
- #include "libavutil/opt.h"
- #include "avcodec.h"
- #include "bytestream.h"
- #include "codec_internal.h"
- #include "encode.h"
- #include "libopus.h"
- #include "audio_frame_queue.h"
- #include "vorbis_data.h"
-@@ -547,28 +548,28 @@ static av_cold int libopus_encode_close(
-     av_freep(&opus->samples);
- 
-     return 0;
- }
- 
- #define OFFSET(x) offsetof(LibopusEncContext, opts.x)
- #define FLAGS AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
- static const AVOption libopus_options[] = {
--    { "application",    "Intended application type",           OFFSET(application),    AV_OPT_TYPE_INT,   { .i64 = OPUS_APPLICATION_AUDIO }, OPUS_APPLICATION_VOIP, OPUS_APPLICATION_RESTRICTED_LOWDELAY, FLAGS, "application" },
--        { "voip",           "Favor improved speech intelligibility",   0, AV_OPT_TYPE_CONST, { .i64 = OPUS_APPLICATION_VOIP },                0, 0, FLAGS, "application" },
--        { "audio",          "Favor faithfulness to the input",         0, AV_OPT_TYPE_CONST, { .i64 = OPUS_APPLICATION_AUDIO },               0, 0, FLAGS, "application" },
--        { "lowdelay",       "Restrict to only the lowest delay modes", 0, AV_OPT_TYPE_CONST, { .i64 = OPUS_APPLICATION_RESTRICTED_LOWDELAY }, 0, 0, FLAGS, "application" },
-+    { "application",    "Intended application type",           OFFSET(application),    AV_OPT_TYPE_INT,   { .i64 = OPUS_APPLICATION_AUDIO }, OPUS_APPLICATION_VOIP, OPUS_APPLICATION_RESTRICTED_LOWDELAY, FLAGS, .unit = "application" },
-+        { "voip",           "Favor improved speech intelligibility",   0, AV_OPT_TYPE_CONST, { .i64 = OPUS_APPLICATION_VOIP },                0, 0, FLAGS, .unit = "application" },
-+        { "audio",          "Favor faithfulness to the input",         0, AV_OPT_TYPE_CONST, { .i64 = OPUS_APPLICATION_AUDIO },               0, 0, FLAGS, .unit = "application" },
-+        { "lowdelay",       "Restrict to only the lowest delay modes, disable voice-optimized modes", 0, AV_OPT_TYPE_CONST, { .i64 = OPUS_APPLICATION_RESTRICTED_LOWDELAY }, 0, 0, FLAGS, .unit = "application" },
-     { "frame_duration", "Duration of a frame in milliseconds", OFFSET(frame_duration), AV_OPT_TYPE_FLOAT, { .dbl = 20.0 }, 2.5, 120.0, FLAGS },
-     { "packet_loss",    "Expected packet loss percentage",     OFFSET(packet_loss),    AV_OPT_TYPE_INT,   { .i64 = 0 },    0,   100,  FLAGS },
-     { "fec",             "Enable inband FEC. Expected packet loss must be non-zero",     OFFSET(fec),    AV_OPT_TYPE_BOOL,   { .i64 = 0 }, 0, 1, FLAGS },
--    { "vbr",            "Variable bit rate mode",              OFFSET(vbr),            AV_OPT_TYPE_INT,   { .i64 = 1 },    0,   2,    FLAGS, "vbr" },
--        { "off",            "Use constant bit rate", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, "vbr" },
--        { "on",             "Use variable bit rate", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, "vbr" },
--        { "constrained",    "Use constrained VBR",   0, AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0, FLAGS, "vbr" },
--    { "mapping_family", "Channel Mapping Family",              OFFSET(mapping_family), AV_OPT_TYPE_INT,   { .i64 = -1 },   -1,  255,  FLAGS, "mapping_family" },
-+    { "vbr",            "Variable bit rate mode",              OFFSET(vbr),            AV_OPT_TYPE_INT,   { .i64 = 1 },    0,   2,    FLAGS, .unit = "vbr" },
-+        { "off",            "Use constant bit rate", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, .unit = "vbr" },
-+        { "on",             "Use variable bit rate", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, .unit = "vbr" },
-+        { "constrained",    "Use constrained VBR",   0, AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0, FLAGS, .unit = "vbr" },
-+    { "mapping_family", "Channel Mapping Family",              OFFSET(mapping_family), AV_OPT_TYPE_INT,   { .i64 = -1 },   -1,  255,  FLAGS, .unit = "mapping_family" },
-     { "dtx", "Enable DTX", OFFSET(dtx), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
- #ifdef OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST
-     { "apply_phase_inv", "Apply intensity stereo phase inversion", OFFSET(apply_phase_inv), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS },
- #endif
-     { NULL },
- };
- 
- static const AVClass libopus_class = {
-diff --git a/media/ffvpx/libavcodec/libvorbisenc.c b/media/ffvpx/libavcodec/libvorbisenc.c
---- a/media/ffvpx/libavcodec/libvorbisenc.c
-+++ b/media/ffvpx/libavcodec/libvorbisenc.c
-@@ -18,16 +18,17 @@
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-  */
- 
- #include <vorbis/vorbisenc.h>
- 
- #include "libavutil/avassert.h"
- #include "libavutil/channel_layout.h"
- #include "libavutil/fifo.h"
-+#include "libavutil/mem.h"
- #include "libavutil/opt.h"
- #include "avcodec.h"
- #include "audio_frame_queue.h"
- #include "codec_internal.h"
- #include "encode.h"
- #include "version.h"
- #include "vorbis_parser.h"
- 
-diff --git a/media/ffvpx/libavcodec/libvpxenc.c b/media/ffvpx/libavcodec/libvpxenc.c
---- a/media/ffvpx/libavcodec/libvpxenc.c
-+++ b/media/ffvpx/libavcodec/libvpxenc.c
-@@ -28,32 +28,35 @@
- #define VPX_DISABLE_CTRL_TYPECHECKS 1
- #define VPX_CODEC_DISABLE_COMPAT    1
- #include <vpx/vpx_encoder.h>
- #include <vpx/vp8cx.h>
- 
- #include "avcodec.h"
- #include "codec_internal.h"
- #include "encode.h"
--#include "internal.h"
- #include "libavutil/avassert.h"
-+#include "libavutil/mem.h"
- #include "libvpx.h"
- #include "packet_internal.h"
- #include "profiles.h"
- #include "libavutil/avstring.h"
- #include "libavutil/base64.h"
- #include "libavutil/common.h"
- #include "libavutil/cpu.h"
- #include "libavutil/fifo.h"
- #include "libavutil/internal.h"
- #include "libavutil/intreadwrite.h"
- #include "libavutil/mathematics.h"
- #include "libavutil/opt.h"
- #include "libavutil/pixdesc.h"
- 
-+#define IS_VP9(avctx) (CONFIG_LIBVPX_VP9_ENCODER && avctx->codec_id == AV_CODEC_ID_VP9)
-+#define IS_VP8(avctx) (CONFIG_LIBVPX_VP8_ENCODER && avctx->codec_id == AV_CODEC_ID_VP8)
-+
- /**
-  * Portion of struct vpx_codec_cx_pkt from vpx_encoder.h.
-  * One encoded frame returned from the library.
-  */
- struct FrameListData {
-     void *buf;                       /**< compressed data buffer */
-     size_t sz;                       /**< length of compressed data */
-     int64_t pts;                     /**< time stamp to show frame
-@@ -63,19 +66,16 @@ struct FrameListData {
-     int have_sse;                    /**< true if we have pending sse[] */
-     struct FrameListData *next;
- };
- 
- typedef struct FrameData {
-     int64_t pts;
-     int64_t duration;
- 
--#if FF_API_REORDERED_OPAQUE
--    int64_t      reordered_opaque;
--#endif
-     void        *frame_opaque;
-     AVBufferRef *frame_opaque_ref;
- 
-     AVBufferRef *hdr10_plus;
- } FrameData;
- 
- typedef struct VPxEncoderContext {
-     AVClass *class;
-@@ -116,16 +116,19 @@ typedef struct VPxEncoderContext {
-     int max_intra_rate;
-     int rc_undershoot_pct;
-     int rc_overshoot_pct;
- 
-     AVDictionary *vpx_ts_parameters;
-     int *ts_layer_flags;
-     int current_temporal_idx;
- 
-+    // VP8-only
-+    int screen_content_mode;
-+
-     // VP9-only
-     int lossless;
-     int tile_columns;
-     int tile_rows;
-     int frame_parallel;
-     int aq_mode;
-     int drop_threshold;
-     int noise_sensitivity;
-@@ -159,16 +162,17 @@ static const char *const ctlidstr[] = {
-     [VP8E_SET_ARNR_MAXFRAMES]    = "VP8E_SET_ARNR_MAXFRAMES",
-     [VP8E_SET_ARNR_STRENGTH]     = "VP8E_SET_ARNR_STRENGTH",
-     [VP8E_SET_ARNR_TYPE]         = "VP8E_SET_ARNR_TYPE",
-     [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",
-+    [VP8E_SET_SCREEN_CONTENT_MODE]     = "VP8E_SET_SCREEN_CONTENT_MODE",
- #if CONFIG_LIBVPX_VP9_ENCODER
-     [VP9E_SET_LOSSLESS]                = "VP9E_SET_LOSSLESS",
-     [VP9E_SET_TILE_COLUMNS]            = "VP9E_SET_TILE_COLUMNS",
-     [VP9E_SET_TILE_ROWS]               = "VP9E_SET_TILE_ROWS",
-     [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",
-@@ -351,44 +355,38 @@ static av_cold void fifo_free(AVFifo **f
- 
- static int frame_data_submit(AVCodecContext *avctx, AVFifo *fifo,
-                              const AVFrame *frame)
- {
-     VPxContext *ctx = avctx->priv_data;
-     const struct vpx_codec_enc_cfg *enccfg = ctx->encoder.config.enc;
- 
-     FrameData fd = { .pts = frame->pts };
--
--    AVFrameSideData *av_uninit(sd);
-     int ret;
- 
--#if CONFIG_LIBVPX_VP9_ENCODER
--    // Keep HDR10+ if it has bit depth higher than 8 and
--    // it has PQ trc (SMPTE2084).
--    sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DYNAMIC_HDR_PLUS);
--    if (avctx->codec_id == AV_CODEC_ID_VP9 && sd &&
-+    if (IS_VP9(avctx) &&
-+        // Keep HDR10+ if it has bit depth higher than 8 and
-+        // it has PQ trc (SMPTE2084).
-         enccfg->g_bit_depth > 8 && avctx->color_trc == AVCOL_TRC_SMPTE2084) {
--        fd.hdr10_plus = av_buffer_ref(sd->buf);
--        if (!fd.hdr10_plus)
--            return AVERROR(ENOMEM);
-+        const AVFrameSideData *sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DYNAMIC_HDR_PLUS);
-+
-+        if (sd) {
-+            fd.hdr10_plus = av_buffer_ref(sd->buf);
-+            if (!fd.hdr10_plus)
-+                return AVERROR(ENOMEM);
-+        }
-     }
--#endif
- 
-     fd.duration     = frame->duration;
-     fd.frame_opaque = frame->opaque;
-     if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE && frame->opaque_ref) {
-         ret = av_buffer_replace(&fd.frame_opaque_ref, frame->opaque_ref);
-         if (ret < 0)
-             goto fail;
-     }
--#if FF_API_REORDERED_OPAQUE
--FF_DISABLE_DEPRECATION_WARNINGS
--    fd.reordered_opaque = frame->reordered_opaque;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
- 
-     ret = av_fifo_write(fifo, &fd, 1);
-     if (ret < 0)
-         goto fail;
- 
-     return 0;
- fail:
-     frame_data_uninit(&fd);
-@@ -405,22 +403,16 @@ static int frame_data_apply(AVCodecConte
-         return 0;
-     if (fd.pts != pkt->pts) {
-         av_log(avctx, AV_LOG_WARNING,
-                "Mismatching timestamps: libvpx %"PRId64" queued %"PRId64"; "
-                "this is a bug, please report it\n", pkt->pts, fd.pts);
-         goto skip;
-     }
- 
--#if FF_API_REORDERED_OPAQUE
--FF_DISABLE_DEPRECATION_WARNINGS
--    avctx->reordered_opaque = fd.reordered_opaque;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
-     pkt->duration = fd.duration;
-     if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
-         pkt->opaque         = fd.frame_opaque;
-         pkt->opaque_ref     = fd.frame_opaque_ref;
-         fd.frame_opaque_ref = NULL;
-     }
- 
-     if (fd.hdr10_plus) {
-@@ -789,17 +781,17 @@ static int vpx_parse_ref_frame_config(vp
- }
- #endif
- 
- #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,
-                        vpx_img_fmt_t *img_fmt)
- {
--    VPxContext av_unused *ctx = avctx->priv_data;
-+    VPxContext *ctx = avctx->priv_data;
-     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
-     enccfg->g_bit_depth = enccfg->g_input_bit_depth = desc->comp[0].depth;
-     switch (avctx->pix_fmt) {
-     case AV_PIX_FMT_YUV420P:
-     case AV_PIX_FMT_YUVA420P:
-         enccfg->g_profile = 0;
-         *img_fmt = VPX_IMG_FMT_I420;
-         return 0;
-@@ -1257,16 +1249,24 @@ static av_cold int vpx_init(AVCodecConte
-             codecctl_int(avctx, VP9E_SET_TPL, ctx->tpl_model);
- #endif
- #ifdef VPX_CTRL_VP9E_SET_MIN_GF_INTERVAL
-         if (ctx->min_gf_interval >= 0)
-             codecctl_int(avctx, VP9E_SET_MIN_GF_INTERVAL, ctx->min_gf_interval);
- #endif
-     }
- #endif
-+    if (avctx->codec_id == AV_CODEC_ID_VP8 && ctx->screen_content_mode >= 0) {
-+        if (ctx->screen_content_mode == 2 && ctx->is_alpha) {
-+            av_log(avctx, AV_LOG_ERROR,
-+                   "Transparency encoding with screen mode with aggressive rate control not supported\n");
-+            return AVERROR(EINVAL);
-+        }
-+        codecctl_int(avctx, VP8E_SET_SCREEN_CONTENT_MODE, ctx->screen_content_mode);
-+    }
- 
-     av_log(avctx, AV_LOG_DEBUG, "Using deadline: %d\n", ctx->deadline);
- 
-     //provide dummy value to initialize wrapper, values will be updated each _encode()
-     vpx_img_wrap(&ctx->rawimg, img_fmt, avctx->width, avctx->height, 1,
-                  (unsigned char*)1);
- #if CONFIG_LIBVPX_VP9_ENCODER
-     if (avctx->codec_id == AV_CODEC_ID_VP9 && (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH))
-@@ -1897,101 +1897,102 @@ FF_ENABLE_DEPRECATION_WARNINGS
- #define OFFSET(x) offsetof(VPxContext, x)
- #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
- 
- #define COMMON_OPTIONS \
-     { "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}, \
-     { "arnr-strength",   "altref noise reduction filter strength", OFFSET(arnr_strength),   AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE}, \
--    { "arnr-type",       "altref noise reduction filter type",     OFFSET(arnr_type),       AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE, "arnr_type"}, \
--    { "backward",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, "arnr_type" }, \
--    { "forward",         NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, "arnr_type" }, \
--    { "centered",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0, VE, "arnr_type" }, \
--    { "tune",            "Tune the encoding to a specific scenario", OFFSET(tune),          AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE, "tune"}, \
--    { "psnr",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VP8_TUNE_PSNR}, 0, 0, VE, "tune"}, \
--    { "ssim",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VP8_TUNE_SSIM}, 0, 0, VE, "tune"}, \
--    { "deadline",        "Time to spend encoding, in microseconds.", OFFSET(deadline),      AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, "quality"}, \
--    { "best",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_BEST_QUALITY}, 0, 0, VE, "quality"}, \
--    { "good",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_GOOD_QUALITY}, 0, 0, VE, "quality"}, \
--    { "realtime",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_REALTIME},     0, 0, VE, "quality"}, \
--    { "error-resilient", "Error resilience configuration", OFFSET(error_resilient), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, VE, "er"}, \
-+    { "arnr-type",       "altref noise reduction filter type",     OFFSET(arnr_type),       AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE, .unit = "arnr_type"}, \
-+    { "backward",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, .unit = "arnr_type" }, \
-+    { "forward",         NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, .unit = "arnr_type" }, \
-+    { "centered",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0, VE, .unit = "arnr_type" }, \
-+    { "tune",            "Tune the encoding to a specific scenario", OFFSET(tune),          AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE, .unit = "tune"}, \
-+    { "psnr",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VP8_TUNE_PSNR}, 0, 0, VE, .unit = "tune"}, \
-+    { "ssim",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VP8_TUNE_SSIM}, 0, 0, VE, .unit = "tune"}, \
-+    { "deadline",        "Time to spend encoding, in microseconds.", OFFSET(deadline),      AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, .unit = "quality"}, \
-+    { "best",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_BEST_QUALITY}, 0, 0, VE, .unit = "quality"}, \
-+    { "good",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_GOOD_QUALITY}, 0, 0, VE, .unit = "quality"}, \
-+    { "realtime",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_REALTIME},     0, 0, VE, .unit = "quality"}, \
-+    { "error-resilient", "Error resilience configuration", OFFSET(error_resilient), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, VE, .unit = "er"}, \
-     { "max-intra-rate",  "Maximum I-frame bitrate (pct) 0=unlimited",  OFFSET(max_intra_rate),  AV_OPT_TYPE_INT,  {.i64 = -1}, -1,      INT_MAX, VE}, \
--    { "default",         "Improve resiliency against losses of whole frames", 0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_DEFAULT}, 0, 0, VE, "er"}, \
-+    { "default",         "Improve resiliency against losses of whole frames", 0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_DEFAULT}, 0, 0, VE, .unit = "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 prediction" \
--                         " is still done over the partition boundary.",       0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_PARTITIONS}, 0, 0, VE, "er"}, \
-+                         " is still done over the partition boundary.",       0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_PARTITIONS}, 0, 0, VE, .unit = "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 }, \
-     { "drop-threshold",   "Frame drop threshold", offsetof(VPxContext, 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}, \
-     { "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}, \
--    {"quality", "", offsetof(VPxContext, deadline), AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, "quality"}, \
--    {"vp8flags", "", offsetof(VPxContext, flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, UINT_MAX, VE, "flags"}, \
--    {"error_resilient", "enable error resilience", 0, AV_OPT_TYPE_CONST, {.i64 = VP8F_ERROR_RESILIENT}, INT_MIN, INT_MAX, VE, "flags"}, \
--    {"altref", "enable use of alternate reference frames (VP8/2-pass only)", 0, AV_OPT_TYPE_CONST, {.i64 = VP8F_AUTO_ALT_REF}, INT_MIN, INT_MAX, VE, "flags"}, \
-+    {"quality", "", offsetof(VPxContext, deadline), AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, .unit = "quality"}, \
-+    {"vp8flags", "", offsetof(VPxContext, flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, UINT_MAX, VE, .unit = "flags"}, \
-+    {"error_resilient", "enable error resilience", 0, AV_OPT_TYPE_CONST, {.i64 = VP8F_ERROR_RESILIENT}, INT_MIN, INT_MAX, VE, .unit = "flags"}, \
-+    {"altref", "enable use of alternate reference frames (VP8/2-pass only)", 0, AV_OPT_TYPE_CONST, {.i64 = VP8F_AUTO_ALT_REF}, INT_MIN, INT_MAX, VE, .unit = "flags"}, \
-     {"arnr_max_frames", "altref noise reduction max frame count", offsetof(VPxContext, arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 15, VE}, \
-     {"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},
-+    { "screen-content-mode",     "Encoder screen content mode",         OFFSET(screen_content_mode), AV_OPT_TYPE_INT, {.i64 = -1}, -1,  2, VE},
-     LEGACY_OPTIONS
-     { NULL }
- };
- #endif
- 
- #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},
-     { "tile-rows",       "Number of tile rows to use, log2",            OFFSET(tile_rows),       AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, VE},
-     { "frame-parallel",  "Enable frame parallel decodability features", OFFSET(frame_parallel),  AV_OPT_TYPE_BOOL,{.i64 = -1}, -1, 1, VE},
- #if VPX_ENCODER_ABI_VERSION >= 12
--    { "aq-mode",         "adaptive quantization mode",                  OFFSET(aq_mode),         AV_OPT_TYPE_INT, {.i64 = -1}, -1, 4, VE, "aq_mode"},
-+    { "aq-mode",         "adaptive quantization mode",                  OFFSET(aq_mode),         AV_OPT_TYPE_INT, {.i64 = -1}, -1, 4, VE, .unit = "aq_mode"},
- #else
--    { "aq-mode",         "adaptive quantization mode",                  OFFSET(aq_mode),         AV_OPT_TYPE_INT, {.i64 = -1}, -1, 3, VE, "aq_mode"},
-+    { "aq-mode",         "adaptive quantization mode",                  OFFSET(aq_mode),         AV_OPT_TYPE_INT, {.i64 = -1}, -1, 3, VE, .unit = "aq_mode"},
- #endif
--    { "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" },
-+    { "none",            "Aq not used",         0, AV_OPT_TYPE_CONST, {.i64 = 0}, 0, 0, VE, .unit = "aq_mode" },
-+    { "variance",        "Variance based Aq",   0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, .unit = "aq_mode" },
-+    { "complexity",      "Complexity based Aq", 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, .unit = "aq_mode" },
-+    { "cyclic",          "Cyclic Refresh Aq",   0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0, VE, .unit = "aq_mode" },
- #if VPX_ENCODER_ABI_VERSION >= 12
--    { "equator360",      "360 video Aq",        0, AV_OPT_TYPE_CONST, {.i64 = 4}, 0, 0, VE, "aq_mode" },
-+    { "equator360",      "360 video Aq",        0, AV_OPT_TYPE_CONST, {.i64 = 4}, 0, 0, VE, .unit = "aq_mode" },
-     {"level", "Specify level", OFFSET(level), AV_OPT_TYPE_FLOAT, {.dbl=-1}, -1, 6.2, VE},
- #endif
- #ifdef VPX_CTRL_VP9E_SET_ROW_MT
-     {"row-mt", "Row based multi-threading", OFFSET(row_mt), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
- #endif
- #ifdef VPX_CTRL_VP9E_SET_TUNE_CONTENT
- #if VPX_ENCODER_ABI_VERSION >= 14
--    { "tune-content",    "Tune content type", OFFSET(tune_content), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, VE, "tune_content" },
-+    { "tune-content",    "Tune content type", OFFSET(tune_content), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, VE, .unit = "tune_content" },
- #else
--    { "tune-content",    "Tune content type", OFFSET(tune_content), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, VE, "tune_content" },
-+    { "tune-content",    "Tune content type", OFFSET(tune_content), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, VE, .unit = "tune_content" },
- #endif
--    { "default",         "Regular video content",                  0, AV_OPT_TYPE_CONST, {.i64 = 0}, 0, 0, VE, "tune_content" },
--    { "screen",          "Screen capture content",                 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, "tune_content" },
-+    { "default",         "Regular video content",                  0, AV_OPT_TYPE_CONST, {.i64 = 0}, 0, 0, VE, .unit = "tune_content" },
-+    { "screen",          "Screen capture content",                 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, .unit = "tune_content" },
- #if VPX_ENCODER_ABI_VERSION >= 14
--    { "film",            "Film content; improves grain retention", 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, "tune_content" },
-+    { "film",            "Film content; improves grain retention", 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, .unit = "tune_content" },
- #endif
- #endif
- #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
-diff --git a/media/ffvpx/libavcodec/me_cmp.h b/media/ffvpx/libavcodec/me_cmp.h
---- a/media/ffvpx/libavcodec/me_cmp.h
-+++ b/media/ffvpx/libavcodec/me_cmp.h
-@@ -81,16 +81,17 @@ typedef struct MECmpContext {
-     me_cmp_func median_sad[6];
- } MECmpContext;
- 
- void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx);
- void ff_me_cmp_init_aarch64(MECmpContext *c, AVCodecContext *avctx);
- void ff_me_cmp_init_alpha(MECmpContext *c, AVCodecContext *avctx);
- void ff_me_cmp_init_arm(MECmpContext *c, AVCodecContext *avctx);
- void ff_me_cmp_init_ppc(MECmpContext *c, AVCodecContext *avctx);
-+void ff_me_cmp_init_riscv(MECmpContext *c, AVCodecContext *avctx);
- void ff_me_cmp_init_x86(MECmpContext *c, AVCodecContext *avctx);
- void ff_me_cmp_init_mips(MECmpContext *c, AVCodecContext *avctx);
- 
- int ff_set_cmp(MECmpContext *c, me_cmp_func *cmp, int type);
- 
- void ff_dsputil_init_dwt(MECmpContext *c);
- 
- #endif /* AVCODEC_ME_CMP_H */
-diff --git a/media/ffvpx/libavcodec/moz.build b/media/ffvpx/libavcodec/moz.build
---- a/media/ffvpx/libavcodec/moz.build
-+++ b/media/ffvpx/libavcodec/moz.build
-@@ -10,26 +10,26 @@ if CONFIG['FFVPX_ASFLAGS']:
-     if CONFIG['TARGET_CPU'] == 'x86' or CONFIG['TARGET_CPU'] == 'x86_64':
-         DIRS += ['x86']
-     elif CONFIG['TARGET_CPU'] == 'arm':
-         DIRS += ['arm']
- 
- if CONFIG['TARGET_CPU'] == 'aarch64':
-     DIRS += ['aarch64']
- 
-+DIRS += ['bsf']
-+
- LOCAL_INCLUDES += ['/modules/fdlibm/inexact-math-override']
- 
- SharedLibrary('mozavcodec')
- SOURCES += [
-     'allcodecs.c',
-     'audio_frame_queue.c',
-     'avcodec.c',
-     'avdct.c',
--    'avfft.c',
--    'avpacket.c',
-     'bitstream.c',
-     'bitstream_filters.c',
-     'bsf.c',
-     'codec_desc.c',
-     'codec_par.c',
-     'dct32_fixed.c',
-     'dct32_float.c',
-     'decode.c',
-@@ -57,18 +57,18 @@ SOURCES += [
-     'mpegaudiodec_common.c',
-     'mpegaudiodec_fixed.c',
-     'mpegaudiodecheader.c',
-     'mpegaudiodsp.c',
-     'mpegaudiodsp_data.c',
-     'mpegaudiodsp_fixed.c',
-     'mpegaudiodsp_float.c',
-     'mpegaudiotabs.c',
--    'null_bsf.c',
-     'options.c',
-+    'packet.c',
-     'parser.c',
-     'parsers.c',
-     'pcm.c',
-     'profiles.c',
-     'pthread.c',
-     'pthread_frame.c',
-     'pthread_slice.c',
-     'refstruct.c',
-@@ -80,20 +80,18 @@ SOURCES += [
-     'vorbis_data.c',
-     'vorbis_parser.c',
-     'xiph.c'
- ]
- 
- if not CONFIG['MOZ_FFVPX_AUDIOONLY']:
-     SOURCES += [
-         'atsc_a53.c',
--        'av1_frame_split_bsf.c',
-         'av1_parse.c',
-         'av1dec.c',
--        'avpicture.c',
-         'cbs.c',
-         'cbs_av1.c',
-         'golomb.c',
-         'h264pred.c',
-         'imgconvert.c',
-         'libaom.c',
-         'libaomenc.c',
-         'libdav1d.c',
-@@ -104,17 +102,16 @@ if not CONFIG['MOZ_FFVPX_AUDIOONLY']:
-         'raw.c',
-         'videodsp.c',
-         'vp8.c',
-         'vp8_parser.c',
-         'vp8data.c',
-         'vp8dsp.c',
-         'vp9.c',
-         'vp9_parser.c',
--        'vp9_superframe_split_bsf.c',
-         'vp9block.c',
-         'vp9data.c',
-         'vp9dsp.c',
-         'vp9dsp_10bpp.c',
-         'vp9dsp_12bpp.c',
-         'vp9dsp_8bpp.c',
-         'vp9lpf.c',
-         'vp9mvs.c',
-@@ -138,16 +135,21 @@ if not CONFIG['MOZ_FFVPX_AUDIOONLY']:
-           'mozva'
-         ]
- 
- LOCAL_INCLUDES += [
-     '/media/libopus/include',
-     '/media/libvorbis',
- ]
- 
-+c11_flags = ["-std=gnu11"]
-+if CONFIG["CC_TYPE"] == "clang-cl":
-+    c11_flags.insert(0, "-Xclang")
-+CFLAGS += c11_flags
-+
- if not CONFIG["MOZ_SYSTEM_LIBVPX"]:
-   LOCAL_INCLUDES += ['/media/libvpx']
- else:
-   CXXFLAGS += CONFIG["MOZ_LIBVPX_CFLAGS"]
-   OS_LIBS += CONFIG["MOZ_LIBVPX_LIBS"]
- 
- SYMBOLS_FILE = 'avcodec.symbols'
- NoVisibilityFlags()
-diff --git a/media/ffvpx/libavcodec/mpegaudiodata.h b/media/ffvpx/libavcodec/mpegaudiodata.h
---- a/media/ffvpx/libavcodec/mpegaudiodata.h
-+++ b/media/ffvpx/libavcodec/mpegaudiodata.h
-@@ -26,21 +26,23 @@
- 
- #ifndef AVCODEC_MPEGAUDIODATA_H
- #define AVCODEC_MPEGAUDIODATA_H
- 
- #include <stdint.h>
- 
- #include "config.h"
- 
-+#include "libavutil/attributes_internal.h"
- #include "vlc.h"
- 
- #define MODE_EXT_MS_STEREO 2
- #define MODE_EXT_I_STEREO  1
- 
-+FF_VISIBILITY_PUSH_HIDDEN
- extern const uint16_t ff_mpa_bitrate_tab[2][3][15];
- extern const uint16_t ff_mpa_freq_tab[3];
- extern const int ff_mpa_sblimit_table[5];
- extern const int ff_mpa_quant_steps[17];
- extern const int ff_mpa_quant_bits[17];
- extern const unsigned char * const ff_mpa_alloc_tables[5];
- 
- #define TABLE_4_3_SIZE ((8191 + 16)*4)
-@@ -73,10 +75,11 @@ extern int16_t *const ff_division_tabs[4
- /* lower 2 bits: modulo 3, higher bits: shift */
- extern uint16_t ff_scale_factor_modshift[64];
- 
- extern const uint8_t ff_mpa_pretab[2][22];
- 
- /* Initialize tables shared between the fixed and
-  * floating point MPEG audio decoders. */
- void ff_mpegaudiodec_common_init_static(void);
-+FF_VISIBILITY_POP_HIDDEN
- 
- #endif /* AVCODEC_MPEGAUDIODATA_H */
-diff --git a/media/ffvpx/libavcodec/mpegaudiodec_template.c b/media/ffvpx/libavcodec/mpegaudiodec_template.c
---- a/media/ffvpx/libavcodec/mpegaudiodec_template.c
-+++ b/media/ffvpx/libavcodec/mpegaudiodec_template.c
-@@ -27,16 +27,17 @@
- #include "config_components.h"
- 
- #include "libavutil/attributes.h"
- #include "libavutil/avassert.h"
- #include "libavutil/channel_layout.h"
- #include "libavutil/crc.h"
- #include "libavutil/float_dsp.h"
- #include "libavutil/libm.h"
-+#include "libavutil/mem.h"
- #include "libavutil/mem_internal.h"
- #include "libavutil/thread.h"
- 
- #include "avcodec.h"
- #include "decode.h"
- #include "get_bits.h"
- #include "mathops.h"
- #include "mpegaudiodsp.h"
-@@ -87,17 +88,17 @@ typedef struct MPADecodeContext {
-     DECLARE_ALIGNED(32, INTFLOAT, sb_samples)[MPA_MAX_CHANNELS][36][SBLIMIT];
-     INTFLOAT mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */
-     GranuleDef granules[2][2]; /* Used in Layer 3 */
-     int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3
-     int dither_state;
-     int err_recognition;
-     AVCodecContext* avctx;
-     MPADSPContext mpadsp;
--    void (*butterflies_float)(float *av_restrict v1, float *av_restrict v2, int len);
-+    void (*butterflies_float)(float *restrict v1, float *restrict v2, int len);
-     AVFrame *frame;
-     uint32_t crc;
- } MPADecodeContext;
- 
- #define HEADER_SIZE 4
- 
- #include "mpegaudiodata.h"
- 
-diff --git a/media/ffvpx/libavcodec/mpegaudiodectab.h b/media/ffvpx/libavcodec/mpegaudiodectab.h
-deleted file mode 100644
---- a/media/ffvpx/libavcodec/mpegaudiodectab.h
-+++ /dev/null
-@@ -1,615 +0,0 @@
--/*
-- * MPEG Audio decoder
-- * copyright (c) 2002 Fabrice Bellard
-- *
-- * 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
-- * mpeg audio layer decoder tables.
-- */
--
--#ifndef AVCODEC_MPEGAUDIODECTAB_H
--#define AVCODEC_MPEGAUDIODECTAB_H
--
--#include <stddef.h>
--#include <stdint.h>
--
--#include "mpegaudio.h"
--
--/*******************************************************/
--/* layer 3 tables */
--
--/* layer 3 huffman tables */
--typedef struct HuffTable {
--    int xsize;
--    const uint8_t *bits;
--    const uint16_t *codes;
--} HuffTable;
--
--/* layer3 scale factor size */
--static const uint8_t slen_table[2][16] = {
--    { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 },
--    { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 },
--};
--
--/* number of lsf scale factors for a given size */
--static const uint8_t lsf_nsf_table[6][3][4] = {
--    { {  6,  5,  5, 5 }, {  9,  9,  9, 9 }, {  6,  9,  9, 9 } },
--    { {  6,  5,  7, 3 }, {  9,  9, 12, 6 }, {  6,  9, 12, 6 } },
--    { { 11, 10,  0, 0 }, { 18, 18,  0, 0 }, { 15, 18,  0, 0 } },
--    { {  7,  7,  7, 0 }, { 12, 12, 12, 0 }, {  6, 15, 12, 0 } },
--    { {  6,  6,  6, 3 }, { 12,  9,  9, 6 }, {  6, 12,  9, 6 } },
--    { {  8,  8,  5, 0 }, { 15, 12,  9, 0 }, {  6, 18,  9, 0 } },
--};
--
--/* mpegaudio layer 3 huffman tables */
--
--static const uint16_t mpa_huffcodes_1[4] = {
-- 0x0001, 0x0001, 0x0001, 0x0000,
--};
--
--static const uint8_t mpa_huffbits_1[4] = {
--  1,  3,  2,  3,
--};
--
--static const uint16_t mpa_huffcodes_2[9] = {
-- 0x0001, 0x0002, 0x0001, 0x0003, 0x0001, 0x0001, 0x0003, 0x0002,
-- 0x0000,
--};
--
--static const uint8_t mpa_huffbits_2[9] = {
--  1,  3,  6,  3,  3,  5,  5,  5,
--  6,
--};
--
--static const uint16_t mpa_huffcodes_3[9] = {
-- 0x0003, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0003, 0x0002,
-- 0x0000,
--};
--
--static const uint8_t mpa_huffbits_3[9] = {
--  2,  2,  6,  3,  2,  5,  5,  5,
--  6,
--};
--
--static const uint16_t mpa_huffcodes_5[16] = {
-- 0x0001, 0x0002, 0x0006, 0x0005, 0x0003, 0x0001, 0x0004, 0x0004,
-- 0x0007, 0x0005, 0x0007, 0x0001, 0x0006, 0x0001, 0x0001, 0x0000,
--};
--
--static const uint8_t mpa_huffbits_5[16] = {
--  1,  3,  6,  7,  3,  3,  6,  7,
--  6,  6,  7,  8,  7,  6,  7,  8,
--};
--
--static const uint16_t mpa_huffcodes_6[16] = {
-- 0x0007, 0x0003, 0x0005, 0x0001, 0x0006, 0x0002, 0x0003, 0x0002,
-- 0x0005, 0x0004, 0x0004, 0x0001, 0x0003, 0x0003, 0x0002, 0x0000,
--};
--
--static const uint8_t mpa_huffbits_6[16] = {
--  3,  3,  5,  7,  3,  2,  4,  5,
--  4,  4,  5,  6,  6,  5,  6,  7,
--};
--
--static const uint16_t mpa_huffcodes_7[36] = {
-- 0x0001, 0x0002, 0x000a, 0x0013, 0x0010, 0x000a, 0x0003, 0x0003,
-- 0x0007, 0x000a, 0x0005, 0x0003, 0x000b, 0x0004, 0x000d, 0x0011,
-- 0x0008, 0x0004, 0x000c, 0x000b, 0x0012, 0x000f, 0x000b, 0x0002,
-- 0x0007, 0x0006, 0x0009, 0x000e, 0x0003, 0x0001, 0x0006, 0x0004,
-- 0x0005, 0x0003, 0x0002, 0x0000,
--};
--
--static const uint8_t mpa_huffbits_7[36] = {
--  1,  3,  6,  8,  8,  9,  3,  4,
--  6,  7,  7,  8,  6,  5,  7,  8,
--  8,  9,  7,  7,  8,  9,  9,  9,
--  7,  7,  8,  9,  9, 10,  8,  8,
--  9, 10, 10, 10,
--};
--
--static const uint16_t mpa_huffcodes_8[36] = {
-- 0x0003, 0x0004, 0x0006, 0x0012, 0x000c, 0x0005, 0x0005, 0x0001,
-- 0x0002, 0x0010, 0x0009, 0x0003, 0x0007, 0x0003, 0x0005, 0x000e,
-- 0x0007, 0x0003, 0x0013, 0x0011, 0x000f, 0x000d, 0x000a, 0x0004,
-- 0x000d, 0x0005, 0x0008, 0x000b, 0x0005, 0x0001, 0x000c, 0x0004,
-- 0x0004, 0x0001, 0x0001, 0x0000,
--};
--
--static const uint8_t mpa_huffbits_8[36] = {
--  2,  3,  6,  8,  8,  9,  3,  2,
--  4,  8,  8,  8,  6,  4,  6,  8,
--  8,  9,  8,  8,  8,  9,  9, 10,
--  8,  7,  8,  9, 10, 10,  9,  8,
--  9,  9, 11, 11,
--};
--
--static const uint16_t mpa_huffcodes_9[36] = {
-- 0x0007, 0x0005, 0x0009, 0x000e, 0x000f, 0x0007, 0x0006, 0x0004,
-- 0x0005, 0x0005, 0x0006, 0x0007, 0x0007, 0x0006, 0x0008, 0x0008,
-- 0x0008, 0x0005, 0x000f, 0x0006, 0x0009, 0x000a, 0x0005, 0x0001,
-- 0x000b, 0x0007, 0x0009, 0x0006, 0x0004, 0x0001, 0x000e, 0x0004,
-- 0x0006, 0x0002, 0x0006, 0x0000,
--};
--
--static const uint8_t mpa_huffbits_9[36] = {
--  3,  3,  5,  6,  8,  9,  3,  3,
--  4,  5,  6,  8,  4,  4,  5,  6,
--  7,  8,  6,  5,  6,  7,  7,  8,
--  7,  6,  7,  7,  8,  9,  8,  7,
--  8,  8,  9,  9,
--};
--
--static const uint16_t mpa_huffcodes_10[64] = {
-- 0x0001, 0x0002, 0x000a, 0x0017, 0x0023, 0x001e, 0x000c, 0x0011,
-- 0x0003, 0x0003, 0x0008, 0x000c, 0x0012, 0x0015, 0x000c, 0x0007,
-- 0x000b, 0x0009, 0x000f, 0x0015, 0x0020, 0x0028, 0x0013, 0x0006,
-- 0x000e, 0x000d, 0x0016, 0x0022, 0x002e, 0x0017, 0x0012, 0x0007,
-- 0x0014, 0x0013, 0x0021, 0x002f, 0x001b, 0x0016, 0x0009, 0x0003,
-- 0x001f, 0x0016, 0x0029, 0x001a, 0x0015, 0x0014, 0x0005, 0x0003,
-- 0x000e, 0x000d, 0x000a, 0x000b, 0x0010, 0x0006, 0x0005, 0x0001,
-- 0x0009, 0x0008, 0x0007, 0x0008, 0x0004, 0x0004, 0x0002, 0x0000,
--};
--
--static const uint8_t mpa_huffbits_10[64] = {
--  1,  3,  6,  8,  9,  9,  9, 10,
--  3,  4,  6,  7,  8,  9,  8,  8,
--  6,  6,  7,  8,  9, 10,  9,  9,
--  7,  7,  8,  9, 10, 10,  9, 10,
--  8,  8,  9, 10, 10, 10, 10, 10,
--  9,  9, 10, 10, 11, 11, 10, 11,
--  8,  8,  9, 10, 10, 10, 11, 11,
--  9,  8,  9, 10, 10, 11, 11, 11,
--};
--
--static const uint16_t mpa_huffcodes_11[64] = {
-- 0x0003, 0x0004, 0x000a, 0x0018, 0x0022, 0x0021, 0x0015, 0x000f,
-- 0x0005, 0x0003, 0x0004, 0x000a, 0x0020, 0x0011, 0x000b, 0x000a,
-- 0x000b, 0x0007, 0x000d, 0x0012, 0x001e, 0x001f, 0x0014, 0x0005,
-- 0x0019, 0x000b, 0x0013, 0x003b, 0x001b, 0x0012, 0x000c, 0x0005,
-- 0x0023, 0x0021, 0x001f, 0x003a, 0x001e, 0x0010, 0x0007, 0x0005,
-- 0x001c, 0x001a, 0x0020, 0x0013, 0x0011, 0x000f, 0x0008, 0x000e,
-- 0x000e, 0x000c, 0x0009, 0x000d, 0x000e, 0x0009, 0x0004, 0x0001,
-- 0x000b, 0x0004, 0x0006, 0x0006, 0x0006, 0x0003, 0x0002, 0x0000,
--};
--
--static const uint8_t mpa_huffbits_11[64] = {
--  2,  3,  5,  7,  8,  9,  8,  9,
--  3,  3,  4,  6,  8,  8,  7,  8,
--  5,  5,  6,  7,  8,  9,  8,  8,
--  7,  6,  7,  9,  8, 10,  8,  9,
--  8,  8,  8,  9,  9, 10,  9, 10,
--  8,  8,  9, 10, 10, 11, 10, 11,
--  8,  7,  7,  8,  9, 10, 10, 10,
--  8,  7,  8,  9, 10, 10, 10, 10,
--};
--
--static const uint16_t mpa_huffcodes_12[64] = {
-- 0x0009, 0x0006, 0x0010, 0x0021, 0x0029, 0x0027, 0x0026, 0x001a,
-- 0x0007, 0x0005, 0x0006, 0x0009, 0x0017, 0x0010, 0x001a, 0x000b,
-- 0x0011, 0x0007, 0x000b, 0x000e, 0x0015, 0x001e, 0x000a, 0x0007,
-- 0x0011, 0x000a, 0x000f, 0x000c, 0x0012, 0x001c, 0x000e, 0x0005,
-- 0x0020, 0x000d, 0x0016, 0x0013, 0x0012, 0x0010, 0x0009, 0x0005,
-- 0x0028, 0x0011, 0x001f, 0x001d, 0x0011, 0x000d, 0x0004, 0x0002,
-- 0x001b, 0x000c, 0x000b, 0x000f, 0x000a, 0x0007, 0x0004, 0x0001,
-- 0x001b, 0x000c, 0x0008, 0x000c, 0x0006, 0x0003, 0x0001, 0x0000,
--};
--
--static const uint8_t mpa_huffbits_12[64] = {
--  4,  3,  5,  7,  8,  9,  9,  9,
--  3,  3,  4,  5,  7,  7,  8,  8,
--  5,  4,  5,  6,  7,  8,  7,  8,
--  6,  5,  6,  6,  7,  8,  8,  8,
--  7,  6,  7,  7,  8,  8,  8,  9,
--  8,  7,  8,  8,  8,  9,  8,  9,
--  8,  7,  7,  8,  8,  9,  9, 10,
--  9,  8,  8,  9,  9,  9,  9, 10,
--};
--
--static const uint16_t mpa_huffcodes_13[256] = {
-- 0x0001, 0x0005, 0x000e, 0x0015, 0x0022, 0x0033, 0x002e, 0x0047,
-- 0x002a, 0x0034, 0x0044, 0x0034, 0x0043, 0x002c, 0x002b, 0x0013,
-- 0x0003, 0x0004, 0x000c, 0x0013, 0x001f, 0x001a, 0x002c, 0x0021,
-- 0x001f, 0x0018, 0x0020, 0x0018, 0x001f, 0x0023, 0x0016, 0x000e,
-- 0x000f, 0x000d, 0x0017, 0x0024, 0x003b, 0x0031, 0x004d, 0x0041,
-- 0x001d, 0x0028, 0x001e, 0x0028, 0x001b, 0x0021, 0x002a, 0x0010,
-- 0x0016, 0x0014, 0x0025, 0x003d, 0x0038, 0x004f, 0x0049, 0x0040,
-- 0x002b, 0x004c, 0x0038, 0x0025, 0x001a, 0x001f, 0x0019, 0x000e,
-- 0x0023, 0x0010, 0x003c, 0x0039, 0x0061, 0x004b, 0x0072, 0x005b,
-- 0x0036, 0x0049, 0x0037, 0x0029, 0x0030, 0x0035, 0x0017, 0x0018,
-- 0x003a, 0x001b, 0x0032, 0x0060, 0x004c, 0x0046, 0x005d, 0x0054,
-- 0x004d, 0x003a, 0x004f, 0x001d, 0x004a, 0x0031, 0x0029, 0x0011,
-- 0x002f, 0x002d, 0x004e, 0x004a, 0x0073, 0x005e, 0x005a, 0x004f,
-- 0x0045, 0x0053, 0x0047, 0x0032, 0x003b, 0x0026, 0x0024, 0x000f,
-- 0x0048, 0x0022, 0x0038, 0x005f, 0x005c, 0x0055, 0x005b, 0x005a,
-- 0x0056, 0x0049, 0x004d, 0x0041, 0x0033, 0x002c, 0x002b, 0x002a,
-- 0x002b, 0x0014, 0x001e, 0x002c, 0x0037, 0x004e, 0x0048, 0x0057,
-- 0x004e, 0x003d, 0x002e, 0x0036, 0x0025, 0x001e, 0x0014, 0x0010,
-- 0x0035, 0x0019, 0x0029, 0x0025, 0x002c, 0x003b, 0x0036, 0x0051,
-- 0x0042, 0x004c, 0x0039, 0x0036, 0x0025, 0x0012, 0x0027, 0x000b,
-- 0x0023, 0x0021, 0x001f, 0x0039, 0x002a, 0x0052, 0x0048, 0x0050,
-- 0x002f, 0x003a, 0x0037, 0x0015, 0x0016, 0x001a, 0x0026, 0x0016,
-- 0x0035, 0x0019, 0x0017, 0x0026, 0x0046, 0x003c, 0x0033, 0x0024,
-- 0x0037, 0x001a, 0x0022, 0x0017, 0x001b, 0x000e, 0x0009, 0x0007,
-- 0x0022, 0x0020, 0x001c, 0x0027, 0x0031, 0x004b, 0x001e, 0x0034,
-- 0x0030, 0x0028, 0x0034, 0x001c, 0x0012, 0x0011, 0x0009, 0x0005,
-- 0x002d, 0x0015, 0x0022, 0x0040, 0x0038, 0x0032, 0x0031, 0x002d,
-- 0x001f, 0x0013, 0x000c, 0x000f, 0x000a, 0x0007, 0x0006, 0x0003,
-- 0x0030, 0x0017, 0x0014, 0x0027, 0x0024, 0x0023, 0x0035, 0x0015,
-- 0x0010, 0x0017, 0x000d, 0x000a, 0x0006, 0x0001, 0x0004, 0x0002,
-- 0x0010, 0x000f, 0x0011, 0x001b, 0x0019, 0x0014, 0x001d, 0x000b,
-- 0x0011, 0x000c, 0x0010, 0x0008, 0x0001, 0x0001, 0x0000, 0x0001,
--};
--
--static const uint8_t mpa_huffbits_13[256] = {
--  1,  4,  6,  7,  8,  9,  9, 10,
--  9, 10, 11, 11, 12, 12, 13, 13,
--  3,  4,  6,  7,  8,  8,  9,  9,
--  9,  9, 10, 10, 11, 12, 12, 12,
--  6,  6,  7,  8,  9,  9, 10, 10,
--  9, 10, 10, 11, 11, 12, 13, 13,
--  7,  7,  8,  9,  9, 10, 10, 10,
-- 10, 11, 11, 11, 11, 12, 13, 13,
--  8,  7,  9,  9, 10, 10, 11, 11,
-- 10, 11, 11, 12, 12, 13, 13, 14,
--  9,  8,  9, 10, 10, 10, 11, 11,
-- 11, 11, 12, 11, 13, 13, 14, 14,
--  9,  9, 10, 10, 11, 11, 11, 11,
-- 11, 12, 12, 12, 13, 13, 14, 14,
-- 10,  9, 10, 11, 11, 11, 12, 12,
-- 12, 12, 13, 13, 13, 14, 16, 16,
--  9,  8,  9, 10, 10, 11, 11, 12,
-- 12, 12, 12, 13, 13, 14, 15, 15,
-- 10,  9, 10, 10, 11, 11, 11, 13,
-- 12, 13, 13, 14, 14, 14, 16, 15,
-- 10, 10, 10, 11, 11, 12, 12, 13,
-- 12, 13, 14, 13, 14, 15, 16, 17,
-- 11, 10, 10, 11, 12, 12, 12, 12,
-- 13, 13, 13, 14, 15, 15, 15, 16,
-- 11, 11, 11, 12, 12, 13, 12, 13,
-- 14, 14, 15, 15, 15, 16, 16, 16,
-- 12, 11, 12, 13, 13, 13, 14, 14,
-- 14, 14, 14, 15, 16, 15, 16, 16,
-- 13, 12, 12, 13, 13, 13, 15, 14,
-- 14, 17, 15, 15, 15, 17, 16, 16,
-- 12, 12, 13, 14, 14, 14, 15, 14,
-- 15, 15, 16, 16, 19, 18, 19, 16,
--};
--
--static const uint16_t mpa_huffcodes_15[256] = {
-- 0x0007, 0x000c, 0x0012, 0x0035, 0x002f, 0x004c, 0x007c, 0x006c,
-- 0x0059, 0x007b, 0x006c, 0x0077, 0x006b, 0x0051, 0x007a, 0x003f,
-- 0x000d, 0x0005, 0x0010, 0x001b, 0x002e, 0x0024, 0x003d, 0x0033,
-- 0x002a, 0x0046, 0x0034, 0x0053, 0x0041, 0x0029, 0x003b, 0x0024,
-- 0x0013, 0x0011, 0x000f, 0x0018, 0x0029, 0x0022, 0x003b, 0x0030,
-- 0x0028, 0x0040, 0x0032, 0x004e, 0x003e, 0x0050, 0x0038, 0x0021,
-- 0x001d, 0x001c, 0x0019, 0x002b, 0x0027, 0x003f, 0x0037, 0x005d,
-- 0x004c, 0x003b, 0x005d, 0x0048, 0x0036, 0x004b, 0x0032, 0x001d,
-- 0x0034, 0x0016, 0x002a, 0x0028, 0x0043, 0x0039, 0x005f, 0x004f,
-- 0x0048, 0x0039, 0x0059, 0x0045, 0x0031, 0x0042, 0x002e, 0x001b,
-- 0x004d, 0x0025, 0x0023, 0x0042, 0x003a, 0x0034, 0x005b, 0x004a,
-- 0x003e, 0x0030, 0x004f, 0x003f, 0x005a, 0x003e, 0x0028, 0x0026,
-- 0x007d, 0x0020, 0x003c, 0x0038, 0x0032, 0x005c, 0x004e, 0x0041,
-- 0x0037, 0x0057, 0x0047, 0x0033, 0x0049, 0x0033, 0x0046, 0x001e,
-- 0x006d, 0x0035, 0x0031, 0x005e, 0x0058, 0x004b, 0x0042, 0x007a,
-- 0x005b, 0x0049, 0x0038, 0x002a, 0x0040, 0x002c, 0x0015, 0x0019,
-- 0x005a, 0x002b, 0x0029, 0x004d, 0x0049, 0x003f, 0x0038, 0x005c,
-- 0x004d, 0x0042, 0x002f, 0x0043, 0x0030, 0x0035, 0x0024, 0x0014,
-- 0x0047, 0x0022, 0x0043, 0x003c, 0x003a, 0x0031, 0x0058, 0x004c,
-- 0x0043, 0x006a, 0x0047, 0x0036, 0x0026, 0x0027, 0x0017, 0x000f,
-- 0x006d, 0x0035, 0x0033, 0x002f, 0x005a, 0x0052, 0x003a, 0x0039,
-- 0x0030, 0x0048, 0x0039, 0x0029, 0x0017, 0x001b, 0x003e, 0x0009,
-- 0x0056, 0x002a, 0x0028, 0x0025, 0x0046, 0x0040, 0x0034, 0x002b,
-- 0x0046, 0x0037, 0x002a, 0x0019, 0x001d, 0x0012, 0x000b, 0x000b,
-- 0x0076, 0x0044, 0x001e, 0x0037, 0x0032, 0x002e, 0x004a, 0x0041,
-- 0x0031, 0x0027, 0x0018, 0x0010, 0x0016, 0x000d, 0x000e, 0x0007,
-- 0x005b, 0x002c, 0x0027, 0x0026, 0x0022, 0x003f, 0x0034, 0x002d,
-- 0x001f, 0x0034, 0x001c, 0x0013, 0x000e, 0x0008, 0x0009, 0x0003,
-- 0x007b, 0x003c, 0x003a, 0x0035, 0x002f, 0x002b, 0x0020, 0x0016,
-- 0x0025, 0x0018, 0x0011, 0x000c, 0x000f, 0x000a, 0x0002, 0x0001,
-- 0x0047, 0x0025, 0x0022, 0x001e, 0x001c, 0x0014, 0x0011, 0x001a,
-- 0x0015, 0x0010, 0x000a, 0x0006, 0x0008, 0x0006, 0x0002, 0x0000,
--};
--
--static const uint8_t mpa_huffbits_15[256] = {
--  3,  4,  5,  7,  7,  8,  9,  9,
--  9, 10, 10, 11, 11, 11, 12, 13,
--  4,  3,  5,  6,  7,  7,  8,  8,
--  8,  9,  9, 10, 10, 10, 11, 11,
--  5,  5,  5,  6,  7,  7,  8,  8,
--  8,  9,  9, 10, 10, 11, 11, 11,
--  6,  6,  6,  7,  7,  8,  8,  9,
--  9,  9, 10, 10, 10, 11, 11, 11,
--  7,  6,  7,  7,  8,  8,  9,  9,
--  9,  9, 10, 10, 10, 11, 11, 11,
--  8,  7,  7,  8,  8,  8,  9,  9,
--  9,  9, 10, 10, 11, 11, 11, 12,
--  9,  7,  8,  8,  8,  9,  9,  9,
--  9, 10, 10, 10, 11, 11, 12, 12,
--  9,  8,  8,  9,  9,  9,  9, 10,
-- 10, 10, 10, 10, 11, 11, 11, 12,
--  9,  8,  8,  9,  9,  9,  9, 10,
-- 10, 10, 10, 11, 11, 12, 12, 12,
--  9,  8,  9,  9,  9,  9, 10, 10,
-- 10, 11, 11, 11, 11, 12, 12, 12,
-- 10,  9,  9,  9, 10, 10, 10, 10,
-- 10, 11, 11, 11, 11, 12, 13, 12,
-- 10,  9,  9,  9, 10, 10, 10, 10,
-- 11, 11, 11, 11, 12, 12, 12, 13,
-- 11, 10,  9, 10, 10, 10, 11, 11,
-- 11, 11, 11, 11, 12, 12, 13, 13,
-- 11, 10, 10, 10, 10, 11, 11, 11,
-- 11, 12, 12, 12, 12, 12, 13, 13,
-- 12, 11, 11, 11, 11, 11, 11, 11,
-- 12, 12, 12, 12, 13, 13, 12, 13,
-- 12, 11, 11, 11, 11, 11, 11, 12,
-- 12, 12, 12, 12, 13, 13, 13, 13,
--};
--
--static const uint16_t mpa_huffcodes_16[256] = {
-- 0x0001, 0x0005, 0x000e, 0x002c, 0x004a, 0x003f, 0x006e, 0x005d,
-- 0x00ac, 0x0095, 0x008a, 0x00f2, 0x00e1, 0x00c3, 0x0178, 0x0011,
-- 0x0003, 0x0004, 0x000c, 0x0014, 0x0023, 0x003e, 0x0035, 0x002f,
-- 0x0053, 0x004b, 0x0044, 0x0077, 0x00c9, 0x006b, 0x00cf, 0x0009,
-- 0x000f, 0x000d, 0x0017, 0x0026, 0x0043, 0x003a, 0x0067, 0x005a,
-- 0x00a1, 0x0048, 0x007f, 0x0075, 0x006e, 0x00d1, 0x00ce, 0x0010,
-- 0x002d, 0x0015, 0x0027, 0x0045, 0x0040, 0x0072, 0x0063, 0x0057,
-- 0x009e, 0x008c, 0x00fc, 0x00d4, 0x00c7, 0x0183, 0x016d, 0x001a,
-- 0x004b, 0x0024, 0x0044, 0x0041, 0x0073, 0x0065, 0x00b3, 0x00a4,
-- 0x009b, 0x0108, 0x00f6, 0x00e2, 0x018b, 0x017e, 0x016a, 0x0009,
-- 0x0042, 0x001e, 0x003b, 0x0038, 0x0066, 0x00b9, 0x00ad, 0x0109,
-- 0x008e, 0x00fd, 0x00e8, 0x0190, 0x0184, 0x017a, 0x01bd, 0x0010,
-- 0x006f, 0x0036, 0x0034, 0x0064, 0x00b8, 0x00b2, 0x00a0, 0x0085,
-- 0x0101, 0x00f4, 0x00e4, 0x00d9, 0x0181, 0x016e, 0x02cb, 0x000a,
-- 0x0062, 0x0030, 0x005b, 0x0058, 0x00a5, 0x009d, 0x0094, 0x0105,
-- 0x00f8, 0x0197, 0x018d, 0x0174, 0x017c, 0x0379, 0x0374, 0x0008,
-- 0x0055, 0x0054, 0x0051, 0x009f, 0x009c, 0x008f, 0x0104, 0x00f9,
-- 0x01ab, 0x0191, 0x0188, 0x017f, 0x02d7, 0x02c9, 0x02c4, 0x0007,
-- 0x009a, 0x004c, 0x0049, 0x008d, 0x0083, 0x0100, 0x00f5, 0x01aa,
-- 0x0196, 0x018a, 0x0180, 0x02df, 0x0167, 0x02c6, 0x0160, 0x000b,
-- 0x008b, 0x0081, 0x0043, 0x007d, 0x00f7, 0x00e9, 0x00e5, 0x00db,
-- 0x0189, 0x02e7, 0x02e1, 0x02d0, 0x0375, 0x0372, 0x01b7, 0x0004,
-- 0x00f3, 0x0078, 0x0076, 0x0073, 0x00e3, 0x00df, 0x018c, 0x02ea,
-- 0x02e6, 0x02e0, 0x02d1, 0x02c8, 0x02c2, 0x00df, 0x01b4, 0x0006,
-- 0x00ca, 0x00e0, 0x00de, 0x00da, 0x00d8, 0x0185, 0x0182, 0x017d,
-- 0x016c, 0x0378, 0x01bb, 0x02c3, 0x01b8, 0x01b5, 0x06c0, 0x0004,
-- 0x02eb, 0x00d3, 0x00d2, 0x00d0, 0x0172, 0x017b, 0x02de, 0x02d3,
-- 0x02ca, 0x06c7, 0x0373, 0x036d, 0x036c, 0x0d83, 0x0361, 0x0002,
-- 0x0179, 0x0171, 0x0066, 0x00bb, 0x02d6, 0x02d2, 0x0166, 0x02c7,
-- 0x02c5, 0x0362, 0x06c6, 0x0367, 0x0d82, 0x0366, 0x01b2, 0x0000,
-- 0x000c, 0x000a, 0x0007, 0x000b, 0x000a, 0x0011, 0x000b, 0x0009,
-- 0x000d, 0x000c, 0x000a, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003,
--};
--
--static const uint8_t mpa_huffbits_16[256] = {
--  1,  4,  6,  8,  9,  9, 10, 10,
-- 11, 11, 11, 12, 12, 12, 13,  9,
--  3,  4,  6,  7,  8,  9,  9,  9,
-- 10, 10, 10, 11, 12, 11, 12,  8,
--  6,  6,  7,  8,  9,  9, 10, 10,
-- 11, 10, 11, 11, 11, 12, 12,  9,
--  8,  7,  8,  9,  9, 10, 10, 10,
-- 11, 11, 12, 12, 12, 13, 13, 10,
--  9,  8,  9,  9, 10, 10, 11, 11,
-- 11, 12, 12, 12, 13, 13, 13,  9,
--  9,  8,  9,  9, 10, 11, 11, 12,
-- 11, 12, 12, 13, 13, 13, 14, 10,
-- 10,  9,  9, 10, 11, 11, 11, 11,
-- 12, 12, 12, 12, 13, 13, 14, 10,
-- 10,  9, 10, 10, 11, 11, 11, 12,
-- 12, 13, 13, 13, 13, 15, 15, 10,
-- 10, 10, 10, 11, 11, 11, 12, 12,
-- 13, 13, 13, 13, 14, 14, 14, 10,
-- 11, 10, 10, 11, 11, 12, 12, 13,
-- 13, 13, 13, 14, 13, 14, 13, 11,
-- 11, 11, 10, 11, 12, 12, 12, 12,
-- 13, 14, 14, 14, 15, 15, 14, 10,
-- 12, 11, 11, 11, 12, 12, 13, 14,
-- 14, 14, 14, 14, 14, 13, 14, 11,
-- 12, 12, 12, 12, 12, 13, 13, 13,
-- 13, 15, 14, 14, 14, 14, 16, 11,
-- 14, 12, 12, 12, 13, 13, 14, 14,
-- 14, 16, 15, 15, 15, 17, 15, 11,
-- 13, 13, 11, 12, 14, 14, 13, 14,
-- 14, 15, 16, 15, 17, 15, 14, 11,
--  9,  8,  8,  9,  9, 10, 10, 10,
-- 11, 11, 11, 11, 11, 11, 11,  8,
--};
--
--static const uint16_t mpa_huffcodes_24[256] = {
-- 0x000f, 0x000d, 0x002e, 0x0050, 0x0092, 0x0106, 0x00f8, 0x01b2,
-- 0x01aa, 0x029d, 0x028d, 0x0289, 0x026d, 0x0205, 0x0408, 0x0058,
-- 0x000e, 0x000c, 0x0015, 0x0026, 0x0047, 0x0082, 0x007a, 0x00d8,
-- 0x00d1, 0x00c6, 0x0147, 0x0159, 0x013f, 0x0129, 0x0117, 0x002a,
-- 0x002f, 0x0016, 0x0029, 0x004a, 0x0044, 0x0080, 0x0078, 0x00dd,
-- 0x00cf, 0x00c2, 0x00b6, 0x0154, 0x013b, 0x0127, 0x021d, 0x0012,
-- 0x0051, 0x0027, 0x004b, 0x0046, 0x0086, 0x007d, 0x0074, 0x00dc,
-- 0x00cc, 0x00be, 0x00b2, 0x0145, 0x0137, 0x0125, 0x010f, 0x0010,
-- 0x0093, 0x0048, 0x0045, 0x0087, 0x007f, 0x0076, 0x0070, 0x00d2,
-- 0x00c8, 0x00bc, 0x0160, 0x0143, 0x0132, 0x011d, 0x021c, 0x000e,
-- 0x0107, 0x0042, 0x0081, 0x007e, 0x0077, 0x0072, 0x00d6, 0x00ca,
-- 0x00c0, 0x00b4, 0x0155, 0x013d, 0x012d, 0x0119, 0x0106, 0x000c,
-- 0x00f9, 0x007b, 0x0079, 0x0075, 0x0071, 0x00d7, 0x00ce, 0x00c3,
-- 0x00b9, 0x015b, 0x014a, 0x0134, 0x0123, 0x0110, 0x0208, 0x000a,
-- 0x01b3, 0x0073, 0x006f, 0x006d, 0x00d3, 0x00cb, 0x00c4, 0x00bb,
-- 0x0161, 0x014c, 0x0139, 0x012a, 0x011b, 0x0213, 0x017d, 0x0011,
-- 0x01ab, 0x00d4, 0x00d0, 0x00cd, 0x00c9, 0x00c1, 0x00ba, 0x00b1,
-- 0x00a9, 0x0140, 0x012f, 0x011e, 0x010c, 0x0202, 0x0179, 0x0010,
-- 0x014f, 0x00c7, 0x00c5, 0x00bf, 0x00bd, 0x00b5, 0x00ae, 0x014d,
-- 0x0141, 0x0131, 0x0121, 0x0113, 0x0209, 0x017b, 0x0173, 0x000b,
-- 0x029c, 0x00b8, 0x00b7, 0x00b3, 0x00af, 0x0158, 0x014b, 0x013a,
-- 0x0130, 0x0122, 0x0115, 0x0212, 0x017f, 0x0175, 0x016e, 0x000a,
-- 0x028c, 0x015a, 0x00ab, 0x00a8, 0x00a4, 0x013e, 0x0135, 0x012b,
-- 0x011f, 0x0114, 0x0107, 0x0201, 0x0177, 0x0170, 0x016a, 0x0006,
-- 0x0288, 0x0142, 0x013c, 0x0138, 0x0133, 0x012e, 0x0124, 0x011c,
-- 0x010d, 0x0105, 0x0200, 0x0178, 0x0172, 0x016c, 0x0167, 0x0004,
-- 0x026c, 0x012c, 0x0128, 0x0126, 0x0120, 0x011a, 0x0111, 0x010a,
-- 0x0203, 0x017c, 0x0176, 0x0171, 0x016d, 0x0169, 0x0165, 0x0002,
-- 0x0409, 0x0118, 0x0116, 0x0112, 0x010b, 0x0108, 0x0103, 0x017e,
-- 0x017a, 0x0174, 0x016f, 0x016b, 0x0168, 0x0166, 0x0164, 0x0000,
-- 0x002b, 0x0014, 0x0013, 0x0011, 0x000f, 0x000d, 0x000b, 0x0009,
-- 0x0007, 0x0006, 0x0004, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003,
--};
--
--static const uint8_t mpa_huffbits_24[256] = {
--  4,  4,  6,  7,  8,  9,  9, 10,
-- 10, 11, 11, 11, 11, 11, 12,  9,
--  4,  4,  5,  6,  7,  8,  8,  9,
--  9,  9, 10, 10, 10, 10, 10,  8,
--  6,  5,  6,  7,  7,  8,  8,  9,
--  9,  9,  9, 10, 10, 10, 11,  7,
--  7,  6,  7,  7,  8,  8,  8,  9,
--  9,  9,  9, 10, 10, 10, 10,  7,
--  8,  7,  7,  8,  8,  8,  8,  9,
--  9,  9, 10, 10, 10, 10, 11,  7,
--  9,  7,  8,  8,  8,  8,  9,  9,
--  9,  9, 10, 10, 10, 10, 10,  7,
--  9,  8,  8,  8,  8,  9,  9,  9,
--  9, 10, 10, 10, 10, 10, 11,  7,
-- 10,  8,  8,  8,  9,  9,  9,  9,
-- 10, 10, 10, 10, 10, 11, 11,  8,
-- 10,  9,  9,  9,  9,  9,  9,  9,
--  9, 10, 10, 10, 10, 11, 11,  8,
-- 10,  9,  9,  9,  9,  9,  9, 10,
-- 10, 10, 10, 10, 11, 11, 11,  8,
-- 11,  9,  9,  9,  9, 10, 10, 10,
-- 10, 10, 10, 11, 11, 11, 11,  8,
-- 11, 10,  9,  9,  9, 10, 10, 10,
-- 10, 10, 10, 11, 11, 11, 11,  8,
-- 11, 10, 10, 10, 10, 10, 10, 10,
-- 10, 10, 11, 11, 11, 11, 11,  8,
-- 11, 10, 10, 10, 10, 10, 10, 10,
-- 11, 11, 11, 11, 11, 11, 11,  8,
-- 12, 10, 10, 10, 10, 10, 10, 11,
-- 11, 11, 11, 11, 11, 11, 11,  8,
--  8,  7,  7,  7,  7,  7,  7,  7,
--  7,  7,  7,  8,  8,  8,  8,  4,
--};
--
--static const HuffTable mpa_huff_tables[16] = {
--{ 1, NULL, NULL },
--{ 2, mpa_huffbits_1, mpa_huffcodes_1 },
--{ 3, mpa_huffbits_2, mpa_huffcodes_2 },
--{ 3, mpa_huffbits_3, mpa_huffcodes_3 },
--{ 4, mpa_huffbits_5, mpa_huffcodes_5 },
--{ 4, mpa_huffbits_6, mpa_huffcodes_6 },
--{ 6, mpa_huffbits_7, mpa_huffcodes_7 },
--{ 6, mpa_huffbits_8, mpa_huffcodes_8 },
--{ 6, mpa_huffbits_9, mpa_huffcodes_9 },
--{ 8, mpa_huffbits_10, mpa_huffcodes_10 },
--{ 8, mpa_huffbits_11, mpa_huffcodes_11 },
--{ 8, mpa_huffbits_12, mpa_huffcodes_12 },
--{ 16, mpa_huffbits_13, mpa_huffcodes_13 },
--{ 16, mpa_huffbits_15, mpa_huffcodes_15 },
--{ 16, mpa_huffbits_16, mpa_huffcodes_16 },
--{ 16, mpa_huffbits_24, mpa_huffcodes_24 },
--};
--
--static const uint8_t mpa_huff_data[32][2] = {
--{ 0, 0 },
--{ 1, 0 },
--{ 2, 0 },
--{ 3, 0 },
--{ 0, 0 },
--{ 4, 0 },
--{ 5, 0 },
--{ 6, 0 },
--{ 7, 0 },
--{ 8, 0 },
--{ 9, 0 },
--{ 10, 0 },
--{ 11, 0 },
--{ 12, 0 },
--{ 0, 0 },
--{ 13, 0 },
--{ 14, 1 },
--{ 14, 2 },
--{ 14, 3 },
--{ 14, 4 },
--{ 14, 6 },
--{ 14, 8 },
--{ 14, 10 },
--{ 14, 13 },
--{ 15, 4 },
--{ 15, 5 },
--{ 15, 6 },
--{ 15, 7 },
--{ 15, 8 },
--{ 15, 9 },
--{ 15, 11 },
--{ 15, 13 },
--};
--
--
--/* huffman tables for quadrules */
--static const uint8_t mpa_quad_codes[2][16] = {
--    {  1,  5,  4,  5,  6,  5,  4,  4, 7,  3,  6,  0,  7,  2,  3,  1, },
--    { 15, 14, 13, 12, 11, 10,  9,  8, 7,  6,  5,  4,  3,  2,  1,  0, },
--};
--
--static const uint8_t mpa_quad_bits[2][16] = {
--    { 1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6, },
--    { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, },
--};
--
--/* band size tables */
--static const uint8_t band_size_long[9][22] = {
--{ 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10,
--  12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158, }, /* 44100 */
--{ 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10,
--  12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192, }, /* 48000 */
--{ 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12,
--  16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26, }, /* 32000 */
--{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
--  20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 22050 */
--{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
--  18, 22, 26, 32, 38, 46, 52, 64, 70, 76, 36, }, /* 24000 */
--{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
--  20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 16000 */
--{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
--  20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 11025 */
--{ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
--  20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, }, /* 12000 */
--{ 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32,
--  40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2, }, /* 8000 */
--};
--
--static const uint8_t band_size_short[9][13] = {
--{ 4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56, }, /* 44100 */
--{ 4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66, }, /* 48000 */
--{ 4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12, }, /* 32000 */
--{ 4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18, }, /* 22050 */
--{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12, }, /* 24000 */
--{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, }, /* 16000 */
--{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, }, /* 11025 */
--{ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, }, /* 12000 */
--{ 8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26, }, /* 8000 */
--};
--
--static const uint8_t mpa_pretab[2][22] = {
--    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
--    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 },
--};
--
--/* table for alias reduction (XXX: store it as integer !) */
--static const float ci_table[8] = {
--    -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037,
--};
--
--#endif /* AVCODEC_MPEGAUDIODECTAB_H */
-diff --git a/media/ffvpx/libavcodec/mpegaudiodsp.h b/media/ffvpx/libavcodec/mpegaudiodsp.h
---- a/media/ffvpx/libavcodec/mpegaudiodsp.h
-+++ b/media/ffvpx/libavcodec/mpegaudiodsp.h
-@@ -17,16 +17,17 @@
-  */
- 
- #ifndef AVCODEC_MPEGAUDIODSP_H
- #define AVCODEC_MPEGAUDIODSP_H
- 
- #include <stddef.h>
- #include <stdint.h>
- 
-+#include "libavutil/attributes_internal.h"
- #include "libavutil/macros.h"
- 
- typedef struct MPADSPContext {
-     void (*apply_window_float)(float *synth_buf, float *window,
-                                int *dither_state, float *samples,
-                                ptrdiff_t incr);
-     void (*apply_window_fixed)(int32_t *synth_buf, int32_t *window,
-                                int *dither_state, int16_t *samples,
-@@ -35,16 +36,17 @@ typedef struct MPADSPContext {
-     void (*dct32_fixed)(int *dst, const int *src);
- 
-     void (*imdct36_blocks_float)(float *out, float *buf, float *in,
-                                  int count, int switch_point, int block_type);
-     void (*imdct36_blocks_fixed)(int *out, int *buf, int *in,
-                                  int count, int switch_point, int block_type);
- } MPADSPContext;
- 
-+FF_VISIBILITY_PUSH_HIDDEN
- void ff_mpadsp_init(MPADSPContext *s);
- 
- extern int32_t ff_mpa_synth_window_fixed[];
- extern float   ff_mpa_synth_window_float[];
- 
- extern const int32_t ff_mpa_enwindow[257];
- 
- void ff_mpa_synth_filter_fixed(MPADSPContext *s,
-@@ -83,10 +85,11 @@ void ff_imdct36_blocks_float(float *out,
- void ff_imdct36_blocks_fixed(int *out, int *buf, int *in,
-                              int count, int switch_point, int block_type);
- 
- /** For SSE implementation, MDCT_BUF_SIZE/2 should be 128-bit aligned */
- #define MDCT_BUF_SIZE FFALIGN(36, 2*4)
- 
- extern int ff_mdct_win_fixed[8][MDCT_BUF_SIZE];
- extern float ff_mdct_win_float[8][MDCT_BUF_SIZE];
-+FF_VISIBILITY_POP_HIDDEN
- 
- #endif /* AVCODEC_MPEGAUDIODSP_H */
-diff --git a/media/ffvpx/libavcodec/mpegvideodsp.h b/media/ffvpx/libavcodec/mpegvideodsp.h
-deleted file mode 100644
---- a/media/ffvpx/libavcodec/mpegvideodsp.h
-+++ /dev/null
-@@ -1,47 +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
-- */
--
--#ifndef AVCODEC_MPEGVIDEODSP_H
--#define AVCODEC_MPEGVIDEODSP_H
--
--#include <stdint.h>
--
--void ff_gmc_c(uint8_t *dst, uint8_t *src, int stride, int h, int ox, int oy,
--              int dxx, int dxy, int dyx, int dyy, int shift, int r,
--              int width, int height);
--
--typedef struct MpegVideoDSPContext {
--    /**
--     * translational global motion compensation.
--     */
--    void (*gmc1)(uint8_t *dst /* align 8 */, uint8_t *src /* align 1 */,
--                 int srcStride, int h, int x16, int y16, int rounder);
--    /**
--     * global motion compensation.
--     */
--    void (*gmc)(uint8_t *dst /* align 8 */, uint8_t *src /* align 1 */,
--                int stride, int h, int ox, int oy,
--                int dxx, int dxy, int dyx, int dyy,
--                int shift, int r, int width, int height);
--} MpegVideoDSPContext;
--
--void ff_mpegvideodsp_init(MpegVideoDSPContext *c);
--void ff_mpegvideodsp_init_ppc(MpegVideoDSPContext *c);
--void ff_mpegvideodsp_init_x86(MpegVideoDSPContext *c);
--
--#endif /* AVCODEC_MPEGVIDEODSP_H */
-diff --git a/media/ffvpx/libavcodec/options.c b/media/ffvpx/libavcodec/options.c
---- a/media/ffvpx/libavcodec/options.c
-+++ b/media/ffvpx/libavcodec/options.c
-@@ -22,16 +22,17 @@
- /**
-  * @file
-  * Options definition for AVCodecContext.
-  */
- 
- #include "config_components.h"
- 
- #include "avcodec.h"
-+#include "avcodec_internal.h"
- #include "codec_internal.h"
- #include "libavutil/avassert.h"
- #include "libavutil/internal.h"
- #include "libavutil/mem.h"
- #include "libavutil/opt.h"
- #include <string.h>
- 
- FF_DISABLE_DEPRECATION_WARNINGS
-@@ -119,21 +120,16 @@ static int init_context_defaults(AVCodec
-     s->execute             = avcodec_default_execute;
-     s->execute2            = avcodec_default_execute2;
-     s->sample_aspect_ratio = (AVRational){0,1};
-     s->ch_layout.order     = AV_CHANNEL_ORDER_UNSPEC;
-     s->pix_fmt             = AV_PIX_FMT_NONE;
-     s->sw_pix_fmt          = AV_PIX_FMT_NONE;
-     s->sample_fmt          = AV_SAMPLE_FMT_NONE;
- 
--#if FF_API_REORDERED_OPAQUE
--FF_DISABLE_DEPRECATION_WARNINGS
--    s->reordered_opaque    = AV_NOPTS_VALUE;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     if(codec && codec2->priv_data_size){
-         s->priv_data = av_mallocz(codec2->priv_data_size);
-         if (!s->priv_data)
-             return AVERROR(ENOMEM);
-         if(codec->priv_class){
-             *(const AVClass**)s->priv_data = codec->priv_class;
-             av_opt_set_defaults(s->priv_data);
-         }
-@@ -167,24 +163,27 @@ AVCodecContext *avcodec_alloc_context3(c
- 
- void avcodec_free_context(AVCodecContext **pavctx)
- {
-     AVCodecContext *avctx = *pavctx;
- 
-     if (!avctx)
-         return;
- 
--    avcodec_close(avctx);
-+    ff_codec_close(avctx);
- 
-     av_freep(&avctx->extradata);
-     av_freep(&avctx->subtitle_header);
-     av_freep(&avctx->intra_matrix);
-+    av_freep(&avctx->chroma_intra_matrix);
-     av_freep(&avctx->inter_matrix);
-     av_freep(&avctx->rc_override);
-     av_channel_layout_uninit(&avctx->ch_layout);
-+    av_frame_side_data_free(
-+        &avctx->decoded_side_data, &avctx->nb_decoded_side_data);
- 
-     av_freep(pavctx);
- }
- 
- const AVClass *avcodec_get_class(void)
- {
-     return &av_codec_context_class;
- }
-@@ -192,17 +191,17 @@ const AVClass *avcodec_get_class(void)
- #define SROFFSET(x) offsetof(AVSubtitleRect,x)
- 
- static const AVOption subtitle_rect_options[]={
- {"x", "", SROFFSET(x), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
- {"y", "", SROFFSET(y), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
- {"w", "", SROFFSET(w), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
- {"h", "", SROFFSET(h), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
- {"type", "", SROFFSET(type), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
--{"flags", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0, "flags"},
-+{"flags", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0, .unit = "flags"},
- {"forced", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0},
- {NULL},
- };
- 
- static const AVClass av_subtitle_rect_class = {
-     .class_name             = "AVSubtitleRect",
-     .item_name              = NULL,
-     .option                 = subtitle_rect_options,
-diff --git a/media/ffvpx/libavcodec/options_table.h b/media/ffvpx/libavcodec/options_table.h
---- a/media/ffvpx/libavcodec/options_table.h
-+++ b/media/ffvpx/libavcodec/options_table.h
-@@ -37,379 +37,384 @@
- //these names are too long to be readable
- #define V AV_OPT_FLAG_VIDEO_PARAM
- #define A AV_OPT_FLAG_AUDIO_PARAM
- #define S AV_OPT_FLAG_SUBTITLE_PARAM
- #define E AV_OPT_FLAG_ENCODING_PARAM
- #define D AV_OPT_FLAG_DECODING_PARAM
- #define CC AV_OPT_FLAG_CHILD_CONSTS
- 
-+#define AR AV_OPT_TYPE_FLAG_ARRAY
-+
- #define AV_CODEC_DEFAULT_BITRATE 200*1000
- 
- static const AVOption avcodec_options[] = {
- {"b", "set bitrate (in bits/s)", OFFSET(bit_rate), AV_OPT_TYPE_INT64, {.i64 = AV_CODEC_DEFAULT_BITRATE }, 0, INT64_MAX, A|V|E},
- {"ab", "set bitrate (in bits/s)", OFFSET(bit_rate), AV_OPT_TYPE_INT64, {.i64 = 128*1000 }, 0, INT_MAX, A|E},
- {"bt", "Set video bitrate tolerance (in bits/s). In 1-pass mode, bitrate tolerance specifies how far "
-        "ratecontrol is willing to deviate from the target average bitrate value. This is not related "
-        "to minimum/maximum bitrate. Lowering tolerance too much has an adverse effect on quality.",
-        OFFSET(bit_rate_tolerance), AV_OPT_TYPE_INT, {.i64 = AV_CODEC_DEFAULT_BITRATE*20 }, 0, INT_MAX, A|V|E},
--{"flags", NULL, OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT }, 0, UINT_MAX, V|A|S|E|D, "flags"},
--{"unaligned", "allow decoders to produce unaligned output", 0, AV_OPT_TYPE_CONST, { .i64 = AV_CODEC_FLAG_UNALIGNED }, INT_MIN, INT_MAX, V | D, "flags" },
--{"mv4", "use four motion vectors per macroblock (MPEG-4)", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_4MV }, INT_MIN, INT_MAX, V|E, "flags"},
--{"qpel", "use 1/4-pel motion compensation", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_QPEL }, INT_MIN, INT_MAX, V|E, "flags"},
--{"loop", "use loop filter", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_LOOP_FILTER }, INT_MIN, INT_MAX, V|E, "flags"},
--{"qscale", "use fixed qscale", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_QSCALE }, INT_MIN, INT_MAX, 0, "flags"},
-+{"flags", NULL, OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT }, 0, UINT_MAX, V|A|S|E|D, .unit = "flags"},
-+{"unaligned", "allow decoders to produce unaligned output", 0, AV_OPT_TYPE_CONST, { .i64 = AV_CODEC_FLAG_UNALIGNED }, INT_MIN, INT_MAX, V | D, .unit = "flags" },
-+{"mv4", "use four motion vectors per macroblock (MPEG-4)", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_4MV }, INT_MIN, INT_MAX, V|E, .unit = "flags"},
-+{"qpel", "use 1/4-pel motion compensation", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_QPEL }, INT_MIN, INT_MAX, V|E, .unit = "flags"},
-+{"loop", "use loop filter", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_LOOP_FILTER }, INT_MIN, INT_MAX, V|E, .unit = "flags"},
-+{"qscale", "use fixed qscale", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_QSCALE }, INT_MIN, INT_MAX, 0, .unit = "flags"},
- {"recon_frame", "export reconstructed frames", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_RECON_FRAME}, .unit = "flags"},
- {"copy_opaque", "propagate opaque values", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_COPY_OPAQUE}, .unit = "flags"},
- {"frame_duration", "use frame durations", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_FRAME_DURATION}, .unit = "flags"},
--{"pass1", "use internal 2-pass ratecontrol in first  pass mode", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_PASS1 }, INT_MIN, INT_MAX, 0, "flags"},
--{"pass2", "use internal 2-pass ratecontrol in second pass mode", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_PASS2 }, INT_MIN, INT_MAX, 0, "flags"},
--{"gray", "only decode/encode grayscale", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_GRAY }, INT_MIN, INT_MAX, V|E|D, "flags"},
--{"psnr", "error[?] variables will be set during encoding", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_PSNR }, INT_MIN, INT_MAX, V|E, "flags"},
--{"ildct", "use interlaced DCT", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_INTERLACED_DCT }, INT_MIN, INT_MAX, V|E, "flags"},
--{"low_delay", "force low delay", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_LOW_DELAY }, INT_MIN, INT_MAX, V|D|E, "flags"},
--{"global_header", "place global headers in extradata instead of every keyframe", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_GLOBAL_HEADER }, INT_MIN, INT_MAX, V|A|E, "flags"},
--{"bitexact", "use only bitexact functions (except (I)DCT)", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_BITEXACT }, INT_MIN, INT_MAX, A|V|S|D|E, "flags"},
--{"aic", "H.263 advanced intra coding / MPEG-4 AC prediction", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_AC_PRED }, INT_MIN, INT_MAX, V|E, "flags"},
--{"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"},
-+{"pass1", "use internal 2-pass ratecontrol in first  pass mode", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_PASS1 }, INT_MIN, INT_MAX, 0, .unit = "flags"},
-+{"pass2", "use internal 2-pass ratecontrol in second pass mode", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_PASS2 }, INT_MIN, INT_MAX, 0, .unit = "flags"},
-+{"gray", "only decode/encode grayscale", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_GRAY }, INT_MIN, INT_MAX, V|E|D, .unit = "flags"},
-+{"psnr", "error[?] variables will be set during encoding", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_PSNR }, INT_MIN, INT_MAX, V|E, .unit = "flags"},
-+{"ildct", "use interlaced DCT", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_INTERLACED_DCT }, INT_MIN, INT_MAX, V|E, .unit = "flags"},
-+{"low_delay", "force low delay", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_LOW_DELAY }, INT_MIN, INT_MAX, V|D|E, .unit = "flags"},
-+{"global_header", "place global headers in extradata instead of every keyframe", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_GLOBAL_HEADER }, INT_MIN, INT_MAX, V|A|E, .unit = "flags"},
-+{"bitexact", "use only bitexact functions (except (I)DCT)", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_BITEXACT }, INT_MIN, INT_MAX, A|V|S|D|E, .unit = "flags"},
-+{"aic", "H.263 advanced intra coding / MPEG-4 AC prediction", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_AC_PRED }, INT_MIN, INT_MAX, V|E, .unit = "flags"},
-+{"ilme", "interlaced motion estimation", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_INTERLACED_ME }, INT_MIN, INT_MAX, V|E, .unit = "flags"},
-+{"cgop", "closed GOP", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_CLOSED_GOP }, INT_MIN, INT_MAX, V|E, .unit = "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, .unit = "flags"},
- #if FF_API_DROPCHANGED
--{"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 | AV_OPT_FLAG_DEPRECATED, "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 | AV_OPT_FLAG_DEPRECATED, .unit = "flags"},
- #endif
--{"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"},
--{"local_header", "place global headers at every keyframe instead of in extradata", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_LOCAL_HEADER }, INT_MIN, INT_MAX, V|E, "flags2"},
--{"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, 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"},
--{"icc_profiles", "generate/parse embedded ICC profiles from/to colorimetry tags", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_ICC_PROFILES}, 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"},
--{"venc_params", "export video encoding parameters through frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS}, INT_MIN, INT_MAX, V|D, "export_side_data"},
--{"film_grain", "export film grain parameters through frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_EXPORT_DATA_FILM_GRAIN}, INT_MIN, INT_MAX, V|D, "export_side_data"},
-+{"flags2", NULL, OFFSET(flags2), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT}, 0, UINT_MAX, V|A|E|D|S, .unit = "flags2"},
-+{"fast", "allow non-spec-compliant speedup tricks", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_FAST }, INT_MIN, INT_MAX, V|E, .unit = "flags2"},
-+{"noout", "skip bitstream encoding", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_NO_OUTPUT }, INT_MIN, INT_MAX, V|E, .unit = "flags2"},
-+{"ignorecrop", "ignore cropping information from sps", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_IGNORE_CROP }, INT_MIN, INT_MAX, V|D, .unit = "flags2"},
-+{"local_header", "place global headers at every keyframe instead of in extradata", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_LOCAL_HEADER }, INT_MIN, INT_MAX, V|E, .unit = "flags2"},
-+{"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, .unit = "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, .unit = "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, .unit = "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, .unit = "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, .unit = "flags2"},
-+{"icc_profiles", "generate/parse embedded ICC profiles from/to colorimetry tags", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_ICC_PROFILES}, INT_MIN, INT_MAX, S|D, .unit = "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, .unit = "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, .unit = "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, .unit = "export_side_data"},
-+{"venc_params", "export video encoding parameters through frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS}, INT_MIN, INT_MAX, V|D, .unit = "export_side_data"},
-+{"film_grain", "export film grain parameters through frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_EXPORT_DATA_FILM_GRAIN}, INT_MIN, INT_MAX, V|D, .unit = "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},
--#if FF_API_OLD_CHANNEL_LAYOUT
--{"ac", "set number of audio channels", OFFSET(channels), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, A|D|E},
--#endif
- {"cutoff", "set cutoff bandwidth", OFFSET(cutoff), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, A|E},
- {"frame_size", NULL, OFFSET(frame_size), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, A|E},
- {"frame_number", NULL, OFFSET(frame_num), AV_OPT_TYPE_INT64, {.i64 = DEFAULT }, INT_MIN, INT_MAX},
- {"delay", NULL, OFFSET(delay), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX},
- {"qcomp", "video quantizer scale compression (VBR). Constant of ratecontrol equation. "
-           "Recommended range for default rc_eq: 0.0-1.0",
-           OFFSET(qcompress), AV_OPT_TYPE_FLOAT, {.dbl = 0.5 }, -FLT_MAX, FLT_MAX, V|E},
- {"qblur", "video quantizer scale blur (VBR)", OFFSET(qblur), AV_OPT_TYPE_FLOAT, {.dbl = 0.5 }, -1, FLT_MAX, V|E},
- {"qmin", "minimum video quantizer scale (VBR)", OFFSET(qmin), AV_OPT_TYPE_INT, {.i64 = 2 }, -1, 69, V|E},
- {"qmax", "maximum video quantizer scale (VBR)", OFFSET(qmax), AV_OPT_TYPE_INT, {.i64 = 31 }, -1, 1024, V|E},
- {"qdiff", "maximum difference between the quantizer scales (VBR)", OFFSET(max_qdiff), AV_OPT_TYPE_INT, {.i64 = 3 }, INT_MIN, INT_MAX, V|E},
- {"bf", "set maximum number of B-frames between non-B-frames", OFFSET(max_b_frames), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, -1, INT_MAX, V|E},
- {"b_qfactor", "QP factor between P- and B-frames", OFFSET(b_quant_factor), AV_OPT_TYPE_FLOAT, {.dbl = 1.25 }, -FLT_MAX, FLT_MAX, V|E},
- {"codec_tag", NULL, OFFSET(codec_tag), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX},
--{"bug", "work around not autodetected encoder bugs", OFFSET(workaround_bugs), AV_OPT_TYPE_FLAGS, {.i64 = FF_BUG_AUTODETECT }, INT_MIN, INT_MAX, V|D, "bug"},
--{"autodetect", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_AUTODETECT }, INT_MIN, INT_MAX, V|D, "bug"},
--{"xvid_ilace", "Xvid interlacing bug (autodetected if FOURCC == XVIX)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_XVID_ILACE }, INT_MIN, INT_MAX, V|D, "bug"},
--{"ump4", "(autodetected if FOURCC == UMP4)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_UMP4 }, INT_MIN, INT_MAX, V|D, "bug"},
--{"no_padding", "padding bug (autodetected)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_NO_PADDING }, INT_MIN, INT_MAX, V|D, "bug"},
--{"amv", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_AMV }, INT_MIN, INT_MAX, V|D, "bug"},
--{"qpel_chroma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_QPEL_CHROMA }, INT_MIN, INT_MAX, V|D, "bug"},
--{"std_qpel", "old standard qpel (autodetected per FOURCC/version)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_STD_QPEL }, INT_MIN, INT_MAX, V|D, "bug"},
--{"qpel_chroma2", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_QPEL_CHROMA2 }, INT_MIN, INT_MAX, V|D, "bug"},
--{"direct_blocksize", "direct-qpel-blocksize bug (autodetected per FOURCC/version)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_DIRECT_BLOCKSIZE }, INT_MIN, INT_MAX, V|D, "bug"},
--{"edge", "edge padding bug (autodetected per FOURCC/version)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_EDGE }, INT_MIN, INT_MAX, V|D, "bug"},
--{"hpel_chroma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_HPEL_CHROMA }, INT_MIN, INT_MAX, V|D, "bug"},
--{"dc_clip", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_DC_CLIP }, INT_MIN, INT_MAX, V|D, "bug"},
--{"ms", "work around various bugs in Microsoft's broken decoders", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_MS }, INT_MIN, INT_MAX, V|D, "bug"},
--{"trunc", "truncated frames", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_TRUNCATED}, INT_MIN, INT_MAX, V|D, "bug"},
--{"iedge", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_IEDGE }, INT_MIN, INT_MAX, V|D, "bug"},
--{"strict", "how strictly to follow the standards", OFFSET(strict_std_compliance), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, A|V|D|E, "strict"},
--{"very", "strictly conform to a older more strict version of the spec or reference software", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_VERY_STRICT }, INT_MIN, INT_MAX, A|V|D|E, "strict"},
--{"strict", "strictly conform to all the things in the spec no matter what the consequences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_STRICT }, INT_MIN, INT_MAX, A|V|D|E, "strict"},
--{"normal", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_NORMAL }, INT_MIN, INT_MAX, A|V|D|E, "strict"},
--{"unofficial", "allow unofficial extensions", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_UNOFFICIAL }, INT_MIN, INT_MAX, A|V|D|E, "strict"},
--{"experimental", "allow non-standardized experimental things", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_EXPERIMENTAL }, INT_MIN, INT_MAX, A|V|D|E, "strict"},
-+{"bug", "work around not autodetected encoder bugs", OFFSET(workaround_bugs), AV_OPT_TYPE_FLAGS, {.i64 = FF_BUG_AUTODETECT }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"autodetect", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_AUTODETECT }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"xvid_ilace", "Xvid interlacing bug (autodetected if FOURCC == XVIX)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_XVID_ILACE }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"ump4", "(autodetected if FOURCC == UMP4)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_UMP4 }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"no_padding", "padding bug (autodetected)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_NO_PADDING }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"amv", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_AMV }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"qpel_chroma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_QPEL_CHROMA }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"std_qpel", "old standard qpel (autodetected per FOURCC/version)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_STD_QPEL }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"qpel_chroma2", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_QPEL_CHROMA2 }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"direct_blocksize", "direct-qpel-blocksize bug (autodetected per FOURCC/version)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_DIRECT_BLOCKSIZE }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"edge", "edge padding bug (autodetected per FOURCC/version)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_EDGE }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"hpel_chroma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_HPEL_CHROMA }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"dc_clip", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_DC_CLIP }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"ms", "work around various bugs in Microsoft's broken decoders", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_MS }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"trunc", "truncated frames", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_TRUNCATED}, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"iedge", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_IEDGE }, INT_MIN, INT_MAX, V|D, .unit = "bug"},
-+{"strict", "how strictly to follow the standards", OFFSET(strict_std_compliance), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, A|V|D|E, .unit = "strict"},
-+{"very", "strictly conform to a older more strict version of the spec or reference software", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_VERY_STRICT }, INT_MIN, INT_MAX, A|V|D|E, .unit = "strict"},
-+{"strict", "strictly conform to all the things in the spec no matter what the consequences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_STRICT }, INT_MIN, INT_MAX, A|V|D|E, .unit = "strict"},
-+{"normal", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_NORMAL }, INT_MIN, INT_MAX, A|V|D|E, .unit = "strict"},
-+{"unofficial", "allow unofficial extensions", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_UNOFFICIAL }, INT_MIN, INT_MAX, A|V|D|E, .unit = "strict"},
-+{"experimental", "allow non-standardized experimental things", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_EXPERIMENTAL }, INT_MIN, INT_MAX, A|V|D|E, .unit = "strict"},
- {"b_qoffset", "QP offset between P- and B-frames", OFFSET(b_quant_offset), AV_OPT_TYPE_FLOAT, {.dbl = 1.25 }, -FLT_MAX, FLT_MAX, V|E},
--{"err_detect", "set error detection flags", OFFSET(err_recognition), AV_OPT_TYPE_FLAGS, {.i64 = 0 }, INT_MIN, INT_MAX, A|V|S|D|E, "err_detect"},
--{"crccheck", "verify embedded CRCs", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_CRCCHECK }, INT_MIN, INT_MAX, A|V|S|D|E, "err_detect"},
--{"bitstream", "detect bitstream specification deviations", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_BITSTREAM }, INT_MIN, INT_MAX, A|V|S|D|E, "err_detect"},
--{"buffer", "detect improper bitstream length", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_BUFFER }, INT_MIN, INT_MAX, A|V|S|D|E, "err_detect"},
--{"explode", "abort decoding on minor error detection", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_EXPLODE }, INT_MIN, INT_MAX, A|V|S|D|E, "err_detect"},
--{"ignore_err", "ignore errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_IGNORE_ERR }, INT_MIN, INT_MAX, A|V|S|D|E, "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|S|D|E, "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|S|D|E, "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|S|D|E, "err_detect"},
-+{"err_detect", "set error detection flags", OFFSET(err_recognition), AV_OPT_TYPE_FLAGS, {.i64 = 0 }, INT_MIN, INT_MAX, A|V|S|D|E, .unit = "err_detect"},
-+{"crccheck", "verify embedded CRCs", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_CRCCHECK }, INT_MIN, INT_MAX, A|V|S|D|E, .unit = "err_detect"},
-+{"bitstream", "detect bitstream specification deviations", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_BITSTREAM }, INT_MIN, INT_MAX, A|V|S|D|E, .unit = "err_detect"},
-+{"buffer", "detect improper bitstream length", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_BUFFER }, INT_MIN, INT_MAX, A|V|S|D|E, .unit = "err_detect"},
-+{"explode", "abort decoding on minor error detection", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_EXPLODE }, INT_MIN, INT_MAX, A|V|S|D|E, .unit = "err_detect"},
-+{"ignore_err", "ignore errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_IGNORE_ERR }, INT_MIN, INT_MAX, A|V|S|D|E, .unit = "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|S|D|E, .unit = "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|S|D|E, .unit = "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|S|D|E, .unit = "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},
- {"rc_override_count", NULL, OFFSET(rc_override_count), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX},
- {"maxrate", "maximum bitrate (in bits/s). Used for VBV together with bufsize.", OFFSET(rc_max_rate), AV_OPT_TYPE_INT64, {.i64 = DEFAULT }, 0, INT_MAX, V|A|E},
- {"minrate", "minimum bitrate (in bits/s). Most useful in setting up a CBR encode. It is of little use otherwise.",
-             OFFSET(rc_min_rate), AV_OPT_TYPE_INT64, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|A|E},
- {"bufsize", "set ratecontrol buffer size (in bits)", OFFSET(rc_buffer_size), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, A|V|E},
- {"i_qfactor", "QP factor between P- and I-frames", OFFSET(i_quant_factor), AV_OPT_TYPE_FLOAT, {.dbl = -0.8 }, -FLT_MAX, FLT_MAX, V|E},
- {"i_qoffset", "QP offset between P- and I-frames", OFFSET(i_quant_offset), AV_OPT_TYPE_FLOAT, {.dbl = 0.0 }, -FLT_MAX, FLT_MAX, V|E},
--{"dct", "DCT algorithm", OFFSET(dct_algo), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|E, "dct"},
--{"auto", "autoselect a good one", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_AUTO }, INT_MIN, INT_MAX, V|E, "dct"},
--{"fastint", "fast integer", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_FASTINT }, INT_MIN, INT_MAX, V|E, "dct"},
--{"int", "accurate integer", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_INT }, INT_MIN, INT_MAX, V|E, "dct"},
--{"mmx", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_MMX }, INT_MIN, INT_MAX, V|E, "dct"},
--{"altivec", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_ALTIVEC }, INT_MIN, INT_MAX, V|E, "dct"},
--{"faan", "floating point AAN DCT", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_FAAN }, INT_MIN, INT_MAX, V|E, "dct"},
-+{"dct", "DCT algorithm", OFFSET(dct_algo), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|E, .unit = "dct"},
-+{"auto", "autoselect a good one", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_AUTO }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
-+{"fastint", "fast integer", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_FASTINT }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
-+{"int", "accurate integer", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_INT }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
-+{"mmx", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_MMX }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
-+{"altivec", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_ALTIVEC }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
-+{"faan", "floating point AAN DCT", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DCT_FAAN }, INT_MIN, INT_MAX, V|E, .unit = "dct"},
- {"lumi_mask", "compresses bright areas stronger than medium ones", OFFSET(lumi_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, V|E},
- {"tcplx_mask", "temporal complexity masking", OFFSET(temporal_cplx_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, V|E},
- {"scplx_mask", "spatial complexity masking", OFFSET(spatial_cplx_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, V|E},
- {"p_mask", "inter masking", OFFSET(p_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, V|E},
- {"dark_mask", "compresses dark areas stronger than medium ones", OFFSET(dark_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, V|E},
--{"idct", "select IDCT implementation", OFFSET(idct_algo), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|E|D, "idct"},
--{"auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_AUTO }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"int", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_INT }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simple", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLE }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simplemmx", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEMMX }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"arm", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_ARM }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"altivec", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_ALTIVEC }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simplearm", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARM }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simplearmv5te", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARMV5TE }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simplearmv6", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARMV6 }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"simpleneon", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLENEON }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"xvid", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_XVID }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"xvidmmx", "deprecated, for compatibility only", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_XVID }, INT_MIN, INT_MAX, V|E|D, "idct"},
--{"faani", "floating point AAN IDCT", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_FAAN }, INT_MIN, INT_MAX, V|D|E, "idct"},
--{"simpleauto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEAUTO }, INT_MIN, INT_MAX, V|E|D, "idct"},
--#if FF_API_SLICE_OFFSET
--{"slice_count", NULL, OFFSET(slice_count), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX},
--#endif
--{"ec", "set error concealment strategy", OFFSET(error_concealment), AV_OPT_TYPE_FLAGS, {.i64 = 3 }, INT_MIN, INT_MAX, V|D, "ec"},
--{"guess_mvs", "iterative motion vector (MV) search (slow)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_EC_GUESS_MVS }, INT_MIN, INT_MAX, V|D, "ec"},
--{"deblock", "use strong deblock filter for damaged MBs", 0, AV_OPT_TYPE_CONST, {.i64 = FF_EC_DEBLOCK }, INT_MIN, INT_MAX, V|D, "ec"},
--{"favor_inter", "favor predicting from the previous frame", 0, AV_OPT_TYPE_CONST, {.i64 = FF_EC_FAVOR_INTER }, INT_MIN, INT_MAX, V|D, "ec"},
-+{"idct", "select IDCT implementation", OFFSET(idct_algo), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|E|D, .unit = "idct"},
-+{"auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_AUTO }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"int", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_INT }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simple", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLE }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simplemmx", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEMMX }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"arm", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_ARM }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"altivec", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_ALTIVEC }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simplearm", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARM }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simplearmv5te", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARMV5TE }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simplearmv6", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEARMV6 }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"simpleneon", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLENEON }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"xvid", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_XVID }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"xvidmmx", "deprecated, for compatibility only", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_XVID }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"faani", "floating point AAN IDCT", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_FAAN }, INT_MIN, INT_MAX, V|D|E, .unit = "idct"},
-+{"simpleauto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEAUTO }, INT_MIN, INT_MAX, V|E|D, .unit = "idct"},
-+{"ec", "set error concealment strategy", OFFSET(error_concealment), AV_OPT_TYPE_FLAGS, {.i64 = 3 }, INT_MIN, INT_MAX, V|D, .unit = "ec"},
-+{"guess_mvs", "iterative motion vector (MV) search (slow)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_EC_GUESS_MVS }, INT_MIN, INT_MAX, V|D, .unit = "ec"},
-+{"deblock", "use strong deblock filter for damaged MBs", 0, AV_OPT_TYPE_CONST, {.i64 = FF_EC_DEBLOCK }, INT_MIN, INT_MAX, V|D, .unit = "ec"},
-+{"favor_inter", "favor predicting from the previous frame", 0, AV_OPT_TYPE_CONST, {.i64 = FF_EC_FAVOR_INTER }, INT_MIN, INT_MAX, V|D, .unit = "ec"},
- {"bits_per_coded_sample", NULL, OFFSET(bits_per_coded_sample), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX},
- {"aspect", "sample aspect ratio", OFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL, {.dbl = 0}, 0, 10, V|E},
- {"sar",    "sample aspect ratio", OFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL, {.dbl = 0}, 0, 10, V|E},
--{"debug", "print specific debug info", OFFSET(debug), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT }, 0, INT_MAX, V|A|S|E|D, "debug"},
--{"pict", "picture info", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_PICT_INFO }, INT_MIN, INT_MAX, V|D, "debug"},
--{"rc", "rate control", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_RC }, INT_MIN, INT_MAX, V|E, "debug"},
--{"bitstream", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BITSTREAM }, INT_MIN, INT_MAX, V|D, "debug"},
--{"mb_type", "macroblock (MB) type", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_MB_TYPE }, INT_MIN, INT_MAX, V|D, "debug"},
--{"qp", "per-block quantization parameter (QP)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_QP }, INT_MIN, INT_MAX, V|D, "debug"},
--{"dct_coeff", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_DCT_COEFF }, INT_MIN, INT_MAX, V|D, "debug"},
--{"green_metadata", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_GREEN_MD }, INT_MIN, INT_MAX, V|D, "debug"},
--{"skip", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_SKIP }, INT_MIN, INT_MAX, V|D, "debug"},
--{"startcode", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_STARTCODE }, INT_MIN, INT_MAX, V|D, "debug"},
--{"er", "error recognition", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_ER }, INT_MIN, INT_MAX, V|D, "debug"},
--{"mmco", "memory management control operations (H.264)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_MMCO }, INT_MIN, INT_MAX, V|D, "debug"},
--{"bugs", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUGS }, INT_MIN, INT_MAX, V|D, "debug"},
--{"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"},
-+{"debug", "print specific debug info", OFFSET(debug), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT }, 0, INT_MAX, V|A|S|E|D, .unit = "debug"},
-+{"pict", "picture info", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_PICT_INFO }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"rc", "rate control", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_RC }, INT_MIN, INT_MAX, V|E, .unit = "debug"},
-+{"bitstream", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BITSTREAM }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"mb_type", "macroblock (MB) type", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_MB_TYPE }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"qp", "per-block quantization parameter (QP)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_QP }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"dct_coeff", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_DCT_COEFF }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"green_metadata", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_GREEN_MD }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"skip", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_SKIP }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"startcode", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_STARTCODE }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"er", "error recognition", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_ER }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"mmco", "memory management control operations (H.264)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_MMCO }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"bugs", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUGS }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"buffers", "picture buffer allocations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUFFERS }, INT_MIN, INT_MAX, V|D, .unit = "debug"},
-+{"thread_ops", "threading operations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_THREADS }, INT_MIN, INT_MAX, V|A|D, .unit = "debug"},
-+{"nomc", "skip motion compensation", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_NOMC }, INT_MIN, INT_MAX, V|A|D, .unit = "debug"},
- {"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},
- {"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},
- {"global_quality", NULL, OFFSET(global_quality), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|A|E},
- {"slice_flags", NULL, OFFSET(slice_flags), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX},
--{"mbd", "macroblock decision algorithm (high quality mode)", OFFSET(mb_decision), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, 2, V|E, "mbd"},
--{"simple", "use mbcmp", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MB_DECISION_SIMPLE }, INT_MIN, INT_MAX, V|E, "mbd"},
--{"bits", "use fewest bits", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MB_DECISION_BITS }, INT_MIN, INT_MAX, V|E, "mbd"},
--{"rd", "use best rate distortion", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MB_DECISION_RD }, INT_MIN, INT_MAX, V|E, "mbd"},
-+{"mbd", "macroblock decision algorithm (high quality mode)", OFFSET(mb_decision), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, 2, V|E, .unit = "mbd"},
-+{"simple", "use mbcmp", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MB_DECISION_SIMPLE }, INT_MIN, INT_MAX, V|E, .unit = "mbd"},
-+{"bits", "use fewest bits", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MB_DECISION_BITS }, INT_MIN, INT_MAX, V|E, .unit = "mbd"},
-+{"rd", "use best rate distortion", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MB_DECISION_RD }, INT_MIN, INT_MAX, V|E, .unit = "mbd"},
- {"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},
--{"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"},
-+{"threads", "set the number of threads", OFFSET(thread_count), AV_OPT_TYPE_INT, {.i64 = 1 }, 0, INT_MAX, V|A|E|D, .unit = "threads"},
-+{"auto", "autodetect a suitable number of threads to use", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, INT_MIN, INT_MAX, V|E|D, .unit = "threads"},
- {"dc", "intra_dc_precision", OFFSET(intra_dc_precision), AV_OPT_TYPE_INT, {.i64 = 0 }, -8, 16, V|E},
- {"nssew", "nsse weight", OFFSET(nsse_weight), AV_OPT_TYPE_INT, {.i64 = 8 }, INT_MIN, INT_MAX, V|E},
- {"skip_top", "number of macroblock rows at the top which are skipped", OFFSET(skip_top), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|D},
- {"skip_bottom", "number of macroblock rows at the bottom which are skipped", OFFSET(skip_bottom), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|D},
--{"profile", NULL, OFFSET(profile), AV_OPT_TYPE_INT, {.i64 = AV_PROFILE_UNKNOWN }, INT_MIN, INT_MAX, V|A|E|CC, "avctx.profile"},
--{"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_PROFILE_UNKNOWN }, INT_MIN, INT_MAX, V|A|E, "avctx.profile"},
--{"main10",  NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_PROFILE_HEVC_MAIN_10 }, INT_MIN, INT_MAX, V|E, "avctx.profile"},
--{"level", "encoding level, usually corresponding to the profile level, codec-specific", OFFSET(level), AV_OPT_TYPE_INT, {.i64 = FF_LEVEL_UNKNOWN }, INT_MIN, INT_MAX, V|A|E|CC, "avctx.level"},
--{"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LEVEL_UNKNOWN }, INT_MIN, INT_MAX, V|A|E, "avctx.level"},
-+{"profile", NULL, OFFSET(profile), AV_OPT_TYPE_INT, {.i64 = AV_PROFILE_UNKNOWN }, INT_MIN, INT_MAX, V|A|E|CC, .unit = "avctx.profile"},
-+{"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_PROFILE_UNKNOWN }, INT_MIN, INT_MAX, V|A|E, .unit = "avctx.profile"},
-+{"main10",  NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_PROFILE_HEVC_MAIN_10 }, INT_MIN, INT_MAX, V|E, .unit = "avctx.profile"},
-+{"level", "encoding level, usually corresponding to the profile level, codec-specific", OFFSET(level), AV_OPT_TYPE_INT, {.i64 = FF_LEVEL_UNKNOWN }, INT_MIN, INT_MAX, V|A|E|CC, .unit = "avctx.level"},
-+{"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LEVEL_UNKNOWN }, INT_MIN, INT_MAX, V|A|E, .unit = "avctx.level"},
- {"lowres", "decode at 1= 1/2, 2=1/4, 3=1/8 resolutions", OFFSET(lowres), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, V|A|D},
--{"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"},
-+{"cmp", "full-pel ME compare function", OFFSET(me_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"subcmp", "sub-pel ME compare function", OFFSET(me_sub_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"mbcmp", "macroblock compare function", OFFSET(mb_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"ildctcmp", "interlaced DCT compare function", OFFSET(ildct_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_VSAD }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"precmp", "pre motion estimation compare function", OFFSET(me_pre_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"sad", "sum of absolute differences, fast", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SAD }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"sse", "sum of squared errors", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SSE }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"satd", "sum of absolute Hadamard transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SATD }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"dct", "sum of absolute DCT transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCT }, INT_MIN, INT_MAX, V|E, .unit = "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, .unit = "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, .unit = "cmp_func"},
-+{"rd", "rate distortion optimal, slow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_RD }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"zero", "0", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_ZERO }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"vsad", "sum of absolute vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSAD }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"vsse", "sum of squared vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSSE }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"nsse", "noise preserving sum of squared differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_NSSE }, INT_MIN, INT_MAX, V|E, .unit = "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"},
-+{"w53", "5/3 wavelet, only used in snow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_W53 }, INT_MIN, INT_MAX, V|E, .unit = "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, .unit = "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"},
-+{"dctmax", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, V|E, .unit = "cmp_func"},
-+{"chroma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_CHROMA }, INT_MIN, INT_MAX, V|E, .unit = "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, .unit = "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},
--{"skip_loop_filter", "skip loop filtering process for the selected frames", OFFSET(skip_loop_filter), AV_OPT_TYPE_INT, {.i64 = AVDISCARD_DEFAULT }, INT_MIN, INT_MAX, V|D, "avdiscard"},
--{"skip_idct"       , "skip IDCT/dequantization for the selected frames",    OFFSET(skip_idct),        AV_OPT_TYPE_INT, {.i64 = AVDISCARD_DEFAULT }, INT_MIN, INT_MAX, V|D, "avdiscard"},
--{"skip_frame"      , "skip decoding for the selected frames",               OFFSET(skip_frame),       AV_OPT_TYPE_INT, {.i64 = AVDISCARD_DEFAULT }, INT_MIN, INT_MAX, V|D, "avdiscard"},
--{"none"            , "discard no frame",                    0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_NONE    }, INT_MIN, INT_MAX, V|D, "avdiscard"},
--{"default"         , "discard useless frames",              0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_DEFAULT }, INT_MIN, INT_MAX, V|D, "avdiscard"},
--{"noref"           , "discard all non-reference frames",    0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_NONREF  }, INT_MIN, INT_MAX, V|D, "avdiscard"},
--{"bidir"           , "discard all bidirectional frames",    0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_BIDIR   }, INT_MIN, INT_MAX, V|D, "avdiscard"},
--{"nointra"         , "discard all frames except I frames",  0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_NONINTRA}, INT_MIN, INT_MAX, V|D, "avdiscard"},
--{"nokey"           , "discard all frames except keyframes", 0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_NONKEY  }, INT_MIN, INT_MAX, V|D, "avdiscard"},
--{"all"             , "discard all frames",                  0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_ALL     }, INT_MIN, INT_MAX, V|D, "avdiscard"},
-+{"skip_loop_filter", "skip loop filtering process for the selected frames", OFFSET(skip_loop_filter), AV_OPT_TYPE_INT, {.i64 = AVDISCARD_DEFAULT }, INT_MIN, INT_MAX, V|D, .unit = "avdiscard"},
-+{"skip_idct"       , "skip IDCT/dequantization for the selected frames",    OFFSET(skip_idct),        AV_OPT_TYPE_INT, {.i64 = AVDISCARD_DEFAULT }, INT_MIN, INT_MAX, V|D, .unit = "avdiscard"},
-+{"skip_frame"      , "skip decoding for the selected frames",               OFFSET(skip_frame),       AV_OPT_TYPE_INT, {.i64 = AVDISCARD_DEFAULT }, INT_MIN, INT_MAX, V|D, .unit = "avdiscard"},
-+{"none"            , "discard no frame",                    0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_NONE    }, INT_MIN, INT_MAX, V|D, .unit = "avdiscard"},
-+{"default"         , "discard useless frames",              0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_DEFAULT }, INT_MIN, INT_MAX, V|D, .unit = "avdiscard"},
-+{"noref"           , "discard all non-reference frames",    0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_NONREF  }, INT_MIN, INT_MAX, V|D, .unit = "avdiscard"},
-+{"bidir"           , "discard all bidirectional frames",    0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_BIDIR   }, INT_MIN, INT_MAX, V|D, .unit = "avdiscard"},
-+{"nointra"         , "discard all frames except I frames",  0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_NONINTRA}, INT_MIN, INT_MAX, V|D, .unit = "avdiscard"},
-+{"nokey"           , "discard all frames except keyframes", 0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_NONKEY  }, INT_MIN, INT_MAX, V|D, .unit = "avdiscard"},
-+{"all"             , "discard all frames",                  0, AV_OPT_TYPE_CONST, {.i64 = AVDISCARD_ALL     }, INT_MIN, INT_MAX, V|D, .unit = "avdiscard"},
- {"bidir_refine", "refine the two motion vectors used in bidirectional macroblocks", OFFSET(bidir_refine), AV_OPT_TYPE_INT, {.i64 = 1 }, 0, 4, V|E},
- {"keyint_min", "minimum interval between IDR-frames", OFFSET(keyint_min), AV_OPT_TYPE_INT, {.i64 = 25 }, INT_MIN, INT_MAX, V|E},
- {"refs", "reference frames to consider for motion compensation", OFFSET(refs), AV_OPT_TYPE_INT, {.i64 = 1 }, INT_MIN, INT_MAX, V|E},
- {"trellis", "rate-distortion optimal quantization", OFFSET(trellis), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|A|E},
- {"mv0_threshold", NULL, OFFSET(mv0_threshold), AV_OPT_TYPE_INT, {.i64 = 256 }, 0, INT_MAX, V|E},
- {"compression_level", NULL, OFFSET(compression_level), AV_OPT_TYPE_INT, {.i64 = FF_COMPRESSION_DEFAULT }, INT_MIN, INT_MAX, V|A|E},
- {"bits_per_raw_sample", NULL, OFFSET(bits_per_raw_sample), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX},
--{"ch_layout", NULL, OFFSET(ch_layout), AV_OPT_TYPE_CHLAYOUT, {.str = NULL }, 0, 0, A|E|D, "ch_layout"},
--#if FF_API_OLD_CHANNEL_LAYOUT
--{"channel_layout", NULL, OFFSET(channel_layout), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64 = DEFAULT }, 0, UINT64_MAX, A|E|D, "channel_layout"},
--{"request_channel_layout", NULL, OFFSET(request_channel_layout), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64 = DEFAULT }, 0, UINT64_MAX, A|D, "request_channel_layout"},
--#endif
-+{"ch_layout", NULL, OFFSET(ch_layout), AV_OPT_TYPE_CHLAYOUT, {.str = NULL }, 0, 0, A|E|D, .unit = "ch_layout"},
- {"rc_max_vbv_use", NULL, OFFSET(rc_max_available_vbv_use), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, 0.0, FLT_MAX, V|E},
- {"rc_min_vbv_use", NULL, OFFSET(rc_min_vbv_overflow_use),  AV_OPT_TYPE_FLOAT, {.dbl = 3 },     0.0, FLT_MAX, V|E},
- #if FF_API_TICKS_PER_FRAME
- {"ticks_per_frame", NULL, OFFSET(ticks_per_frame), AV_OPT_TYPE_INT, {.i64 = 1 }, 1, INT_MAX, A|V|E|D},
- #endif
--{"color_primaries", "color primaries", OFFSET(color_primaries), AV_OPT_TYPE_INT, {.i64 = AVCOL_PRI_UNSPECIFIED }, 1, INT_MAX, V|E|D, "color_primaries_type"},
--{"bt709",       "BT.709",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_BT709 },        INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
--{"unknown",     "Unspecified",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_UNSPECIFIED },  INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
--{"bt470m",      "BT.470 M",       0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_BT470M },       INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
--{"bt470bg",     "BT.470 BG",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_BT470BG },      INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
--{"smpte170m",   "SMPTE 170 M",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE170M },    INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
--{"smpte240m",   "SMPTE 240 M",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE240M },    INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
--{"film",        "Film",           0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_FILM },         INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
--{"bt2020",      "BT.2020",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_BT2020 },       INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
--{"smpte428",    "SMPTE 428-1",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE428 },     INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
--{"smpte428_1",  "SMPTE 428-1",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE428 },     INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
--{"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"},
--{"unknown",      "Unspecified",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_UNSPECIFIED },  INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"gamma22",      "BT.470 M",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA22 },      INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"gamma28",      "BT.470 BG",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA28 },      INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"smpte170m",    "SMPTE 170 M",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE170M },    INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"smpte240m",    "SMPTE 240 M",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE240M },    INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"linear",       "Linear",           0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LINEAR },       INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"log100",       "Log",              0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG },          INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"log316",       "Log square root",  0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG_SQRT },     INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"iec61966-2-4", "IEC 61966-2-4",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_4 }, INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"bt1361e",      "BT.1361",          0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT1361_ECG },   INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"iec61966-2-1", "IEC 61966-2-1",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_1 }, INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"bt2020-10",    "BT.2020 - 10 bit", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_10 },    INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"bt2020-12",    "BT.2020 - 12 bit", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_12 },    INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"smpte2084",    "SMPTE 2084",       0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE2084 },    INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"smpte428",     "SMPTE 428-1",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE428 },     INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"arib-std-b67", "ARIB STD-B67",     0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_ARIB_STD_B67 }, INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"unspecified",  "Unspecified",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_UNSPECIFIED },  INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"log",          "Log",              0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG },          INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"log_sqrt",     "Log square root",  0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG_SQRT },     INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"iec61966_2_4", "IEC 61966-2-4",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_4 }, INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"bt1361",       "BT.1361",          0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT1361_ECG },   INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"iec61966_2_1", "IEC 61966-2-1",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_1 }, INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"bt2020_10bit", "BT.2020 - 10 bit", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_10 },    INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"bt2020_12bit", "BT.2020 - 12 bit", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_12 },    INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"smpte428_1",   "SMPTE 428-1",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE428 },     INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
--{"colorspace", "color space", OFFSET(colorspace), AV_OPT_TYPE_INT, {.i64 = AVCOL_SPC_UNSPECIFIED }, 0, INT_MAX, V|E|D, "colorspace_type"},
--{"rgb",               "RGB",                0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_RGB },                INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"bt709",             "BT.709",             0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT709 },              INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"unknown",           "Unspecified",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_UNSPECIFIED },        INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"fcc",               "FCC",                0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_FCC },                INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"bt470bg",           "BT.470 BG",          0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT470BG },            INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"smpte170m",         "SMPTE 170 M",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_SMPTE170M },          INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"smpte240m",         "SMPTE 240 M",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_SMPTE240M },          INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"ycgco",             "YCGCO",              0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_YCGCO },              INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"bt2020nc",          "BT.2020 NCL",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT2020_NCL },         INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"bt2020c",           "BT.2020 CL",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT2020_CL },          INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"smpte2085",         "SMPTE 2085",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_SMPTE2085 },          INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"chroma-derived-nc", "Chroma-derived NCL", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_CHROMA_DERIVED_NCL }, INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"chroma-derived-c",  "Chroma-derived CL",  0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_CHROMA_DERIVED_CL },  INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"ictcp",             "ICtCp",              0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_ICTCP },              INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"unspecified",       "Unspecified",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_UNSPECIFIED },        INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"ycocg",             "YCGCO",              0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_YCGCO },              INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"bt2020_ncl",        "BT.2020 NCL",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT2020_NCL },         INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"bt2020_cl",         "BT.2020 CL",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT2020_CL },          INT_MIN, INT_MAX, V|E|D, "colorspace_type"},
--{"color_range", "color range", OFFSET(color_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, INT_MAX, V|E|D, "color_range_type"},
--{"unknown", "Unspecified",     0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, "color_range_type"},
--{"tv", "MPEG (219*2^(n-8))",   0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_MPEG },        INT_MIN, INT_MAX, V|E|D, "color_range_type"},
--{"pc", "JPEG (2^n-1)",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_JPEG },        INT_MIN, INT_MAX, V|E|D, "color_range_type"},
--{"unspecified", "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, "color_range_type"},
--{"mpeg", "MPEG (219*2^(n-8))", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_MPEG },        INT_MIN, INT_MAX, V|E|D, "color_range_type"},
--{"jpeg", "JPEG (2^n-1)",       0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_JPEG },        INT_MIN, INT_MAX, V|E|D, "color_range_type"},
--{"limited", "MPEG (219*2^(n-8))", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_MPEG },     INT_MIN, INT_MAX, V|E|D, "color_range_type"},
--{"full", "JPEG (2^n-1)",       0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_JPEG },        INT_MIN, INT_MAX, V|E|D, "color_range_type"},
--{"chroma_sample_location", "chroma sample location", OFFSET(chroma_sample_location), AV_OPT_TYPE_INT, {.i64 = AVCHROMA_LOC_UNSPECIFIED }, 0, INT_MAX, V|E|D, "chroma_sample_location_type"},
--{"unknown",     "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, "chroma_sample_location_type"},
--{"left",        "Left",        0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_LEFT },        INT_MIN, INT_MAX, V|E|D, "chroma_sample_location_type"},
--{"center",      "Center",      0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_CENTER },      INT_MIN, INT_MAX, V|E|D, "chroma_sample_location_type"},
--{"topleft",     "Top-left",    0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_TOPLEFT },     INT_MIN, INT_MAX, V|E|D, "chroma_sample_location_type"},
--{"top",         "Top",         0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_TOP },         INT_MIN, INT_MAX, V|E|D, "chroma_sample_location_type"},
--{"bottomleft",  "Bottom-left", 0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_BOTTOMLEFT },  INT_MIN, INT_MAX, V|E|D, "chroma_sample_location_type"},
--{"bottom",      "Bottom",      0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_BOTTOM },      INT_MIN, INT_MAX, V|E|D, "chroma_sample_location_type"},
--{"unspecified", "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, "chroma_sample_location_type"},
-+{"color_primaries", "color primaries", OFFSET(color_primaries), AV_OPT_TYPE_INT, {.i64 = AVCOL_PRI_UNSPECIFIED }, 1, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"bt709",       "BT.709",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_BT709 },        INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"unknown",     "Unspecified",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_UNSPECIFIED },  INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"bt470m",      "BT.470 M",       0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_BT470M },       INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"bt470bg",     "BT.470 BG",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_BT470BG },      INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"smpte170m",   "SMPTE 170 M",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE170M },    INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"smpte240m",   "SMPTE 240 M",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE240M },    INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"film",        "Film",           0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_FILM },         INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"bt2020",      "BT.2020",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_BT2020 },       INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"smpte428",    "SMPTE 428-1",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE428 },     INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"smpte428_1",  "SMPTE 428-1",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE428 },     INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"smpte431",    "SMPTE 431-2",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE431 },     INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"smpte432",    "SMPTE 422-1",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE432 },     INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"jedec-p22",   "JEDEC P22",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_JEDEC_P22 },    INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"ebu3213",     "EBU 3213-E",     0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_EBU3213 },      INT_MIN, INT_MAX, V|E|D, .unit = "color_primaries_type"},
-+{"unspecified", "Unspecified",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_UNSPECIFIED },  INT_MIN, INT_MAX, V|E|D, .unit = "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, .unit = "color_trc_type"},
-+{"bt709",        "BT.709",           0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT709 },        INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"unknown",      "Unspecified",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_UNSPECIFIED },  INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"gamma22",      "BT.470 M",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA22 },      INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"gamma28",      "BT.470 BG",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA28 },      INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"smpte170m",    "SMPTE 170 M",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE170M },    INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"smpte240m",    "SMPTE 240 M",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE240M },    INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"linear",       "Linear",           0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LINEAR },       INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"log100",       "Log",              0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG },          INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"log316",       "Log square root",  0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG_SQRT },     INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"iec61966-2-4", "IEC 61966-2-4",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_4 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"bt1361e",      "BT.1361",          0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT1361_ECG },   INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"iec61966-2-1", "IEC 61966-2-1",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_1 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"bt2020-10",    "BT.2020 - 10 bit", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_10 },    INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"bt2020-12",    "BT.2020 - 12 bit", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_12 },    INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"smpte2084",    "SMPTE 2084",       0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE2084 },    INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"smpte428",     "SMPTE 428-1",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE428 },     INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"arib-std-b67", "ARIB STD-B67",     0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_ARIB_STD_B67 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"unspecified",  "Unspecified",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_UNSPECIFIED },  INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"log",          "Log",              0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG },          INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"log_sqrt",     "Log square root",  0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LOG_SQRT },     INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"iec61966_2_4", "IEC 61966-2-4",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_4 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"bt1361",       "BT.1361",          0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT1361_ECG },   INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"iec61966_2_1", "IEC 61966-2-1",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_IEC61966_2_1 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"bt2020_10bit", "BT.2020 - 10 bit", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_10 },    INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"bt2020_12bit", "BT.2020 - 12 bit", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT2020_12 },    INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"smpte428_1",   "SMPTE 428-1",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE428 },     INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
-+{"colorspace", "color space", OFFSET(colorspace), AV_OPT_TYPE_INT, {.i64 = AVCOL_SPC_UNSPECIFIED }, 0, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"rgb",               "RGB",                0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_RGB },                INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"bt709",             "BT.709",             0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT709 },              INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"unknown",           "Unspecified",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_UNSPECIFIED },        INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"fcc",               "FCC",                0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_FCC },                INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"bt470bg",           "BT.470 BG",          0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT470BG },            INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"smpte170m",         "SMPTE 170 M",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_SMPTE170M },          INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"smpte240m",         "SMPTE 240 M",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_SMPTE240M },          INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"ycgco",             "YCGCO",              0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_YCGCO },              INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"bt2020nc",          "BT.2020 NCL",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT2020_NCL },         INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"bt2020c",           "BT.2020 CL",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT2020_CL },          INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"smpte2085",         "SMPTE 2085",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_SMPTE2085 },          INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"chroma-derived-nc", "Chroma-derived NCL", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_CHROMA_DERIVED_NCL }, INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"chroma-derived-c",  "Chroma-derived CL",  0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_CHROMA_DERIVED_CL },  INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"ictcp",             "ICtCp",              0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_ICTCP },              INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"ipt-c2",            "IPT-C2",             0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_IPT_C2 },             INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"unspecified",       "Unspecified",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_UNSPECIFIED },        INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"ycocg",             "YCGCO",              0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_YCGCO },              INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"ycgco-re",          "YCgCo-R, even add.", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_YCGCO_RE },           INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"ycgco-ro",          "YCgCo-R, odd add.",  0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_YCGCO_RO },           INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"bt2020_ncl",        "BT.2020 NCL",        0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT2020_NCL },         INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"bt2020_cl",         "BT.2020 CL",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_SPC_BT2020_CL },          INT_MIN, INT_MAX, V|E|D, .unit = "colorspace_type"},
-+{"color_range", "color range", OFFSET(color_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, INT_MAX, V|E|D, .unit = "color_range_type"},
-+{"unknown", "Unspecified",     0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, .unit = "color_range_type"},
-+{"tv", "MPEG (219*2^(n-8))",   0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_MPEG },        INT_MIN, INT_MAX, V|E|D, .unit = "color_range_type"},
-+{"pc", "JPEG (2^n-1)",         0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_JPEG },        INT_MIN, INT_MAX, V|E|D, .unit = "color_range_type"},
-+{"unspecified", "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, .unit = "color_range_type"},
-+{"mpeg", "MPEG (219*2^(n-8))", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_MPEG },        INT_MIN, INT_MAX, V|E|D, .unit = "color_range_type"},
-+{"jpeg", "JPEG (2^n-1)",       0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_JPEG },        INT_MIN, INT_MAX, V|E|D, .unit = "color_range_type"},
-+{"limited", "MPEG (219*2^(n-8))", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_MPEG },     INT_MIN, INT_MAX, V|E|D, .unit = "color_range_type"},
-+{"full", "JPEG (2^n-1)",       0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_JPEG },        INT_MIN, INT_MAX, V|E|D, .unit = "color_range_type"},
-+{"chroma_sample_location", "chroma sample location", OFFSET(chroma_sample_location), AV_OPT_TYPE_INT, {.i64 = AVCHROMA_LOC_UNSPECIFIED }, 0, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"},
-+{"unknown",     "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"},
-+{"left",        "Left",        0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_LEFT },        INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"},
-+{"center",      "Center",      0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_CENTER },      INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"},
-+{"topleft",     "Top-left",    0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_TOPLEFT },     INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"},
-+{"top",         "Top",         0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_TOP },         INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"},
-+{"bottomleft",  "Bottom-left", 0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_BOTTOMLEFT },  INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"},
-+{"bottom",      "Bottom",      0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_BOTTOM },      INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"},
-+{"unspecified", "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVCHROMA_LOC_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, .unit = "chroma_sample_location_type"},
- {"log_level_offset", "set the log level offset", OFFSET(log_level_offset), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX },
- {"slices", "set the number of slices, used in parallelized encoding", OFFSET(slices), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, V|E},
--{"thread_type", "select multithreading type", OFFSET(thread_type), AV_OPT_TYPE_FLAGS, {.i64 = FF_THREAD_SLICE|FF_THREAD_FRAME }, 0, INT_MAX, V|A|E|D, "thread_type"},
--{"slice", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_THREAD_SLICE }, INT_MIN, INT_MAX, V|E|D, "thread_type"},
--{"frame", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_THREAD_FRAME }, INT_MIN, INT_MAX, V|E|D, "thread_type"},
--{"audio_service_type", "audio service type", OFFSET(audio_service_type), AV_OPT_TYPE_INT, {.i64 = AV_AUDIO_SERVICE_TYPE_MAIN }, 0, AV_AUDIO_SERVICE_TYPE_NB-1, A|E, "audio_service_type"},
--{"ma", "Main Audio Service", 0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_MAIN },              INT_MIN, INT_MAX, A|E, "audio_service_type"},
--{"ef", "Effects",            0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_EFFECTS },           INT_MIN, INT_MAX, A|E, "audio_service_type"},
--{"vi", "Visually Impaired",  0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED }, INT_MIN, INT_MAX, A|E, "audio_service_type"},
--{"hi", "Hearing Impaired",   0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED },  INT_MIN, INT_MAX, A|E, "audio_service_type"},
--{"di", "Dialogue",           0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_DIALOGUE },          INT_MIN, INT_MAX, A|E, "audio_service_type"},
--{"co", "Commentary",         0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_COMMENTARY },        INT_MIN, INT_MAX, A|E, "audio_service_type"},
--{"em", "Emergency",          0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_EMERGENCY },         INT_MIN, INT_MAX, A|E, "audio_service_type"},
--{"vo", "Voice Over",         0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_VOICE_OVER },        INT_MIN, INT_MAX, A|E, "audio_service_type"},
--{"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"},
-+{"thread_type", "select multithreading type", OFFSET(thread_type), AV_OPT_TYPE_FLAGS, {.i64 = FF_THREAD_SLICE|FF_THREAD_FRAME }, 0, INT_MAX, V|A|E|D, .unit = "thread_type"},
-+{"slice", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_THREAD_SLICE }, INT_MIN, INT_MAX, V|E|D, .unit = "thread_type"},
-+{"frame", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_THREAD_FRAME }, INT_MIN, INT_MAX, V|E|D, .unit = "thread_type"},
-+{"audio_service_type", "audio service type", OFFSET(audio_service_type), AV_OPT_TYPE_INT, {.i64 = AV_AUDIO_SERVICE_TYPE_MAIN }, 0, AV_AUDIO_SERVICE_TYPE_NB-1, A|E, .unit = "audio_service_type"},
-+{"ma", "Main Audio Service", 0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_MAIN },              INT_MIN, INT_MAX, A|E, .unit = "audio_service_type"},
-+{"ef", "Effects",            0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_EFFECTS },           INT_MIN, INT_MAX, A|E, .unit = "audio_service_type"},
-+{"vi", "Visually Impaired",  0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED }, INT_MIN, INT_MAX, A|E, .unit = "audio_service_type"},
-+{"hi", "Hearing Impaired",   0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED },  INT_MIN, INT_MAX, A|E, .unit = "audio_service_type"},
-+{"di", "Dialogue",           0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_DIALOGUE },          INT_MIN, INT_MAX, A|E, .unit = "audio_service_type"},
-+{"co", "Commentary",         0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_COMMENTARY },        INT_MIN, INT_MAX, A|E, .unit = "audio_service_type"},
-+{"em", "Emergency",          0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_EMERGENCY },         INT_MIN, INT_MAX, A|E, .unit = "audio_service_type"},
-+{"vo", "Voice Over",         0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_VOICE_OVER },        INT_MIN, INT_MAX, A|E, .unit = "audio_service_type"},
-+{"ka", "Karaoke",            0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_KARAOKE },           INT_MIN, INT_MAX, A|E, .unit = "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, .unit = "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}, 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"},
--{"pre_decoder", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_PRE_DECODER}, INT_MIN, INT_MAX, S|D, "sub_charenc_mode"},
--{"ignore",      NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_IGNORE},      INT_MIN, INT_MAX, S|D, "sub_charenc_mode"},
-+{"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, .unit = "sub_charenc_mode"},
-+{"do_nothing",  NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_DO_NOTHING},  INT_MIN, INT_MAX, S|D, .unit = "sub_charenc_mode"},
-+{"auto",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_AUTOMATIC},   INT_MIN, INT_MAX, S|D, .unit = "sub_charenc_mode"},
-+{"pre_decoder", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_PRE_DECODER}, INT_MIN, INT_MAX, S|D, .unit = "sub_charenc_mode"},
-+{"ignore",      NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_IGNORE},      INT_MIN, INT_MAX, S|D, .unit = "sub_charenc_mode"},
- {"apply_cropping", NULL, OFFSET(apply_cropping), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, V | D },
- {"skip_alpha", "Skip processing alpha", OFFSET(skip_alpha), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, V|D },
--{"field_order", "Field order", OFFSET(field_order), AV_OPT_TYPE_INT, {.i64 = AV_FIELD_UNKNOWN }, 0, 5, V|D|E, "field_order" },
--{"progressive", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_PROGRESSIVE }, 0, 0, V|D|E, "field_order" },
--{"tt", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_TT }, 0, 0, V|D|E, "field_order" },
--{"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" },
-+{"field_order", "Field order", OFFSET(field_order), AV_OPT_TYPE_INT, {.i64 = AV_FIELD_UNKNOWN }, 0, 5, V|D|E, .unit = "field_order" },
-+{"progressive", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_PROGRESSIVE }, 0, 0, V|D|E, .unit = "field_order" },
-+{"tt", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_TT }, 0, 0, V|D|E, .unit = "field_order" },
-+{"bb", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_BB }, 0, 0, V|D|E, .unit = "field_order" },
-+{"tb", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_TB }, 0, 0, V|D|E, .unit = "field_order" },
-+{"bt", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_BT }, 0, 0, V|D|E, .unit = "field_order" },
- {"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"},
--{"unsafe_output", "allow potentially unsafe hwaccel frame output that might require special care to process successfully", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_UNSAFE_OUTPUT }, INT_MIN, INT_MAX, V | D, "hwaccel_flags"},
-+{"hwaccel_flags", NULL, OFFSET(hwaccel_flags), AV_OPT_TYPE_FLAGS, {.i64 = AV_HWACCEL_FLAG_IGNORE_LEVEL }, 0, UINT_MAX, V|D, .unit = "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, .unit = "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, .unit = "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, .unit = "hwaccel_flags"},
-+{"unsafe_output", "allow potentially unsafe hwaccel frame output that might require special care to process successfully", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_UNSAFE_OUTPUT }, INT_MIN, INT_MAX, V | D, .unit = "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 },
-+{"side_data_prefer_packet", "Comma-separated list of side data types for which user-supplied (container) data is preferred over coded bytestream",
-+    OFFSET(side_data_prefer_packet), AV_OPT_TYPE_INT | AR, .min = -1, .max = INT_MAX, .flags = V|A|S|D, .unit = "side_data_pkt" },
-+    {"replaygain",                  .default_val.i64 = AV_PKT_DATA_REPLAYGAIN,                  .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-+    {"displaymatrix",               .default_val.i64 = AV_PKT_DATA_DISPLAYMATRIX,               .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-+    {"spherical",                   .default_val.i64 = AV_PKT_DATA_SPHERICAL,                   .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-+    {"stereo3d",                    .default_val.i64 = AV_PKT_DATA_STEREO3D,                    .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-+    {"audio_service_type",          .default_val.i64 = AV_PKT_DATA_AUDIO_SERVICE_TYPE,          .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-+    {"mastering_display_metadata",  .default_val.i64 = AV_PKT_DATA_MASTERING_DISPLAY_METADATA,  .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-+    {"content_light_level",         .default_val.i64 = AV_PKT_DATA_CONTENT_LIGHT_LEVEL,         .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-+    {"icc_profile",                 .default_val.i64 = AV_PKT_DATA_ICC_PROFILE,                 .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
- {NULL},
- };
- 
- #undef A
- #undef V
- #undef S
- #undef E
- #undef D
-diff --git a/media/ffvpx/libavcodec/avpacket.c b/media/ffvpx/libavcodec/packet.c
-rename from media/ffvpx/libavcodec/avpacket.c
-rename to media/ffvpx/libavcodec/packet.c
---- a/media/ffvpx/libavcodec/avpacket.c
-+++ b/media/ffvpx/libavcodec/packet.c
-@@ -296,16 +296,17 @@ const char *av_packet_side_data_name(enu
-     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_PRFT:                       return "Producer Reference Time";
-     case AV_PKT_DATA_ICC_PROFILE:                return "ICC Profile";
-     case AV_PKT_DATA_DOVI_CONF:                  return "DOVI configuration record";
-     case AV_PKT_DATA_S12M_TIMECODE:              return "SMPTE ST 12-1:2014 timecode";
-     case AV_PKT_DATA_DYNAMIC_HDR10_PLUS:         return "HDR10+ Dynamic Metadata (SMPTE 2094-40)";
-+    case AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT:return "Ambient viewing environment";
-     case AV_PKT_DATA_IAMF_MIX_GAIN_PARAM:        return "IAMF Mix Gain Parameter Data";
-     case AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM:   return "IAMF Demixing Info Parameter Data";
-     case AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM: return "IAMF Recon Gain Info Parameter Data";
-     }
-     return NULL;
- }
- 
- uint8_t *av_packet_pack_dictionary(AVDictionary *dict, size_t *size)
-diff --git a/media/ffvpx/libavcodec/packet.h b/media/ffvpx/libavcodec/packet.h
---- a/media/ffvpx/libavcodec/packet.h
-+++ b/media/ffvpx/libavcodec/packet.h
-@@ -319,27 +319,36 @@ enum AVPacketSideDataType {
-      * IAMF Recon Gain Info Parameter Data associated with the audio frame. This
-      * metadata is in the form of the AVIAMFParamDefinition struct and contains
-      * information defined in sections 3.6.1 and 3.8.3 of the Immersive Audio Model
-      * and Formats standard.
-      */
-     AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM,
- 
-     /**
-+     * Ambient viewing environment metadata, as defined by H.274. This metadata
-+     * should be associated with a video stream and contains data in the form
-+     * of the AVAmbientViewingEnvironment struct.
-+    */
-+    AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT,
-+
-+    /**
-      * 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
- };
- 
-+#if FF_API_QUALITY_FACTOR
- #define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
-+#endif
- 
- /**
-  * This structure stores auxiliary information for decoding, presenting, or
-  * otherwise processing the coded stream. It is typically exported by demuxers
-  * and encoders and can be fed to decoders and muxers either in a per packet
-  * basis, or as global side data (applying to the entire coded stream).
-  *
-  * Global side data is handled as follows:
-@@ -584,23 +593,16 @@ typedef struct AVPacketList {
- #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 {
--#if FF_API_OLD_CHANNEL_LAYOUT
--    /**
--     * @deprecated those are not used by any decoder
--     */
--    AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT  = 0x0001,
--    AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002,
--#endif
-     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().
-  *
-diff --git a/media/ffvpx/libavcodec/parser.c b/media/ffvpx/libavcodec/parser.c
---- a/media/ffvpx/libavcodec/parser.c
-+++ b/media/ffvpx/libavcodec/parser.c
-@@ -247,16 +247,17 @@ int ff_combine_frame(ParseContext *pc, i
- 
-     /* append to buffer */
-     if (pc->index) {
-         void *new_buffer = av_fast_realloc(pc->buffer, &pc->buffer_size,
-                                            next + pc->index +
-                                            AV_INPUT_BUFFER_PADDING_SIZE);
-         if (!new_buffer) {
-             av_log(NULL, AV_LOG_ERROR, "Failed to reallocate parser buffer to %d\n", next + pc->index + AV_INPUT_BUFFER_PADDING_SIZE);
-+            *buf_size =
-             pc->overread_index =
-             pc->index = 0;
-             return AVERROR(ENOMEM);
-         }
-         pc->buffer = new_buffer;
-         if (next > -AV_INPUT_BUFFER_PADDING_SIZE)
-             memcpy(&pc->buffer[pc->index], *buf,
-                    next + AV_INPUT_BUFFER_PADDING_SIZE);
-diff --git a/media/ffvpx/libavcodec/pcm.c b/media/ffvpx/libavcodec/pcm.c
---- a/media/ffvpx/libavcodec/pcm.c
-+++ b/media/ffvpx/libavcodec/pcm.c
-@@ -23,16 +23,17 @@
-  * @file
-  * PCM codecs
-  */
- 
- #include "config.h"
- #include "config_components.h"
- #include "libavutil/attributes.h"
- #include "libavutil/float_dsp.h"
-+#include "libavutil/mem.h"
- #include "libavutil/reverse.h"
- #include "libavutil/thread.h"
- #include "avcodec.h"
- #include "bytestream.h"
- #include "codec_internal.h"
- #include "decode.h"
- #include "encode.h"
- #include "pcm_tablegen.h"
-diff --git a/media/ffvpx/libavcodec/pixblockdsp.h b/media/ffvpx/libavcodec/pixblockdsp.h
---- a/media/ffvpx/libavcodec/pixblockdsp.h
-+++ b/media/ffvpx/libavcodec/pixblockdsp.h
-@@ -16,32 +16,30 @@
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-  */
- 
- #ifndef AVCODEC_PIXBLOCKDSP_H
- #define AVCODEC_PIXBLOCKDSP_H
- 
- #include <stdint.h>
- 
--#include "config.h"
--
- #include "avcodec.h"
- 
- typedef struct PixblockDSPContext {
--    void (*get_pixels)(int16_t *av_restrict block /* align 16 */,
-+    void (*get_pixels)(int16_t *restrict block /* align 16 */,
-                        const uint8_t *pixels /* align 8 */,
-                        ptrdiff_t stride);
--    void (*get_pixels_unaligned)(int16_t *av_restrict block /* align 16 */,
-+    void (*get_pixels_unaligned)(int16_t *restrict block /* align 16 */,
-                        const uint8_t *pixels,
-                        ptrdiff_t stride);
--    void (*diff_pixels)(int16_t *av_restrict block /* align 16 */,
-+    void (*diff_pixels)(int16_t *restrict block /* align 16 */,
-                         const uint8_t *s1 /* align 8 */,
-                         const uint8_t *s2 /* align 8 */,
-                         ptrdiff_t stride);
--    void (*diff_pixels_unaligned)(int16_t *av_restrict block /* align 16 */,
-+    void (*diff_pixels_unaligned)(int16_t *restrict block /* align 16 */,
-                         const uint8_t *s1,
-                         const uint8_t *s2,
-                         ptrdiff_t stride);
- 
- } PixblockDSPContext;
- 
- void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx);
- void ff_pixblockdsp_init_aarch64(PixblockDSPContext *c, AVCodecContext *avctx,
-diff --git a/media/ffvpx/libavcodec/profiles.c b/media/ffvpx/libavcodec/profiles.c
---- a/media/ffvpx/libavcodec/profiles.c
-+++ b/media/ffvpx/libavcodec/profiles.c
-@@ -13,17 +13,18 @@
-  *
-  * 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 "avcodec.h"
-+#include "codec.h"
-+#include "defs.h"
- #include "profiles.h"
- 
- #if !CONFIG_SMALL
- 
- const AVProfile ff_aac_profiles[] = {
-     { AV_PROFILE_AAC_LOW,   "LC"       },
-     { AV_PROFILE_AAC_HE,    "HE-AAC"   },
-     { AV_PROFILE_AAC_HE_V2, "HE-AACv2" },
-diff --git a/media/ffvpx/libavcodec/profiles.h b/media/ffvpx/libavcodec/profiles.h
---- a/media/ffvpx/libavcodec/profiles.h
-+++ b/media/ffvpx/libavcodec/profiles.h
-@@ -14,21 +14,22 @@
-  * 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_PROFILES_H
- #define AVCODEC_PROFILES_H
- 
--#include "avcodec.h"
-+#include "codec.h"
-+#include "defs.h"
- #include "libavutil/opt.h"
- 
- #define FF_AVCTX_PROFILE_OPTION(name, description, type, value) \
--    {name, description, 0, AV_OPT_TYPE_CONST, {.i64 = value }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_## type ##_PARAM, "avctx.profile"},
-+    {name, description, 0, AV_OPT_TYPE_CONST, {.i64 = value }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_## type ##_PARAM, .unit = "avctx.profile"},
- 
- #define FF_AAC_PROFILE_OPTS \
-     FF_AVCTX_PROFILE_OPTION("aac_main",      NULL, AUDIO, AV_PROFILE_AAC_MAIN)\
-     FF_AVCTX_PROFILE_OPTION("aac_low",       NULL, AUDIO, AV_PROFILE_AAC_LOW)\
-     FF_AVCTX_PROFILE_OPTION("aac_ssr",       NULL, AUDIO, AV_PROFILE_AAC_SSR)\
-     FF_AVCTX_PROFILE_OPTION("aac_ltp",       NULL, AUDIO, AV_PROFILE_AAC_LTP)\
-     FF_AVCTX_PROFILE_OPTION("aac_he",        NULL, AUDIO, AV_PROFILE_AAC_HE)\
-     FF_AVCTX_PROFILE_OPTION("aac_he_v2",     NULL, AUDIO, AV_PROFILE_AAC_HE_V2)\
-diff --git a/media/ffvpx/libavcodec/pthread_frame.c b/media/ffvpx/libavcodec/pthread_frame.c
---- a/media/ffvpx/libavcodec/pthread_frame.c
-+++ b/media/ffvpx/libavcodec/pthread_frame.c
-@@ -306,22 +306,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
- 
-         dst->color_trc   = src->color_trc;
-         dst->colorspace  = src->colorspace;
-         dst->color_range = src->color_range;
-         dst->chroma_sample_location = src->chroma_sample_location;
- 
-         dst->sample_rate    = src->sample_rate;
-         dst->sample_fmt     = src->sample_fmt;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--        dst->channels       = src->channels;
--        dst->channel_layout = src->channel_layout;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-         err = av_channel_layout_copy(&dst->ch_layout, &src->ch_layout);
-         if (err < 0)
-             return err;
- 
-         if (!!dst->hw_frames_ctx != !!src->hw_frames_ctx ||
-             (dst->hw_frames_ctx && dst->hw_frames_ctx->data != src->hw_frames_ctx->data)) {
-             av_buffer_unref(&dst->hw_frames_ctx);
- 
-@@ -413,26 +407,16 @@ static int update_context_from_user(AVCo
-     dst->flags2      = src->flags2;
-     dst->export_side_data = src->export_side_data;
- 
-     dst->skip_loop_filter = src->skip_loop_filter;
-     dst->skip_idct        = src->skip_idct;
-     dst->skip_frame       = src->skip_frame;
- 
-     dst->frame_num        = src->frame_num;
--#if FF_API_AVCTX_FRAME_NUMBER
--FF_DISABLE_DEPRECATION_WARNINGS
--    dst->frame_number     = src->frame_number;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--#if FF_API_REORDERED_OPAQUE
--FF_DISABLE_DEPRECATION_WARNINGS
--    dst->reordered_opaque = src->reordered_opaque;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
- 
-     av_packet_unref(dst->internal->last_pkt_props);
-     err = av_packet_copy_props(dst->internal->last_pkt_props, src->internal->last_pkt_props);
-     if (err < 0)
-         return err;
- 
-     return 0;
- }
-@@ -756,17 +740,17 @@ void ff_frame_thread_free(AVCodecContext
- 
-         av_freep(&p->avctx);
-     }
- 
-     av_freep(&fctx->threads);
-     ff_pthread_free(fctx, thread_ctx_offsets);
- 
-     /* if we have stashed hwaccel state, move it to the user-facing context,
--     * so it will be freed in avcodec_close() */
-+     * so it will be freed in ff_codec_close() */
-     av_assert0(!avctx->hwaccel);
-     FFSWAP(const AVHWAccel*, avctx->hwaccel,                     fctx->stash_hwaccel);
-     FFSWAP(void*,            avctx->hwaccel_context,             fctx->stash_hwaccel_context);
-     FFSWAP(void*,            avctx->internal->hwaccel_priv_data, fctx->stash_hwaccel_priv);
- 
-     av_freep(&avctx->internal->thread_ctx);
- }
- 
-diff --git a/media/ffvpx/libavcodec/ratecontrol.h b/media/ffvpx/libavcodec/ratecontrol.h
---- a/media/ffvpx/libavcodec/ratecontrol.h
-+++ b/media/ffvpx/libavcodec/ratecontrol.h
-@@ -23,19 +23,17 @@
- #ifndef AVCODEC_RATECONTROL_H
- #define AVCODEC_RATECONTROL_H
- 
- /**
-  * @file
-  * ratecontrol header.
-  */
- 
--#include <stdio.h>
- #include <stdint.h>
--#include "libavutil/eval.h"
- 
- typedef struct Predictor{
-     double coeff;
-     double count;
-     double decay;
- } Predictor;
- 
- typedef struct RateControlEntry{
-@@ -75,17 +73,17 @@ typedef struct RateControlContext{
-     int64_t last_mb_var_sum;
-     uint64_t i_cplx_sum[5];
-     uint64_t p_cplx_sum[5];
-     uint64_t mv_bits_sum[5];
-     uint64_t qscale_sum[5];
-     int frame_count[5];
-     int last_non_b_pict_type;
- 
--    AVExpr * rc_eq_eval;
-+    struct AVExpr *rc_eq_eval;
- }RateControlContext;
- 
- struct MpegEncContext;
- 
- /* rate control */
- int ff_rate_control_init(struct MpegEncContext *s);
- float ff_rate_estimate_qscale(struct MpegEncContext *s, int dry_run);
- void ff_write_pass1_stats(struct MpegEncContext *s);
-diff --git a/media/ffvpx/libavcodec/refstruct.c b/media/ffvpx/libavcodec/refstruct.c
---- a/media/ffvpx/libavcodec/refstruct.c
-+++ b/media/ffvpx/libavcodec/refstruct.c
-@@ -15,23 +15,23 @@
-  * License along with FFmpeg; if not, write to the Free Software
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-  */
- 
- #include <stdatomic.h>
- #include <stdint.h>
- #include <string.h>
- 
--#include "internal.h"
- #include "refstruct.h"
- 
- #include "libavutil/avassert.h"
- #include "libavutil/error.h"
- #include "libavutil/macros.h"
- #include "libavutil/mem.h"
-+#include "libavutil/mem_internal.h"
- #include "libavutil/thread.h"
- 
- #ifndef REFSTRUCT_CHECKED
- #ifndef ASSERT_LEVEL
- #define ASSERT_LEVEL 0
- #endif
- #define REFSTRUCT_CHECKED (ASSERT_LEVEL >= 1)
- #endif
-@@ -40,20 +40,20 @@
- #define ff_assert(cond) av_assert0(cond)
- #else
- #define ff_assert(cond) ((void)0)
- #endif
- 
- #define REFSTRUCT_COOKIE AV_NE((uint64_t)MKBETAG('R', 'e', 'f', 'S') << 32 | MKBETAG('t', 'r', 'u', 'c'), \
-                                MKTAG('R', 'e', 'f', 'S') | (uint64_t)MKTAG('t', 'r', 'u', 'c') << 32)
- 
--#if __STDC_VERSION__ >= 201112L
--#define REFCOUNT_OFFSET FFALIGN(sizeof(RefCount), FFMAX3(STRIDE_ALIGN, 16, _Alignof(max_align_t)))
-+#if __STDC_VERSION__ >= 201112L && !defined(_MSC_VER)
-+#define REFCOUNT_OFFSET FFALIGN(sizeof(RefCount), FFMAX(ALIGN_64, _Alignof(max_align_t)))
- #else
--#define REFCOUNT_OFFSET FFALIGN(sizeof(RefCount), FFMAX(STRIDE_ALIGN, 16))
-+#define REFCOUNT_OFFSET FFALIGN(sizeof(RefCount), ALIGN_64)
- #endif
- 
- typedef struct RefCount {
-     /**
-      * An uintptr_t is big enough to hold the address of every reference,
-      * so no overflow can happen when incrementing the refcount as long as
-      * the user does not throw away references.
-      */
-diff --git a/media/ffvpx/libavcodec/utils.c b/media/ffvpx/libavcodec/utils.c
---- a/media/ffvpx/libavcodec/utils.c
-+++ b/media/ffvpx/libavcodec/utils.c
-@@ -357,27 +357,16 @@ void avcodec_align_dimensions(AVCodecCon
- 
-     avcodec_align_dimensions2(s, width, height, linesize_align);
-     align               = FFMAX(linesize_align[0], linesize_align[3]);
-     linesize_align[1] <<= chroma_shift;
-     linesize_align[2] <<= chroma_shift;
-     align               = FFMAX3(align, linesize_align[1], linesize_align[2]);
-     *width              = FFALIGN(*width, align);
- }
--#if FF_API_AVCODEC_CHROMA_POS
--int avcodec_enum_to_chroma_pos(int *xpos, int *ypos, enum AVChromaLocation pos)
--{
--    return av_chroma_location_enum_to_pos(xpos, ypos, pos);
--}
--
--enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos)
--{
--    return av_chroma_location_pos_to_enum(xpos, ypos);
--}
--#endif
- 
- int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
-                              enum AVSampleFormat sample_fmt, const uint8_t *buf,
-                              int buf_size, int align)
- {
-     int ch, planar, needed_size, ret = 0;
- 
-     needed_size = av_samples_get_buffer_size(NULL, nb_channels,
-@@ -790,40 +779,30 @@ static int get_audio_frame_duration(enum
- 
-     return 0;
- }
- 
- int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
- {
-    int channels = avctx->ch_layout.nb_channels;
-    int duration;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    if (!channels)
--        channels = avctx->channels;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-+
-     duration = get_audio_frame_duration(avctx->codec_id, avctx->sample_rate,
-                                     channels, avctx->block_align,
-                                     avctx->codec_tag, avctx->bits_per_coded_sample,
-                                     avctx->bit_rate, avctx->extradata, avctx->frame_size,
-                                     frame_bytes);
-     return FFMAX(0, duration);
- }
- 
- int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes)
- {
-    int channels = par->ch_layout.nb_channels;
-    int duration;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    if (!channels)
--        channels = par->channels;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-+
-     duration = get_audio_frame_duration(par->codec_id, par->sample_rate,
-                                     channels, par->block_align,
-                                     par->codec_tag, par->bits_per_coded_sample,
-                                     par->bit_rate, par->extradata, par->frame_size,
-                                     frame_bytes);
-     return FFMAX(0, duration);
- }
- 
-@@ -955,19 +934,19 @@ void ff_thread_await_progress2(AVCodecCo
- }
- 
- void ff_thread_report_progress2(AVCodecContext *avctx, int field, int thread, int n)
- {
- }
- 
- #endif
- 
--const uint8_t *avpriv_find_start_code(const uint8_t *av_restrict p,
-+const uint8_t *avpriv_find_start_code(const uint8_t *restrict p,
-                                       const uint8_t *end,
--                                      uint32_t *av_restrict state)
-+                                      uint32_t *restrict state)
- {
-     int i;
- 
-     av_assert0(p <= end);
-     if (p >= end)
-         return end;
- 
-     for (i = 0; i < 3; i++) {
-diff --git a/media/ffvpx/libavcodec/vaapi.h b/media/ffvpx/libavcodec/vaapi.h
-deleted file mode 100644
---- a/media/ffvpx/libavcodec/vaapi.h
-+++ /dev/null
-@@ -1,86 +0,0 @@
--/*
-- * Video Acceleration API (shared data between FFmpeg and the video player)
-- * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1
-- *
-- * Copyright (C) 2008-2009 Splitted-Desktop Systems
-- *
-- * 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_VAAPI_H
--#define AVCODEC_VAAPI_H
--
--/**
-- * @file
-- * @ingroup lavc_codec_hwaccel_vaapi
-- * Public libavcodec VA API header.
-- */
--
--#include <stdint.h>
--#include "libavutil/attributes.h"
--#include "version.h"
--
--#if FF_API_STRUCT_VAAPI_CONTEXT
--
--/**
-- * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding
-- * @ingroup lavc_codec_hwaccel
-- * @{
-- */
--
--/**
-- * This structure is used to share data between the FFmpeg library and
-- * the client video application.
-- * This shall be zero-allocated and available as
-- * AVCodecContext.hwaccel_context. All user members can be set once
-- * during initialization or through each AVCodecContext.get_buffer()
-- * function call. In any case, they must be valid prior to calling
-- * decoding functions.
-- *
-- * Deprecated: use AVCodecContext.hw_frames_ctx instead.
-- */
--struct attribute_deprecated vaapi_context {
--    /**
--     * Window system dependent data
--     *
--     * - encoding: unused
--     * - decoding: Set by user
--     */
--    void *display;
--
--    /**
--     * Configuration ID
--     *
--     * - encoding: unused
--     * - decoding: Set by user
--     */
--    uint32_t config_id;
--
--    /**
--     * Context ID (video decode pipeline)
--     *
--     * - encoding: unused
--     * - decoding: Set by user
--     */
--    uint32_t context_id;
--};
--
--/* @} */
--
--#endif /* FF_API_STRUCT_VAAPI_CONTEXT */
--
--#endif /* AVCODEC_VAAPI_H */
-diff --git a/media/ffvpx/libavcodec/vaapi_decode.c b/media/ffvpx/libavcodec/vaapi_decode.c
---- a/media/ffvpx/libavcodec/vaapi_decode.c
-+++ b/media/ffvpx/libavcodec/vaapi_decode.c
-@@ -15,16 +15,17 @@
-  * 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_components.h"
- 
- #include "libavutil/avassert.h"
- #include "libavutil/common.h"
-+#include "libavutil/mem.h"
- #include "libavutil/pixdesc.h"
- 
- #include "avcodec.h"
- #include "codec_desc.h"
- #include "decode.h"
- #include "internal.h"
- #include "vaapi_decode.h"
- #include "vaapi_hevc.h"
-@@ -67,27 +68,24 @@ int ff_vaapi_decode_make_slice_buffer(AV
-                                       size_t slice_size)
- {
-     VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data;
-     VAStatus vas;
-     int index;
- 
-     av_assert0(pic->nb_slices <= pic->slices_allocated);
-     if (pic->nb_slices == pic->slices_allocated) {
--        if (pic->slices_allocated > 0)
--            pic->slices_allocated *= 2;
--        else
--            pic->slices_allocated = 64;
--
-         pic->slice_buffers =
-             av_realloc_array(pic->slice_buffers,
--                             pic->slices_allocated,
-+                             pic->slices_allocated ? pic->slices_allocated * 2 : 64,
-                              2 * sizeof(*pic->slice_buffers));
-         if (!pic->slice_buffers)
-             return AVERROR(ENOMEM);
-+
-+        pic->slices_allocated = pic->slices_allocated ? pic->slices_allocated * 2 : 64;
-     }
-     av_assert0(pic->nb_slices + 1 <= pic->slices_allocated);
- 
-     index = 2 * pic->nb_slices;
- 
-     vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context,
-                          VASliceParameterBufferType,
-                          params_size, 1, (void*)params_data,
-diff --git a/media/ffvpx/libavcodec/version.c b/media/ffvpx/libavcodec/version.c
---- a/media/ffvpx/libavcodec/version.c
-+++ b/media/ffvpx/libavcodec/version.c
-@@ -13,32 +13,38 @@
-  * 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 <assert.h>
-+
- #include "config.h"
- 
--#include "libavutil/avassert.h"
- #include "avcodec.h"
- #include "codec_id.h"
- #include "version.h"
- 
- #include "libavutil/ffversion.h"
- const char av_codec_ffversion[] = "FFmpeg version " FFMPEG_VERSION;
- 
- unsigned avcodec_version(void)
- {
--    av_assert0(AV_CODEC_ID_PCM_S8_PLANAR==65563);
--    av_assert0(AV_CODEC_ID_ADPCM_G722==69660);
--    av_assert0(AV_CODEC_ID_SRT==94216);
--    av_assert0(LIBAVCODEC_VERSION_MICRO >= 100);
-+    static_assert(AV_CODEC_ID_LEAD         ==   269 &&
-+                  AV_CODEC_ID_PCM_SGA      == 65572 &&
-+                  AV_CODEC_ID_ADPCM_XMD    == 69683 &&
-+                  AV_CODEC_ID_CBD2_DPCM    == 81928 &&
-+                  AV_CODEC_ID_QOA          == 86121 &&
-+                  AV_CODEC_ID_ARIB_CAPTION == 94233 &&
-+                  AV_CODEC_ID_SMPTE_2038   == 98315,
-+                  "Don't insert new codec ids in the middle of a list");
-+    static_assert(LIBAVCODEC_VERSION_MICRO >= 100, "micro version starts at 100");
- 
-     return LIBAVCODEC_VERSION_INT;
- }
- 
- const char *avcodec_configuration(void)
- {
-     return FFMPEG_CONFIGURATION;
- }
-diff --git a/media/ffvpx/libavcodec/version.h b/media/ffvpx/libavcodec/version.h
---- a/media/ffvpx/libavcodec/version.h
-+++ b/media/ffvpx/libavcodec/version.h
-@@ -24,18 +24,18 @@
-  * @ingroup libavc
-  * Libavcodec version macros.
-  */
- 
- #include "libavutil/version.h"
- 
- #include "version_major.h"
- 
--#define LIBAVCODEC_VERSION_MINOR  38
--#define LIBAVCODEC_VERSION_MICRO 100
-+#define LIBAVCODEC_VERSION_MINOR   5
-+#define LIBAVCODEC_VERSION_MICRO 101
- 
- #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
-                                                LIBAVCODEC_VERSION_MINOR, \
-                                                LIBAVCODEC_VERSION_MICRO)
- #define LIBAVCODEC_VERSION      AV_VERSION(LIBAVCODEC_VERSION_MAJOR,    \
-                                            LIBAVCODEC_VERSION_MINOR,    \
-                                            LIBAVCODEC_VERSION_MICRO)
- #define LIBAVCODEC_BUILD        LIBAVCODEC_VERSION_INT
-diff --git a/media/ffvpx/libavcodec/version_major.h b/media/ffvpx/libavcodec/version_major.h
---- a/media/ffvpx/libavcodec/version_major.h
-+++ b/media/ffvpx/libavcodec/version_major.h
-@@ -20,40 +20,33 @@
- #define AVCODEC_VERSION_MAJOR_H
- 
- /**
-  * @file
-  * @ingroup libavc
-  * Libavcodec version macros.
-  */
- 
--#define LIBAVCODEC_VERSION_MAJOR  60
-+#define LIBAVCODEC_VERSION_MAJOR  61
- 
- /**
-  * FF_API_* defines may be placed below to indicate public API that will be
-  * dropped at a future version bump. The defines themselves are not part of
-  * the public API and may change, break or disappear at any time.
-  *
-  * @note, when bumping the major version it is recommended to manually
-  * disable each FF_API_* in its own commit instead of disabling them all
-  * at once through the bump. This improves the git bisect-ability of the change.
-  */
- 
--#define FF_API_INIT_PACKET         (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_IDCT_NONE           (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_SVTAV1_OPTS         (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_AYUV_CODECID        (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_VT_OUTPUT_CALLBACK  (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_AVCODEC_CHROMA_POS  (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_VT_HWACCEL_CONTEXT  (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_AVCTX_FRAME_NUMBER  (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_SLICE_OFFSET        (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_SUBFRAMES           (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_TICKS_PER_FRAME     (LIBAVCODEC_VERSION_MAJOR < 61)
--#define FF_API_DROPCHANGED         (LIBAVCODEC_VERSION_MAJOR < 61)
-+#define FF_API_INIT_PACKET         (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_SUBFRAMES           (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_TICKS_PER_FRAME     (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_DROPCHANGED         (LIBAVCODEC_VERSION_MAJOR < 62)
- 
- #define FF_API_AVFFT               (LIBAVCODEC_VERSION_MAJOR < 62)
- #define FF_API_FF_PROFILE_LEVEL    (LIBAVCODEC_VERSION_MAJOR < 62)
--
--// reminder to remove CrystalHD decoders on next major bump
--#define FF_CODEC_CRYSTAL_HD        (LIBAVCODEC_VERSION_MAJOR < 61)
-+#define FF_API_AVCODEC_CLOSE       (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_BUFFER_MIN_SIZE     (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_VDPAU_ALLOC_GET_SET (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_QUALITY_FACTOR      (LIBAVCODEC_VERSION_MAJOR < 62)
- 
- #endif /* AVCODEC_VERSION_MAJOR_H */
-diff --git a/media/ffvpx/libavcodec/vlc.c b/media/ffvpx/libavcodec/vlc.c
---- a/media/ffvpx/libavcodec/vlc.c
-+++ b/media/ffvpx/libavcodec/vlc.c
-@@ -435,18 +435,18 @@ static void add_level(VLC_MULTI_ELEM *ta
-             uint32_t code;
- 
-             sym = buf[t].symbol;
-             if (l >= curlimit)
-                 return;
-             code = curcode + (buf[t].code >> curlen);
-             newlimit = curlimit - l;
-             l  += curlen;
--            if (is16bit) AV_WN16(info.val+2*curlevel, sym);
--            else info.val[curlevel] = sym&0xFF;
-+            if (is16bit) info.val16[curlevel] = sym;
-+            else info.val8[curlevel] = sym&0xFF;
- 
-             if (curlevel) { // let's not add single entries
-                 uint32_t val = code >> (32 - numbits);
-                 uint32_t  nb = val + (1U << (numbits - l));
-                 info.len = l;
-                 info.num = curlevel+1;
-                 for (; val < nb; val++)
-                     AV_COPY64(table+val, &info);
-@@ -463,17 +463,17 @@ static void add_level(VLC_MULTI_ELEM *ta
- }
- 
- static int vlc_multi_gen(VLC_MULTI_ELEM *table, const VLC *single,
-                          const int is16bit, const int nb_codes, const int numbits,
-                          VLCcode *buf, void *logctx)
- {
-     int minbits, maxbits, max;
-     unsigned count[VLC_MULTI_MAX_SYMBOLS-1] = { 0, };
--    VLC_MULTI_ELEM info = { { 0, }, 0, 0, };
-+    VLC_MULTI_ELEM info = { 0 };
-     int count0 = 0;
- 
-     for (int j = 0; j < 1<<numbits; j++) {
-         if (single->table[j].len > 0) {
-             count0 ++;
-             j += (1 << (numbits - single->table[j].len)) - 1;
-         }
-     }
-@@ -494,17 +494,20 @@ static int vlc_multi_gen(VLC_MULTI_ELEM 
-         // If we have not a single useable vlc we end with max = nb_codes
-         if (buf[max - 1].bits+minbits > numbits)
-             break;
-     }
- 
-     for (int j = 0; j < 1<<numbits; j++) {
-         table[j].len = single->table[j].len;
-         table[j].num = single->table[j].len > 0 ? 1 : 0;
--        AV_WN16(table[j].val, single->table[j].sym);
-+        if (is16bit)
-+            table[j].val16[0] = single->table[j].sym;
-+        else
-+            table[j].val8[0]  = single->table[j].sym;
-     }
- 
-     add_level(table, is16bit, nb_codes, numbits, buf,
-               0, 0, FFMIN(maxbits, numbits), 0, minbits, max, count, info);
- 
-     av_log(logctx, AV_LOG_DEBUG, "Joint: %d/%d/%d/%d/%d codes min=%ubits max=%u\n",
-            count[0], count[1], count[2], count[3], count[4], minbits, max);
- 
-diff --git a/media/ffvpx/libavcodec/vlc.h b/media/ffvpx/libavcodec/vlc.h
---- a/media/ffvpx/libavcodec/vlc.h
-+++ b/media/ffvpx/libavcodec/vlc.h
-@@ -35,17 +35,20 @@ typedef struct VLCElem {
- 
- typedef struct VLC {
-     int bits;
-     VLCElem *table;
-     int table_size, table_allocated;
- } VLC;
- 
- typedef struct VLC_MULTI_ELEM {
--    uint8_t val[VLC_MULTI_MAX_SYMBOLS];
-+    union {
-+        uint8_t   val8[VLC_MULTI_MAX_SYMBOLS];
-+        uint16_t val16[VLC_MULTI_MAX_SYMBOLS / 2];
-+    };
-     int8_t len; // -31,32
-     uint8_t num;
- } VLC_MULTI_ELEM;
- 
- typedef struct VLC_MULTI {
-     VLC_MULTI_ELEM *table;
-     int table_size, table_allocated;
- } VLC_MULTI;
-@@ -180,57 +183,16 @@ void ff_vlc_free(VLC *vlc);
- #define VLC_INIT_STATIC_OVERLONG (2 | VLC_INIT_USE_STATIC)
- /* If VLC_INIT_INPUT_LE is set, the LSB bit of the codes used to
-  * initialize the VLC table is the first bit to be read. */
- #define VLC_INIT_INPUT_LE       4
- /* If set the VLC is intended for a little endian bitstream reader. */
- #define VLC_INIT_OUTPUT_LE      8
- #define VLC_INIT_LE             (VLC_INIT_INPUT_LE | VLC_INIT_OUTPUT_LE)
- 
--#define VLC_INIT_CUSTOM_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g,      \
--                                      h, i, j, flags, static_size)         \
--    do {                                                                   \
--        static VLCElem table[static_size];                                 \
--        (vlc)->table           = table;                                    \
--        (vlc)->table_allocated = static_size;                              \
--        ff_vlc_init_sparse(vlc, bits, a, b, c, d, e, f, g, h, i, j,        \
--                           flags | VLC_INIT_USE_STATIC);                   \
--    } while (0)
--
--#define VLC_INIT_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, h, i, j, static_size) \
--    VLC_INIT_CUSTOM_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g,          \
--                                  h, i, j, 0, static_size)
--
--#define VLC_INIT_LE_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, h, i, j, static_size) \
--    VLC_INIT_CUSTOM_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g,          \
--                                  h, i, j, VLC_INIT_LE, static_size)
--
--#define VLC_INIT_CUSTOM_STATIC(vlc, bits, a, b, c, d, e, f, g, flags, static_size) \
--    VLC_INIT_CUSTOM_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g,          \
--                                  NULL, 0, 0, flags, static_size)
--
--#define VLC_INIT_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)       \
--    VLC_INIT_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, NULL, 0, 0, static_size)
--
--#define VLC_INIT_LE_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size) \
--    VLC_INIT_LE_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, NULL, 0, 0, static_size)
--
--#define VLC_INIT_STATIC_FROM_LENGTHS(vlc, bits, nb_codes, lens, len_wrap,  \
--                                     symbols, symbols_wrap, symbols_size,  \
--                                     offset, flags, static_size)           \
--    do {                                                                   \
--        static VLCElem table[static_size];                                 \
--        (vlc)->table           = table;                                    \
--        (vlc)->table_allocated = static_size;                              \
--        ff_vlc_init_from_lengths(vlc, bits, nb_codes, lens, len_wrap,      \
--                                 symbols, symbols_wrap, symbols_size,      \
--                                 offset, flags | VLC_INIT_USE_STATIC,      \
--                                 NULL);                                    \
--    } while (0)
--
- /**
-  * For static VLCs, the number of bits can often be hardcoded
-  * at each get_vlc2() callsite. Then using a full VLC would be uneconomical,
-  * because only VLC.table would ever be accessed after initialization.
-  * The following functions provide wrappers around the relevant ff_vlc_init_*
-  * functions suitable for said task.
-  *
-  * The ff_vlc_init_tables_* functions are intended to be used for initializing
-diff --git a/media/ffvpx/libavcodec/vorbis_data.c b/media/ffvpx/libavcodec/vorbis_data.c
---- a/media/ffvpx/libavcodec/vorbis_data.c
-+++ b/media/ffvpx/libavcodec/vorbis_data.c
-@@ -29,30 +29,16 @@ const uint8_t ff_vorbis_channel_layout_o
-     { 0, 2, 1 },
-     { 0, 1, 2, 3 },
-     { 0, 2, 1, 3, 4 },
-     { 0, 2, 1, 5, 3, 4 },
-     { 0, 2, 1, 6, 5, 3, 4 },
-     { 0, 2, 1, 7, 5, 6, 3, 4 },
- };
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--const uint64_t ff_vorbis_channel_layouts[9] = {
--    AV_CH_LAYOUT_MONO,
--    AV_CH_LAYOUT_STEREO,
--    AV_CH_LAYOUT_SURROUND,
--    AV_CH_LAYOUT_QUAD,
--    AV_CH_LAYOUT_5POINT0_BACK,
--    AV_CH_LAYOUT_5POINT1_BACK,
--    AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER,
--    AV_CH_LAYOUT_7POINT1,
--    0
--};
--#endif
--
- const AVChannelLayout ff_vorbis_ch_layouts[9] = {
-     AV_CHANNEL_LAYOUT_MONO,
-     AV_CHANNEL_LAYOUT_STEREO,
-     AV_CHANNEL_LAYOUT_SURROUND,
-     AV_CHANNEL_LAYOUT_QUAD,
-     AV_CHANNEL_LAYOUT_5POINT0_BACK,
-     AV_CHANNEL_LAYOUT_5POINT1_BACK,
-     {
-diff --git a/media/ffvpx/libavcodec/vorbis_data.h b/media/ffvpx/libavcodec/vorbis_data.h
---- a/media/ffvpx/libavcodec/vorbis_data.h
-+++ b/media/ffvpx/libavcodec/vorbis_data.h
-@@ -16,19 +16,19 @@
-  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-  */
- 
- #ifndef AVCODEC_VORBIS_DATA_H
- #define AVCODEC_VORBIS_DATA_H
- 
- #include <stdint.h>
- 
-+#include "libavutil/attributes_internal.h"
- #include "libavutil/channel_layout.h"
- 
-+FF_VISIBILITY_PUSH_HIDDEN
- extern const float ff_vorbis_floor1_inverse_db_table[256];
- extern const float * const ff_vorbis_vwin[8];
- extern const uint8_t ff_vorbis_channel_layout_offsets[8][8];
--#if FF_API_OLD_CHANNEL_LAYOUT
--extern const uint64_t ff_vorbis_channel_layouts[9];
--#endif
- extern const AVChannelLayout ff_vorbis_ch_layouts[9];
-+FF_VISIBILITY_POP_HIDDEN
- 
- #endif /* AVCODEC_VORBIS_DATA_H */
-diff --git a/media/ffvpx/libavcodec/vorbis_parser.c b/media/ffvpx/libavcodec/vorbis_parser.c
---- a/media/ffvpx/libavcodec/vorbis_parser.c
-+++ b/media/ffvpx/libavcodec/vorbis_parser.c
-@@ -23,19 +23,19 @@
-  * Vorbis audio parser
-  *
-  * Determines the duration for each packet.
-  */
- 
- #include "config_components.h"
- 
- #include "libavutil/log.h"
-+#include "libavutil/mem.h"
- 
- #include "get_bits.h"
--#include "parser.h"
- #include "xiph.h"
- #include "vorbis_parser_internal.h"
- 
- static const AVClass vorbis_parser_class = {
-     .class_name = "Vorbis parser",
-     .item_name  = av_default_item_name,
-     .version    = LIBAVUTIL_VERSION_INT,
- };
-diff --git a/media/ffvpx/libavcodec/vp8.c b/media/ffvpx/libavcodec/vp8.c
---- a/media/ffvpx/libavcodec/vp8.c
-+++ b/media/ffvpx/libavcodec/vp8.c
-@@ -21,16 +21,17 @@
-  *
-  * 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_components.h"
- 
-+#include "libavutil/mem.h"
- #include "libavutil/mem_internal.h"
- 
- #include "avcodec.h"
- #include "codec_internal.h"
- #include "decode.h"
- #include "hwaccel_internal.h"
- #include "hwconfig.h"
- #include "mathops.h"
-@@ -2660,17 +2661,21 @@ int vp78_decode_frame(AVCodecContext *av
-     if (is_vp7)
-         ret = vp7_decode_frame_header(s, avpkt->data, avpkt->size);
-     else
-         ret = vp8_decode_frame_header(s, avpkt->data, avpkt->size);
- 
-     if (ret < 0)
-         goto err;
- 
--    if (s->actually_webp) {
-+    if (!is_vp7 && s->actually_webp) {
-+        // VP8 in WebP is supposed to be intra-only. Enforce this here
-+        // to ensure that output is reproducible with frame-threading.
-+        if (!s->keyframe)
-+            return AVERROR_INVALIDDATA;
-         // avctx->pix_fmt already set in caller.
-     } else if (!is_vp7 && s->pix_fmt == AV_PIX_FMT_NONE) {
-         s->pix_fmt = get_pixel_format(s);
-         if (s->pix_fmt < 0) {
-             ret = AVERROR(EINVAL);
-             goto err;
-         }
-         avctx->pix_fmt = s->pix_fmt;
-@@ -2745,17 +2750,17 @@ int vp78_decode_frame(AVCodecContext *av
- 
-     if (s->update_last)
-         s->next_framep[VP8_FRAME_PREVIOUS] = curframe;
-     else
-         s->next_framep[VP8_FRAME_PREVIOUS] = s->framep[VP8_FRAME_PREVIOUS];
- 
-     s->next_framep[VP8_FRAME_CURRENT] = curframe;
- 
--    if (ffcodec(avctx->codec)->update_thread_context)
-+    if (!is_vp7 && !s->actually_webp)
-         ff_thread_finish_setup(avctx);
- 
-     if (avctx->hwaccel) {
-         const FFHWAccel *hwaccel = ffhwaccel(avctx->hwaccel);
-         ret = hwaccel->start_frame(avctx, avpkt->data, avpkt->size);
-         if (ret < 0)
-             goto err;
- 
-@@ -2878,17 +2883,16 @@ static av_cold int vp8_init_frames(VP8Co
- 
- static av_always_inline
- int vp78_decode_init(AVCodecContext *avctx, int is_vp7)
- {
-     VP8Context *s = avctx->priv_data;
-     int ret;
- 
-     s->avctx = avctx;
--    s->vp7   = avctx->codec->id == AV_CODEC_ID_VP7;
-     s->pix_fmt = AV_PIX_FMT_NONE;
-     avctx->pix_fmt = AV_PIX_FMT_YUV420P;
- 
-     ff_videodsp_init(&s->vdsp, 8);
- 
-     ff_vp78dsp_init(&s->vp8dsp);
-     if (CONFIG_VP7_DECODER && is_vp7) {
-         ff_h264_pred_init(&s->hpc, AV_CODEC_ID_VP7, 8, 1);
-diff --git a/media/ffvpx/libavcodec/vp8.h b/media/ffvpx/libavcodec/vp8.h
---- a/media/ffvpx/libavcodec/vp8.h
-+++ b/media/ffvpx/libavcodec/vp8.h
-@@ -326,18 +326,16 @@ typedef struct VP8Context {
-      * 0 -> Only width+height*2+1 macroblocks allocated (frame/single thread).
-      * 1 -> Macroblocks for entire frame allocated (sliced thread).
-      */
-     int mb_layout;
- 
-     int (*decode_mb_row_no_filter)(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr);
-     void (*filter_mb_row)(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr);
- 
--    int vp7;
--
-     /**
-      * Interframe DC prediction (VP7)
-      * [0] VP8_FRAME_PREVIOUS
-      * [1] VP8_FRAME_GOLDEN
-      */
-     uint16_t inter_dc_pred[2][2];
- 
-     /**
-diff --git a/media/ffvpx/libavcodec/vp8dsp.c b/media/ffvpx/libavcodec/vp8dsp.c
---- a/media/ffvpx/libavcodec/vp8dsp.c
-+++ b/media/ffvpx/libavcodec/vp8dsp.c
-@@ -737,16 +737,18 @@ av_cold void ff_vp8dsp_init(VP8DSPContex
- 
-     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);
- #elif ARCH_ARM
-     ff_vp8dsp_init_arm(dsp);
-+#elif ARCH_RISCV
-+    ff_vp8dsp_init_riscv(dsp);
- #elif ARCH_X86
-     ff_vp8dsp_init_x86(dsp);
- #elif ARCH_MIPS
-     ff_vp8dsp_init_mips(dsp);
- #elif ARCH_LOONGARCH
-     ff_vp8dsp_init_loongarch(dsp);
- #endif
- }
-diff --git a/media/ffvpx/libavcodec/vp8dsp.h b/media/ffvpx/libavcodec/vp8dsp.h
---- a/media/ffvpx/libavcodec/vp8dsp.h
-+++ b/media/ffvpx/libavcodec/vp8dsp.h
-@@ -87,16 +87,17 @@ 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_riscv(VP8DSPContext *c);
- void ff_vp8dsp_init_x86(VP8DSPContext *c);
- void ff_vp8dsp_init_mips(VP8DSPContext *c);
- void ff_vp8dsp_init_loongarch(VP8DSPContext *c);
- 
- #define IS_VP7 1
- #define IS_VP8 0
- 
- #endif /* AVCODEC_VP8DSP_H */
-diff --git a/media/ffvpx/libavcodec/vp9.c b/media/ffvpx/libavcodec/vp9.c
---- a/media/ffvpx/libavcodec/vp9.c
-+++ b/media/ffvpx/libavcodec/vp9.c
-@@ -37,16 +37,17 @@
- 
- #include "videodsp.h"
- #include "vp89_rac.h"
- #include "vp9.h"
- #include "vp9data.h"
- #include "vp9dec.h"
- #include "vpx_rac.h"
- #include "libavutil/avassert.h"
-+#include "libavutil/mem.h"
- #include "libavutil/pixdesc.h"
- #include "libavutil/video_enc_params.h"
- 
- #define VP9_SYNCCODE 0x498342
- 
- #if HAVE_THREADS
- DEFINE_OFFSET_ARRAY(VP9Context, vp9_context, pthread_init_cnt,
-                     (offsetof(VP9Context, progress_mutex)),
-diff --git a/media/ffvpx/libavcodec/x86/h264_intrapred.asm b/media/ffvpx/libavcodec/x86/h264_intrapred.asm
---- a/media/ffvpx/libavcodec/x86/h264_intrapred.asm
-+++ b/media/ffvpx/libavcodec/x86/h264_intrapred.asm
-@@ -81,29 +81,27 @@ cglobal pred16x16_horizontal_8, 2,3
- %if cpuflag(ssse3)
-     pshufb    m0, m2
-     pshufb    m1, m2
- %else
-     punpcklbw m0, m0
-     punpcklbw m1, m1
-     SPLATW    m0, m0, 3
-     SPLATW    m1, m1, 3
--    mova [r0+r1*0+8], m0
--    mova [r0+r1*1+8], m1
- %endif
- 
-     mova [r0+r1*0], m0
-     mova [r0+r1*1], m1
-     lea       r0, [r0+r1*2]
-     dec       r2
-     jg .loop
-     RET
- %endmacro
- 
--INIT_MMX mmxext
-+INIT_XMM sse2
- PRED16x16_H
- INIT_XMM ssse3
- PRED16x16_H
- 
- ;-----------------------------------------------------------------------------
- ; void ff_pred16x16_dc_8(uint8_t *src, ptrdiff_t stride)
- ;-----------------------------------------------------------------------------
- 
-@@ -563,27 +561,27 @@ INIT_XMM sse2
- H264_PRED8x8_PLANE
- INIT_XMM ssse3
- H264_PRED8x8_PLANE
- 
- ;-----------------------------------------------------------------------------
- ; void ff_pred8x8_vertical_8(uint8_t *src, ptrdiff_t stride)
- ;-----------------------------------------------------------------------------
- 
--INIT_MMX mmx
-+INIT_XMM sse2
- cglobal pred8x8_vertical_8, 2,2
-     sub    r0, r1
--    movq  mm0, [r0]
-+    movq   m0, [r0]
- %rep 3
--    movq [r0+r1*1], mm0
--    movq [r0+r1*2], mm0
-+    movq [r0+r1*1], m0
-+    movq [r0+r1*2], m0
-     lea    r0, [r0+r1*2]
- %endrep
--    movq [r0+r1*1], mm0
--    movq [r0+r1*2], mm0
-+    movq [r0+r1*1], m0
-+    movq [r0+r1*2], m0
-     RET
- 
- ;-----------------------------------------------------------------------------
- ; void ff_pred8x8_horizontal_8(uint8_t *src, ptrdiff_t stride)
- ;-----------------------------------------------------------------------------
- 
- %macro PRED8x8_H 0
- cglobal pred8x8_horizontal_8, 2,3
-@@ -1308,20 +1306,17 @@ INIT_MMX ssse3
- PRED8x8L_DOWN_RIGHT
- 
- ;-----------------------------------------------------------------------------
- ; void ff_pred8x8l_vertical_right_8(uint8_t *src, int has_topleft,
- ;                                   int has_topright, ptrdiff_t stride)
- ;-----------------------------------------------------------------------------
- 
- %macro PRED8x8L_VERTICAL_RIGHT 0
--cglobal pred8x8l_vertical_right_8, 4,5,7
--    ; manually spill XMM registers for Win64 because
--    ; the code here is initialized with INIT_MMX
--    WIN64_SPILL_XMM 7
-+cglobal pred8x8l_vertical_right_8, 4,5,6
-     sub          r0, r3
-     lea          r4, [r0+r3*2]
-     movq        mm0, [r0+r3*1-8]
-     punpckhbw   mm0, [r0+r3*0-8]
-     movq        mm1, [r4+r3*1-8]
-     punpckhbw   mm1, [r0+r3*2-8]
-     mov          r4, r0
-     punpckhwd   mm1, mm0
-@@ -1381,35 +1376,35 @@ cglobal pred8x8l_vertical_right_8, 4,5,7
-     test        r2d, r2d
-     jz .fix_tr_1
- .do_top:
-     PRED4x4_LOWPASS mm6, mm2, mm1, mm3, mm5
-     lea           r1, [r0+r3*2]
-     movq2dq     xmm4, mm6
-     pslldq      xmm4, 8
-     por         xmm0, xmm4
--    movdqa      xmm6, [pw_ff00]
-     movdqa      xmm1, xmm0
-     lea           r2, [r1+r3*2]
-     movdqa      xmm2, xmm0
-     movdqa      xmm3, xmm0
-     pslldq      xmm0, 1
-     pslldq      xmm1, 2
-     pavgb       xmm2, xmm0
- INIT_XMM cpuname
-     PRED4x4_LOWPASS xmm4, xmm3, xmm1, xmm0, xmm5
--    pandn       xmm6, xmm4
-+    movdqa      xmm0, [pw_ff00]
-+    pandn       xmm0, xmm4
-     movdqa      xmm5, xmm4
-     psrlw       xmm4, 8
--    packuswb    xmm6, xmm4
--    movhlps     xmm4, xmm6
-+    packuswb    xmm0, xmm4
-+    movhlps     xmm4, xmm0
-     movhps [r0+r3*2], xmm5
-     movhps [r0+r3*1], xmm2
-     psrldq      xmm5, 4
--    movss       xmm5, xmm6
-+    movss       xmm5, xmm0
-     psrldq      xmm2, 4
-     movss       xmm2, xmm4
-     lea           r0, [r2+r3*2]
-     psrldq      xmm5, 1
-     psrldq      xmm2, 1
-     movq        [r0+r3*2], xmm5
-     movq        [r0+r3*1], xmm2
-     psrldq      xmm5, 1
-diff --git a/media/ffvpx/libavcodec/x86/h264_intrapred_init.c b/media/ffvpx/libavcodec/x86/h264_intrapred_init.c
---- a/media/ffvpx/libavcodec/x86/h264_intrapred_init.c
-+++ b/media/ffvpx/libavcodec/x86/h264_intrapred_init.c
-@@ -95,33 +95,33 @@ PRED16x16(dc, 10, sse2)
- PRED16x16(top_dc, 10, sse2)
- PRED16x16(128_dc, 10, sse2)
- PRED16x16(left_dc, 10, sse2)
- PRED16x16(vertical, 10, sse2)
- PRED16x16(horizontal, 10, sse2)
- 
- /* 8-bit versions */
- PRED16x16(vertical, 8, sse)
--PRED16x16(horizontal, 8, mmxext)
-+PRED16x16(horizontal, 8, sse2)
- PRED16x16(horizontal, 8, ssse3)
- PRED16x16(dc, 8, sse2)
- PRED16x16(dc, 8, ssse3)
- PRED16x16(plane_h264, 8, sse2)
- PRED16x16(plane_h264, 8, ssse3)
- PRED16x16(plane_rv40, 8, sse2)
- PRED16x16(plane_rv40, 8, ssse3)
- PRED16x16(plane_svq3, 8, sse2)
- PRED16x16(plane_svq3, 8, ssse3)
- PRED16x16(tm_vp8, 8, sse2)
- PRED16x16(tm_vp8, 8, avx2)
- 
- PRED8x8(top_dc, 8, mmxext)
- PRED8x8(dc_rv40, 8, mmxext)
- PRED8x8(dc, 8, mmxext)
--PRED8x8(vertical, 8, mmx)
-+PRED8x8(vertical, 8, sse2)
- PRED8x8(horizontal, 8, mmxext)
- PRED8x8(horizontal, 8, ssse3)
- PRED8x8(plane, 8, sse2)
- PRED8x8(plane, 8, ssse3)
- PRED8x8(tm_vp8, 8, sse2)
- PRED8x8(tm_vp8, 8, ssse3)
- 
- PRED8x8L(top_dc, 8, mmxext)
-@@ -158,24 +158,17 @@ PRED4x4(vertical_vp8, 8, mmxext)
- 
- av_cold void ff_h264_pred_init_x86(H264PredContext *h, int codec_id,
-                                    const int bit_depth,
-                                    const int chroma_format_idc)
- {
-     int cpu_flags = av_get_cpu_flags();
- 
-     if (bit_depth == 8) {
--        if (EXTERNAL_MMX(cpu_flags)) {
--            if (chroma_format_idc <= 1) {
--                h->pred8x8  [VERT_PRED8x8     ] = ff_pred8x8_vertical_8_mmx;
--            }
--        }
--
-         if (EXTERNAL_MMXEXT(cpu_flags)) {
--            h->pred16x16[HOR_PRED8x8            ] = ff_pred16x16_horizontal_8_mmxext;
-             if (chroma_format_idc <= 1)
-                 h->pred8x8[HOR_PRED8x8          ] = ff_pred8x8_horizontal_8_mmxext;
-             h->pred8x8l [TOP_DC_PRED            ] = ff_pred8x8l_top_dc_8_mmxext;
-             h->pred8x8l [DC_PRED                ] = ff_pred8x8l_dc_8_mmxext;
-             h->pred8x8l [HOR_PRED               ] = ff_pred8x8l_horizontal_8_mmxext;
-             h->pred8x8l [VERT_PRED              ] = ff_pred8x8l_vertical_8_mmxext;
-             h->pred8x8l [HOR_UP_PRED            ] = ff_pred8x8l_horizontal_up_8_mmxext;
-             h->pred4x4  [DIAG_DOWN_RIGHT_PRED   ] = ff_pred4x4_down_right_8_mmxext;
-@@ -205,22 +198,25 @@ av_cold void ff_h264_pred_init_x86(H264P
-             }
-         }
- 
-         if (EXTERNAL_SSE(cpu_flags)) {
-             h->pred16x16[VERT_PRED8x8] = ff_pred16x16_vertical_8_sse;
-         }
- 
-         if (EXTERNAL_SSE2(cpu_flags)) {
-+            h->pred16x16[HOR_PRED8x8          ] = ff_pred16x16_horizontal_8_sse2;
-             h->pred16x16[DC_PRED8x8           ] = ff_pred16x16_dc_8_sse2;
-             h->pred8x8l [DIAG_DOWN_LEFT_PRED  ] = ff_pred8x8l_down_left_8_sse2;
-             h->pred8x8l [DIAG_DOWN_RIGHT_PRED ] = ff_pred8x8l_down_right_8_sse2;
-             h->pred8x8l [VERT_RIGHT_PRED      ] = ff_pred8x8l_vertical_right_8_sse2;
-             h->pred8x8l [VERT_LEFT_PRED       ] = ff_pred8x8l_vertical_left_8_sse2;
-             h->pred8x8l [HOR_DOWN_PRED        ] = ff_pred8x8l_horizontal_down_8_sse2;
-+            if (chroma_format_idc <= 1)
-+                h->pred8x8  [VERT_PRED8x8     ] = ff_pred8x8_vertical_8_sse2;
-             if (codec_id == AV_CODEC_ID_VP7 || codec_id == AV_CODEC_ID_VP8) {
-                 h->pred16x16[PLANE_PRED8x8    ] = ff_pred16x16_tm_vp8_8_sse2;
-                 h->pred8x8  [PLANE_PRED8x8    ] = ff_pred8x8_tm_vp8_8_sse2;
-             } else {
-                 if (chroma_format_idc <= 1)
-                     h->pred8x8  [PLANE_PRED8x8] = ff_pred8x8_plane_8_sse2;
-                 if (codec_id == AV_CODEC_ID_SVQ3) {
-                     h->pred16x16[PLANE_PRED8x8] = ff_pred16x16_plane_svq3_8_sse2;
-diff --git a/media/ffvpx/libavcodec/x86/moz.build b/media/ffvpx/libavcodec/x86/moz.build
---- a/media/ffvpx/libavcodec/x86/moz.build
-+++ b/media/ffvpx/libavcodec/x86/moz.build
-@@ -32,16 +32,18 @@ SOURCES += [
-     'vp9itxfm.asm',
-     'vp9itxfm_16bpp.asm',
-     'vp9lpf.asm',
-     'vp9lpf_16bpp.asm',
-     'vp9mc.asm',
-     'vp9mc_16bpp.asm',
- ]
- 
-+LOCAL_INCLUDES += [ "../" ]
-+
- if CONFIG['TARGET_CPU'] == 'x86':
-     SOURCES += [ 'simple_idct.asm' ]
- 
- if CONFIG['TARGET_CPU'] == 'x86_64':
-     SOURCES += [ 'simple_idct10.asm' ]
- 
- FINAL_LIBRARY = 'mozavcodec'
- 
-diff --git a/media/ffvpx/libavcodec/x86/simple_idct.asm b/media/ffvpx/libavcodec/x86/simple_idct.asm
---- a/media/ffvpx/libavcodec/x86/simple_idct.asm
-+++ b/media/ffvpx/libavcodec/x86/simple_idct.asm
-@@ -778,78 +778,43 @@ SECTION .text
-     IDCT8 rsp + 16, rsp + 80, rsp + 48, rsp + 112, blockq +  8, 20
- 
-     %%9:
- %endmacro
- 
- %macro PUT_PIXELS_CLAMPED_HALF 1
-     mova     m0, [blockq+mmsize*0+%1]
-     mova     m1, [blockq+mmsize*2+%1]
--%if mmsize == 8
--    mova     m2, [blockq+mmsize*4+%1]
--    mova     m3, [blockq+mmsize*6+%1]
--%endif
-     packuswb m0, [blockq+mmsize*1+%1]
-     packuswb m1, [blockq+mmsize*3+%1]
--%if mmsize == 8
--    packuswb m2, [blockq+mmsize*5+%1]
--    packuswb m3, [blockq+mmsize*7+%1]
--    movq           [pixelsq], m0
--    movq    [lsizeq+pixelsq], m1
--    movq  [2*lsizeq+pixelsq], m2
--    movq   [lsize3q+pixelsq], m3
--%else
-     movq           [pixelsq], m0
-     movhps  [lsizeq+pixelsq], m0
-     movq  [2*lsizeq+pixelsq], m1
-     movhps [lsize3q+pixelsq], m1
--%endif
- %endmacro
- 
- %macro ADD_PIXELS_CLAMPED 1
-     mova       m0, [blockq+mmsize*0+%1]
-     mova       m1, [blockq+mmsize*1+%1]
--%if mmsize == 8
--    mova       m5, [blockq+mmsize*2+%1]
--    mova       m6, [blockq+mmsize*3+%1]
--%endif
-     movq       m2, [pixelsq]
-     movq       m3, [pixelsq+lsizeq]
--%if mmsize == 8
--    mova       m7, m2
--    punpcklbw  m2, m4
--    punpckhbw  m7, m4
--    paddsw     m0, m2
--    paddsw     m1, m7
--    mova       m7, m3
--    punpcklbw  m3, m4
--    punpckhbw  m7, m4
--    paddsw     m5, m3
--    paddsw     m6, m7
--%else
-     punpcklbw  m2, m4
-     punpcklbw  m3, m4
-     paddsw     m0, m2
-     paddsw     m1, m3
--%endif
-     packuswb   m0, m1
--%if mmsize == 8
--    packuswb   m5, m6
--    movq       [pixelsq], m0
--    movq       [pixelsq+lsizeq], m5
--%else
-     movq       [pixelsq], m0
-     movhps     [pixelsq+lsizeq], m0
--%endif
- %endmacro
- 
- INIT_MMX mmx
- 
- cglobal simple_idct, 1, 2, 8, 128, block, t0
-     IDCT
-+    emms
- RET
- 
- INIT_XMM sse2
- 
- cglobal simple_idct_put, 3, 5, 8, 128, pixels, lsize, block, lsize3, t0
-     IDCT
-     lea lsize3q, [lsizeq*3]
-     PUT_PIXELS_CLAMPED_HALF 0
-diff --git a/media/ffvpx/libavcodec/x86/vp56_arith.h b/media/ffvpx/libavcodec/x86/vp56_arith.h
-deleted file mode 100644
---- a/media/ffvpx/libavcodec/x86/vp56_arith.h
-+++ /dev/null
-@@ -1,53 +0,0 @@
--/**
-- * VP5 and VP6 compatible video decoder (arith decoder)
-- *
-- * Copyright (C) 2006  Aurelien Jacobs <aurel@gnuage.org>
-- * Copyright (C) 2010  Eli Friedman
-- *
-- * 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_X86_VP56_ARITH_H
--#define AVCODEC_X86_VP56_ARITH_H
--
--#if HAVE_INLINE_ASM && HAVE_FAST_CMOV && HAVE_6REGS
--#include "libavutil/attributes.h"
--
--#define vp56_rac_get_prob vp56_rac_get_prob
--static av_always_inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob)
--{
--    unsigned int code_word = vp56_rac_renorm(c);
--    unsigned int low = 1 + (((c->high - 1) * prob) >> 8);
--    unsigned int low_shift = low << 16;
--    int bit = 0;
--    c->code_word = code_word;
--
--    __asm__(
--        "subl  %4, %1      \n\t"
--        "subl  %3, %2      \n\t"
--        "setae %b0         \n\t"
--        "cmovb %4, %1      \n\t"
--        "cmovb %5, %2      \n\t"
--        : "+q"(bit), "+&r"(c->high), "+&r"(c->code_word)
--        : "r"(low_shift), "r"(low), "r"(code_word)
--    );
--
--    return bit;
--}
--#endif
--
--#endif /* AVCODEC_X86_VP56_ARITH_H */
-diff --git a/media/ffvpx/libavcodec/x86/vp8dsp.asm b/media/ffvpx/libavcodec/x86/vp8dsp.asm
---- a/media/ffvpx/libavcodec/x86/vp8dsp.asm
-+++ b/media/ffvpx/libavcodec/x86/vp8dsp.asm
-@@ -109,17 +109,17 @@ bilinear_filter_vw_m: times 8 dw 1
- bilinear_filter_vb_m: times 8 db 7, 1
-                       times 8 db 6, 2
-                       times 8 db 5, 3
-                       times 8 db 4, 4
-                       times 8 db 3, 5
-                       times 8 db 2, 6
-                       times 8 db 1, 7
- 
--%ifdef PIC
-+%if PIC
- %define fourtap_filter_hw  picregq
- %define sixtap_filter_hw   picregq
- %define fourtap_filter_hb  picregq
- %define sixtap_filter_hb   picregq
- %define fourtap_filter_v   picregq
- %define sixtap_filter_v    picregq
- %define bilinear_filter_vw picregq
- %define bilinear_filter_vb picregq
-@@ -161,17 +161,17 @@ SECTION .text
- ;                                                 int height,   int mx, int my);
- ;-------------------------------------------------------------------------------
- 
- %macro FILTER_SSSE3 1
- cglobal put_vp8_epel%1_h6, 6, 6 + npicregs, 8, dst, dststride, src, srcstride, height, mx, picreg
-     lea      mxd, [mxq*3]
-     mova      m3, [filter_h6_shuf2]
-     mova      m4, [filter_h6_shuf3]
--%ifdef PIC
-+%if PIC
-     lea  picregq, [sixtap_filter_hb_m]
- %endif
-     mova      m5, [sixtap_filter_hb+mxq*8-48] ; set up 6tap filter in bytes
-     mova      m6, [sixtap_filter_hb+mxq*8-32]
-     mova      m7, [sixtap_filter_hb+mxq*8-16]
- 
- .nextrow:
-     movu      m0, [srcq-2]
-@@ -202,17 +202,17 @@ cglobal put_vp8_epel%1_h6, 6, 6 + npicre
-     jg .nextrow
-     RET
- 
- cglobal put_vp8_epel%1_h4, 6, 6 + npicregs, 7, dst, dststride, src, srcstride, height, mx, picreg
-     shl      mxd, 4
-     mova      m2, [pw_256]
-     mova      m3, [filter_h2_shuf]
-     mova      m4, [filter_h4_shuf]
--%ifdef PIC
-+%if PIC
-     lea  picregq, [fourtap_filter_hb_m]
- %endif
-     mova      m5, [fourtap_filter_hb+mxq-16] ; set up 4tap filter in bytes
-     mova      m6, [fourtap_filter_hb+mxq]
- 
- .nextrow:
-     movu      m0, [srcq-1]
-     mova      m1, m0
-@@ -229,17 +229,17 @@ cglobal put_vp8_epel%1_h4, 6, 6 + npicre
-     add     dstq, dststrideq
-     add     srcq, srcstrideq
-     dec  heightd            ; next row
-     jg .nextrow
-     RET
- 
- cglobal put_vp8_epel%1_v4, 7, 7, 8, dst, dststride, src, srcstride, height, picreg, my
-     shl      myd, 4
--%ifdef PIC
-+%if PIC
-     lea  picregq, [fourtap_filter_hb_m]
- %endif
-     mova      m5, [fourtap_filter_hb+myq-16]
-     mova      m6, [fourtap_filter_hb+myq]
-     mova      m7, [pw_256]
- 
-     ; read 3 lines
-     sub     srcq, srcstrideq
-@@ -267,17 +267,17 @@ cglobal put_vp8_epel%1_v4, 7, 7, 8, dst,
-     add      dstq, dststrideq
-     add      srcq, srcstrideq
-     dec   heightd                          ; next row
-     jg .nextrow
-     RET
- 
- cglobal put_vp8_epel%1_v6, 7, 7, 8, dst, dststride, src, srcstride, height, picreg, my
-     lea      myd, [myq*3]
--%ifdef PIC
-+%if PIC
-     lea  picregq, [sixtap_filter_hb_m]
- %endif
-     lea      myq, [sixtap_filter_hb+myq*8]
- 
-     ; read 5 lines
-     sub     srcq, srcstrideq
-     sub     srcq, srcstrideq
-     movh      m0, [srcq]
-@@ -321,17 +321,17 @@ INIT_MMX ssse3
- FILTER_SSSE3 4
- INIT_XMM ssse3
- FILTER_SSSE3 8
- 
- ; 4x4 block, H-only 4-tap filter
- INIT_MMX mmxext
- cglobal put_vp8_epel4_h4, 6, 6 + npicregs, 0, dst, dststride, src, srcstride, height, mx, picreg
-     shl       mxd, 4
--%ifdef PIC
-+%if PIC
-     lea   picregq, [fourtap_filter_hw_m]
- %endif
-     movq      mm4, [fourtap_filter_hw+mxq-16] ; set up 4tap filter in words
-     movq      mm5, [fourtap_filter_hw+mxq]
-     movq      mm7, [pw_64]
-     pxor      mm6, mm6
- 
- .nextrow:
-@@ -369,17 +369,17 @@ cglobal put_vp8_epel4_h4, 6, 6 + npicreg
-     dec   heightd                          ; next row
-     jg .nextrow
-     RET
- 
- ; 4x4 block, H-only 6-tap filter
- INIT_MMX mmxext
- cglobal put_vp8_epel4_h6, 6, 6 + npicregs, 0, dst, dststride, src, srcstride, height, mx, picreg
-     lea       mxd, [mxq*3]
--%ifdef PIC
-+%if PIC
-     lea   picregq, [sixtap_filter_hw_m]
- %endif
-     movq      mm4, [sixtap_filter_hw+mxq*8-48] ; set up 4tap filter in words
-     movq      mm5, [sixtap_filter_hw+mxq*8-32]
-     movq      mm6, [sixtap_filter_hw+mxq*8-16]
-     movq      mm7, [pw_64]
-     pxor      mm3, mm3
- 
-@@ -426,17 +426,17 @@ cglobal put_vp8_epel4_h6, 6, 6 + npicreg
-     add      srcq, srcstrideq
-     dec   heightd                          ; next row
-     jg .nextrow
-     RET
- 
- INIT_XMM sse2
- cglobal put_vp8_epel8_h4, 6, 6 + npicregs, 10, dst, dststride, src, srcstride, height, mx, picreg
-     shl      mxd, 5
--%ifdef PIC
-+%if PIC
-     lea  picregq, [fourtap_filter_v_m]
- %endif
-     lea      mxq, [fourtap_filter_v+mxq-32]
-     pxor      m7, m7
-     mova      m4, [pw_64]
-     mova      m5, [mxq+ 0]
-     mova      m6, [mxq+16]
- %ifdef m8
-@@ -475,17 +475,17 @@ cglobal put_vp8_epel8_h4, 6, 6 + npicreg
-     dec  heightd            ; next row
-     jg .nextrow
-     RET
- 
- INIT_XMM sse2
- cglobal put_vp8_epel8_h6, 6, 6 + npicregs, 14, dst, dststride, src, srcstride, height, mx, picreg
-     lea      mxd, [mxq*3]
-     shl      mxd, 4
--%ifdef PIC
-+%if PIC
-     lea  picregq, [sixtap_filter_v_m]
- %endif
-     lea      mxq, [sixtap_filter_v+mxq-96]
-     pxor      m7, m7
-     mova      m6, [pw_64]
- %ifdef m8
-     mova      m8, [mxq+ 0]
-     mova      m9, [mxq+16]
-@@ -538,17 +538,17 @@ cglobal put_vp8_epel8_h6, 6, 6 + npicreg
-     dec  heightd            ; next row
-     jg .nextrow
-     RET
- 
- %macro FILTER_V 1
- ; 4x4 block, V-only 4-tap filter
- cglobal put_vp8_epel%1_v4, 7, 7, 8, dst, dststride, src, srcstride, height, picreg, my
-     shl      myd, 5
--%ifdef PIC
-+%if PIC
-     lea  picregq, [fourtap_filter_v_m]
- %endif
-     lea      myq, [fourtap_filter_v+myq-32]
-     mova      m6, [pw_64]
-     pxor      m7, m7
-     mova      m5, [myq+48]
- 
-     ; read 3 lines
-@@ -592,17 +592,17 @@ cglobal put_vp8_epel%1_v4, 7, 7, 8, dst,
-     jg .nextrow
-     RET
- 
- 
- ; 4x4 block, V-only 6-tap filter
- cglobal put_vp8_epel%1_v6, 7, 7, 8, dst, dststride, src, srcstride, height, picreg, my
-     shl      myd, 4
-     lea      myq, [myq*3]
--%ifdef PIC
-+%if PIC
-     lea  picregq, [sixtap_filter_v_m]
- %endif
-     lea      myq, [sixtap_filter_v+myq-96]
-     pxor      m7, m7
- 
-     ; read 5 lines
-     sub     srcq, srcstrideq
-     sub     srcq, srcstrideq
-@@ -662,17 +662,17 @@ INIT_MMX mmxext
- FILTER_V 4
- INIT_XMM sse2
- FILTER_V 8
- 
- %macro FILTER_BILINEAR 1
- %if cpuflag(ssse3)
- cglobal put_vp8_bilinear%1_v, 7, 7, 5, dst, dststride, src, srcstride, height, picreg, my
-     shl      myd, 4
--%ifdef PIC
-+%if PIC
-     lea  picregq, [bilinear_filter_vb_m]
- %endif
-     pxor      m4, m4
-     mova      m3, [bilinear_filter_vb+myq-16]
- .nextrow:
-     movh      m0, [srcq+srcstrideq*0]
-     movh      m1, [srcq+srcstrideq*1]
-     movh      m2, [srcq+srcstrideq*2]
-@@ -692,17 +692,17 @@ cglobal put_vp8_bilinear%1_v, 7, 7, 5, d
- %else
-     packuswb  m0, m1
-     movh   [dstq+dststrideq*0], m0
-     movhps [dstq+dststrideq*1], m0
- %endif
- %else ; cpuflag(ssse3)
- cglobal put_vp8_bilinear%1_v, 7, 7, 7, dst, dststride, src, srcstride, height, picreg, my
-     shl      myd, 4
--%ifdef PIC
-+%if PIC
-     lea  picregq, [bilinear_filter_vw_m]
- %endif
-     pxor      m6, m6
-     mova      m5, [bilinear_filter_vw+myq-1*16]
-     neg      myq
-     mova      m4, [bilinear_filter_vw+myq+7*16]
- .nextrow:
-     movh      m0, [srcq+srcstrideq*0]
-@@ -738,17 +738,17 @@ cglobal put_vp8_bilinear%1_v, 7, 7, 7, d
-     lea     srcq, [srcq+srcstrideq*2]
-     sub  heightd, 2
-     jg .nextrow
-     RET
- 
- %if cpuflag(ssse3)
- cglobal put_vp8_bilinear%1_h, 6, 6 + npicregs, 5, dst, dststride, src, srcstride, height, mx, picreg
-     shl      mxd, 4
--%ifdef PIC
-+%if PIC
-     lea  picregq, [bilinear_filter_vb_m]
- %endif
-     pxor      m4, m4
-     mova      m2, [filter_h2_shuf]
-     mova      m3, [bilinear_filter_vb+mxq-16]
- .nextrow:
-     movu      m0, [srcq+srcstrideq*0]
-     movu      m1, [srcq+srcstrideq*1]
-@@ -768,17 +768,17 @@ cglobal put_vp8_bilinear%1_h, 6, 6 + npi
- %else
-     packuswb  m0, m1
-     movh   [dstq+dststrideq*0], m0
-     movhps [dstq+dststrideq*1], m0
- %endif
- %else ; cpuflag(ssse3)
- cglobal put_vp8_bilinear%1_h, 6, 6 + npicregs, 7, dst, dststride, src, srcstride, height, mx, picreg
-     shl      mxd, 4
--%ifdef PIC
-+%if PIC
-     lea  picregq, [bilinear_filter_vw_m]
- %endif
-     pxor      m6, m6
-     mova      m5, [bilinear_filter_vw+mxq-1*16]
-     neg      mxq
-     mova      m4, [bilinear_filter_vw+mxq+7*16]
- .nextrow:
-     movh      m0, [srcq+srcstrideq*0+0]
-diff --git a/media/ffvpx/libavcodec/x86/vp9itxfm.asm b/media/ffvpx/libavcodec/x86/vp9itxfm.asm
---- a/media/ffvpx/libavcodec/x86/vp9itxfm.asm
-+++ b/media/ffvpx/libavcodec/x86/vp9itxfm.asm
-@@ -325,17 +325,19 @@ IDCT_4x4_FN ssse3
- ;-------------------------------------------------------------------------------------------
- ; void vp9_iadst_iadst_4x4_add_<opt>(uint8_t *dst, ptrdiff_t stride, int16_t *block, int eob);
- ;-------------------------------------------------------------------------------------------
- 
- %macro IADST4_FN 5
- INIT_MMX %5
- cglobal vp9_%1_%3_4x4_add, 3, 3, 0, dst, stride, block, eob
- %if WIN64 && notcpuflag(ssse3)
-+INIT_XMM cpuname
-     WIN64_SPILL_XMM 8
-+INIT_MMX cpuname
- %endif
-     movdqa            xmm5, [pd_8192]
-     mova                m0, [blockq+ 0]
-     mova                m1, [blockq+ 8]
-     mova                m2, [blockq+16]
-     mova                m3, [blockq+24]
- %if cpuflag(ssse3)
-     mova                m6, [pw_11585x2]
-diff --git a/media/ffvpx/libavcodec/x86/vp9itxfm_16bpp.asm b/media/ffvpx/libavcodec/x86/vp9itxfm_16bpp.asm
---- a/media/ffvpx/libavcodec/x86/vp9itxfm_16bpp.asm
-+++ b/media/ffvpx/libavcodec/x86/vp9itxfm_16bpp.asm
-@@ -298,17 +298,19 @@ cglobal vp9_idct_idct_4x4_add_10, 4, 4, 
- INIT_MMX mmxext
- IDCT4_10_FN
- INIT_MMX ssse3
- IDCT4_10_FN
- 
- %macro IADST4_FN 4
- cglobal vp9_%1_%3_4x4_add_10, 3, 3, 0, dst, stride, block, eob
- %if WIN64 && notcpuflag(ssse3)
-+INIT_XMM cpuname
-     WIN64_SPILL_XMM 8
-+INIT_MMX cpuname
- %endif
-     movdqa            xmm5, [pd_8192]
-     mova                m0, [blockq+0*16+0]
-     mova                m1, [blockq+1*16+0]
-     packssdw            m0, [blockq+0*16+8]
-     packssdw            m1, [blockq+1*16+8]
-     mova                m2, [blockq+2*16+0]
-     mova                m3, [blockq+3*16+0]
-@@ -667,17 +669,17 @@ cglobal vp9_idct_idct_8x8_add_10, 4, 6 +
- 
- .idctfull:
-     SCRATCH              0, 12, rsp+16*mmsize, max
-     DEFINE_ARGS dst, stride, block, cnt, ptr, skip, dstbak
- %if ARCH_X86_64
-     mov            dstbakq, dstq
-     movsxd            cntq, cntd
- %endif
--%ifdef PIC
-+%if PIC
-     lea               ptrq, [default_8x8]
-     movzx             cntd, byte [ptrq+cntq-1]
- %else
-     movzx             cntd, byte [default_8x8+cntq-1]
- %endif
-     mov              skipd, 2
-     sub              skipd, cntd
-     mov               ptrq, rsp
-@@ -916,17 +918,17 @@ cglobal vp9_%1_%3_8x8_add_10, 4, 6 + ARC
- 
- .body:
-     SCRATCH              0, 13, rsp+16*mmsize, max
-     DEFINE_ARGS dst, stride, block, cnt, ptr, skip, dstbak
- %if ARCH_X86_64
-     mov            dstbakq, dstq
-     movsxd            cntq, cntd
- %endif
--%ifdef PIC
-+%if PIC
-     lea               ptrq, [%5_8x8]
-     movzx             cntd, byte [ptrq+cntq-1]
- %else
-     movzx             cntd, byte [%5_8x8+cntq-1]
- %endif
-     mov              skipd, 2
-     sub              skipd, cntd
-     mov               ptrq, rsp
-@@ -1123,17 +1125,17 @@ cglobal vp9_idct_idct_16x16_add_10, 4, 6
- 
- .idctfull:
-     mova   [rsp+64*mmsize], m0
-     DEFINE_ARGS dst, stride, block, cnt, ptr, skip, dstbak
- %if ARCH_X86_64
-     mov            dstbakq, dstq
-     movsxd            cntq, cntd
- %endif
--%ifdef PIC
-+%if PIC
-     lea               ptrq, [default_16x16]
-     movzx             cntd, byte [ptrq+cntq-1]
- %else
-     movzx             cntd, byte [default_16x16+cntq-1]
- %endif
-     mov              skipd, 4
-     sub              skipd, cntd
-     mov               ptrq, rsp
-@@ -1440,17 +1442,17 @@ cglobal vp9_%1_%4_16x16_add_10, 4, 6 + A
- 
- .body:
-     mova   [rsp+64*mmsize], m0
-     DEFINE_ARGS dst, stride, block, cnt, ptr, skip, dstbak
- %if ARCH_X86_64
-     mov            dstbakq, dstq
-     movsxd            cntq, cntd
- %endif
--%ifdef PIC
-+%if PIC
-     lea               ptrq, [%7_16x16]
-     movzx             cntd, byte [ptrq+cntq-1]
- %else
-     movzx             cntd, byte [%7_16x16+cntq-1]
- %endif
-     mov              skipd, 4
-     sub              skipd, cntd
-     mov               ptrq, rsp
-@@ -1953,17 +1955,17 @@ cglobal vp9_idct_idct_32x32_add_10, 4, 6
- 
- .idctfull:
-     mova  [rsp+256*mmsize], m0
-     DEFINE_ARGS dst, stride, block, cnt, ptr, skip, dstbak
- %if ARCH_X86_64
-     mov            dstbakq, dstq
-     movsxd            cntq, cntd
- %endif
--%ifdef PIC
-+%if PIC
-     lea               ptrq, [default_32x32]
-     movzx             cntd, byte [ptrq+cntq-1]
- %else
-     movzx             cntd, byte [default_32x32+cntq-1]
- %endif
-     mov              skipd, 8
-     sub              skipd, cntd
-     mov               ptrq, rsp
-diff --git a/media/ffvpx/libavutil/aarch64/cpu.c b/media/ffvpx/libavutil/aarch64/cpu.c
---- a/media/ffvpx/libavutil/aarch64/cpu.c
-+++ b/media/ffvpx/libavutil/aarch64/cpu.c
-@@ -19,44 +19,30 @@
- #include "libavutil/cpu.h"
- #include "libavutil/cpu_internal.h"
- #include "config.h"
- 
- #if (defined(__linux__) || defined(__ANDROID__)) && HAVE_GETAUXVAL
- #include <stdint.h>
- #include <sys/auxv.h>
- 
--#define get_cpu_feature_reg(reg, val) \
--        __asm__("mrs %0, " #reg : "=r" (val))
-+#define HWCAP_AARCH64_ASIMDDP (1 << 20)
-+#define HWCAP2_AARCH64_I8MM   (1 << 13)
- 
- static int detect_flags(void)
- {
-     int flags = 0;
- 
--#if defined(HWCAP_CPUID) && HAVE_INLINE_ASM
-     unsigned long hwcap = getauxval(AT_HWCAP);
--    // We can check for DOTPROD and I8MM using HWCAP_ASIMDDP and
--    // HWCAP2_I8MM too, avoiding to read the CPUID registers (which triggers
--    // a trap, handled by the kernel). However the HWCAP_* defines for these
--    // extensions are added much later than HWCAP_CPUID, so the userland
--    // headers might lack support for them even if the binary later is run
--    // on hardware that does support it (and where the kernel might support
--    // HWCAP_CPUID).
--    // See https://www.kernel.org/doc/html/latest/arm64/cpu-feature-registers.html
--    if (hwcap & HWCAP_CPUID) {
--        uint64_t tmp;
-+    unsigned long hwcap2 = getauxval(AT_HWCAP2);
- 
--        get_cpu_feature_reg(ID_AA64ISAR0_EL1, tmp);
--        if (((tmp >> 44) & 0xf) == 0x1)
--            flags |= AV_CPU_FLAG_DOTPROD;
--        get_cpu_feature_reg(ID_AA64ISAR1_EL1, tmp);
--        if (((tmp >> 52) & 0xf) == 0x1)
--            flags |= AV_CPU_FLAG_I8MM;
--    }
--#endif
-+    if (hwcap & HWCAP_AARCH64_ASIMDDP)
-+        flags |= AV_CPU_FLAG_DOTPROD;
-+    if (hwcap2 & HWCAP2_AARCH64_I8MM)
-+        flags |= AV_CPU_FLAG_I8MM;
- 
-     return flags;
- }
- 
- #elif defined(__APPLE__) && HAVE_SYSCTLBYNAME
- #include <sys/sysctl.h>
- 
- static int detect_flags(void)
-diff --git a/media/ffvpx/libavutil/arm/float_dsp_init_vfp.c b/media/ffvpx/libavutil/arm/float_dsp_init_vfp.c
---- a/media/ffvpx/libavutil/arm/float_dsp_init_vfp.c
-+++ b/media/ffvpx/libavutil/arm/float_dsp_init_vfp.c
-@@ -27,17 +27,17 @@ void ff_vector_fmul_vfp(float *dst, cons
-                         int len);
- 
- void ff_vector_fmul_window_vfp(float *dst, const float *src0,
-                                const float *src1, const float *win, int len);
- 
- void ff_vector_fmul_reverse_vfp(float *dst, const float *src0,
-                                 const float *src1, int len);
- 
--void ff_butterflies_float_vfp(float *av_restrict v1, float *av_restrict v2, int len);
-+void ff_butterflies_float_vfp(float *restrict v1, float *restrict v2, int len);
- 
- av_cold void ff_float_dsp_init_vfp(AVFloatDSPContext *fdsp, int cpu_flags)
- {
-     if (have_vfp_vm(cpu_flags)) {
-         fdsp->vector_fmul = ff_vector_fmul_vfp;
-         fdsp->vector_fmul_window = ff_vector_fmul_window_vfp;
-     }
-     fdsp->vector_fmul_reverse = ff_vector_fmul_reverse_vfp;
-diff --git a/media/ffvpx/libavutil/avstring.c b/media/ffvpx/libavutil/avstring.c
---- a/media/ffvpx/libavutil/avstring.c
-+++ b/media/ffvpx/libavutil/avstring.c
-@@ -340,17 +340,17 @@ int av_escape(char **dst, const char *sr
-     if ((ret = av_bprint_finalize(&dstbuf, dst)) < 0)
-         return ret;
-     return dstbuf.len;
- }
- 
- int av_match_name(const char *name, const char *names)
- {
-     const char *p;
--    int len, namelen;
-+    size_t len, namelen;
- 
-     if (!name || !names)
-         return 0;
- 
-     namelen = strlen(name);
-     while (*names) {
-         int negate = '-' == *names;
-         p = strchr(names, ',');
-diff --git a/media/ffvpx/libavutil/avutil.h b/media/ffvpx/libavutil/avutil.h
---- a/media/ffvpx/libavutil/avutil.h
-+++ b/media/ffvpx/libavutil/avutil.h
-@@ -330,29 +330,16 @@ unsigned av_int_list_length_for_size(uns
-  *
-  * @param term  list terminator (usually 0 or -1)
-  * @param list  pointer to the list
-  * @return  length of the list, in elements, not counting the terminator
-  */
- #define av_int_list_length(list, term) \
-     av_int_list_length_for_size(sizeof(*(list)), list, term)
- 
--#if FF_API_AV_FOPEN_UTF8
--/**
-- * Open a file using a UTF-8 filename.
-- * The API of this function matches POSIX fopen(), errors are returned through
-- * errno.
-- * @deprecated Avoid using it, as on Windows, the FILE* allocated by this
-- *             function may be allocated with a different CRT than the caller
-- *             who uses the FILE*. No replacement provided in public API.
-- */
--attribute_deprecated
--FILE *av_fopen_utf8(const char *path, const char *mode);
--#endif
--
- /**
-  * Return the fractional representation of the internal time base.
-  */
- AVRational av_get_time_base_q(void);
- 
- #define AV_FOURCC_MAX_STRING_SIZE 32
- 
- #define av_fourcc2str(fourcc) av_fourcc_make_string((char[AV_FOURCC_MAX_STRING_SIZE]){0}, fourcc)
-diff --git a/media/ffvpx/libavutil/avutil.symbols b/media/ffvpx/libavutil/avutil.symbols
---- a/media/ffvpx/libavutil/avutil.symbols
-+++ b/media/ffvpx/libavutil/avutil.symbols
-@@ -3,17 +3,16 @@ av_add_stable
- av_append_path_component
- av_asprintf
- av_basename
- #ifndef MOZ_FFVPX_AUDIOONLY
- av_base64_decode
- av_base64_encode
- #endif
- av_bprint_append_data
--av_bprint_channel_layout
- av_bprint_chars
- av_bprint_clear
- av_bprint_escape
- av_bprint_finalize
- av_bprint_get_buffer
- av_bprint_init
- av_bprint_init_for_buffer
- av_bprint_strftime
-@@ -34,32 +33,29 @@ av_buffer_replace
- av_buffer_ref
- av_buffer_unref
- av_calloc
- av_channel_layout_check
- av_channel_layout_compare
- av_channel_layout_copy
- av_channel_layout_default
- av_channel_layout_describe
--av_channel_layout_extract_channel
- av_channel_layout_from_mask
- av_channel_layout_from_mask
- av_channel_layout_uninit
- av_chroma_location_name
- av_chroma_location_enum_to_pos
- av_chroma_location_pos_to_enum
- av_color_primaries_name
- av_color_range_name
- av_color_space_name
- av_color_transfer_name
- av_compare_mod
- av_compare_ts
--#ifndef MOZ_FFVPX_AUDIOONLY
- av_content_light_metadata_create_side_data
--#endif
- av_cpu_count
- av_crc
- av_crc_get_table
- av_crc_init
- av_d2q
- av_default_get_category
- av_default_item_name
- av_dict_copy
-@@ -83,50 +79,39 @@ av_dynarray_add_nofree
- av_escape
- av_expr_eval
- av_expr_free
- av_expr_parse
- av_expr_parse_and_eval
- av_fast_malloc
- av_fast_mallocz
- av_fast_realloc
--av_fifo_alloc
- av_fifo_alloc2
--av_fifo_alloc_array
- av_fifo_can_read
- av_fifo_can_write
--av_fifo_drain
- av_fifo_drain2
--av_fifo_free
--av_fifo_freep
- av_fifo_freep2
--av_fifo_generic_peek
--av_fifo_generic_read
--av_fifo_generic_write
--av_fifo_grow
- av_fifo_peek
--av_fifo_realloc2
- av_fifo_read
--av_fifo_reset
--av_fifo_size
--av_fifo_space
- av_fifo_write
- av_find_best_pix_fmt_of_2
- av_find_info_tag
- av_find_nearest_q_idx
- #ifndef MOZ_FFVPX_AUDIOONLY
- av_film_grain_params_create_side_data
- #endif
- av_force_cpu_flags
- av_fourcc_make_string
- av_frame_alloc
- av_frame_apply_cropping
- av_frame_clone
- av_frame_copy
- av_frame_copy_props
-+av_frame_side_data_free
-+av_frame_side_data_get_c
- av_frame_free
- av_frame_get_buffer
- av_frame_get_plane_buffer
- av_frame_get_side_data
- av_frame_is_writable
- av_frame_make_writable
- av_frame_move_ref
- av_frame_new_side_data
-@@ -137,37 +122,29 @@ av_frame_replace
- av_frame_side_data_name
- av_frame_unref
- av_free
- av_freep
- av_gcd
- av_get_alt_sample_fmt
- av_get_bits_per_pixel
- av_get_bytes_per_sample
--av_get_channel_description
--av_get_channel_layout
--av_get_channel_layout_channel_index
--av_get_channel_layout_nb_channels
--av_get_channel_layout_string
--av_get_channel_name
- av_get_cpu_flags
--av_get_default_channel_layout
- av_get_known_color_name
- av_get_media_type_string
- av_get_packed_sample_fmt
- av_get_padded_bits_per_pixel
- av_get_picture_type_char
- av_get_pix_fmt
- av_get_pix_fmt_loss
- av_get_pix_fmt_name
- av_get_pix_fmt_string
- av_get_planar_sample_fmt
- av_get_sample_fmt
- av_get_sample_fmt_string
--av_get_standard_channel_layout
- av_get_time_base_q
- av_get_token
- av_gettime
- av_gettime_relative
- av_gettime_relative_is_monotonic
- av_hwdevice_get_hwframe_constraints
- av_hwdevice_hwconfig_alloc
- av_hwframe_constraints_free
-@@ -196,19 +173,17 @@ av_log_default_callback
- av_log_format_line
- av_log_get_flags
- av_log_get_level
- av_log_set_callback
- av_log_set_flags
- av_log_set_level
- av_mallocz
- av_malloc
--#ifndef MOZ_FFVPX_AUDIOONLY
- av_mastering_display_metadata_create_side_data
--#endif
- av_match_list
- av_match_name
- av_max_alloc
- av_memcpy_backptr
- av_memdup
- av_mul_q
- av_nearer_q
- av_opt_child_next
-@@ -220,17 +195,16 @@ av_opt_eval_int
- av_opt_eval_int64
- av_opt_eval_q
- av_opt_find
- av_opt_find2
- av_opt_flag_is_set
- av_opt_free
- av_opt_freep_ranges
- av_opt_get
--av_opt_get_channel_layout
- av_opt_get_dict_val
- av_opt_get_double
- av_opt_get_image_size
- av_opt_get_int
- av_opt_get_key_value
- av_opt_get_pixel_fmt
- av_opt_get_q
- av_opt_get_sample_fmt
-@@ -239,17 +213,16 @@ av_opt_is_set_to_default
- av_opt_is_set_to_default_by_name
- av_opt_next
- av_opt_ptr
- av_opt_query_ranges
- av_opt_query_ranges_default
- av_opt_serialize
- av_opt_set
- av_opt_set_bin
--av_opt_set_channel_layout
- av_opt_set_defaults
- av_opt_set_defaults2
- av_opt_set_dict
- av_opt_set_dict2
- av_opt_set_dict_val
- av_opt_set_double
- av_opt_set_from_string
- av_opt_set_image_size
-diff --git a/media/ffvpx/libavutil/bprint.h b/media/ffvpx/libavutil/bprint.h
---- a/media/ffvpx/libavutil/bprint.h
-+++ b/media/ffvpx/libavutil/bprint.h
-@@ -167,29 +167,29 @@ void av_vbprintf(AVBPrint *buf, const ch
- /**
-  * Append char c n times to a print buffer.
-  */
- void av_bprint_chars(AVBPrint *buf, char c, unsigned n);
- 
- /**
-  * Append data to a print buffer.
-  *
-- * param buf  bprint buffer to use
-- * param data pointer to data
-- * param size size of data
-+ * @param buf  bprint buffer to use
-+ * @param data pointer to data
-+ * @param size size of data
-  */
- void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size);
- 
- struct tm;
- /**
-  * Append a formatted date and time to a print buffer.
-  *
-- * param buf  bprint buffer to use
-- * param fmt  date and time format string, see strftime()
-- * param tm   broken-down time structure to translate
-+ * @param buf  bprint buffer to use
-+ * @param fmt  date and time format string, see strftime()
-+ * @param tm   broken-down time structure to translate
-  *
-  * @note due to poor design of the standard strftime function, it may
-  * produce poor results if the format string expands to a very long text and
-  * the bprint buffer is near the limit stated by the size_max option.
-  */
- void av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm);
- 
- /**
-diff --git a/media/ffvpx/libavutil/channel_layout.c b/media/ffvpx/libavutil/channel_layout.c
---- a/media/ffvpx/libavutil/channel_layout.c
-+++ b/media/ffvpx/libavutil/channel_layout.c
-@@ -28,16 +28,17 @@
- #include <string.h>
- 
- #include "avassert.h"
- #include "channel_layout.h"
- #include "bprint.h"
- #include "common.h"
- #include "error.h"
- #include "macros.h"
-+#include "mem.h"
- #include "opt.h"
- 
- #define CHAN_IS_AMBI(x) ((x) >= AV_CHAN_AMBISONIC_BASE &&\
-                          (x) <= AV_CHAN_AMBISONIC_END)
- 
- struct channel_name {
-     const char *name;
-     const char *description;
-@@ -71,34 +72,30 @@ static const struct channel_name channel
-     [AV_CHAN_LOW_FREQUENCY_2      ] = { "LFE2",      "low frequency 2"       },
-     [AV_CHAN_TOP_SIDE_LEFT        ] = { "TSL",       "top side left"         },
-     [AV_CHAN_TOP_SIDE_RIGHT       ] = { "TSR",       "top side right"        },
-     [AV_CHAN_BOTTOM_FRONT_CENTER  ] = { "BFC",       "bottom front center"   },
-     [AV_CHAN_BOTTOM_FRONT_LEFT    ] = { "BFL",       "bottom front left"     },
-     [AV_CHAN_BOTTOM_FRONT_RIGHT   ] = { "BFR",       "bottom front right"    },
- };
- 
--static const char *get_channel_name(enum AVChannel channel_id)
--{
--    if ((unsigned) channel_id >= FF_ARRAY_ELEMS(channel_names) ||
--        !channel_names[channel_id].name)
--        return NULL;
--    return channel_names[channel_id].name;
--}
--
- void av_channel_name_bprint(AVBPrint *bp, enum AVChannel channel_id)
- {
-     if (channel_id >= AV_CHAN_AMBISONIC_BASE &&
-         channel_id <= AV_CHAN_AMBISONIC_END)
-         av_bprintf(bp, "AMBI%d", channel_id - AV_CHAN_AMBISONIC_BASE);
-     else if ((unsigned)channel_id < FF_ARRAY_ELEMS(channel_names) &&
-              channel_names[channel_id].name)
-         av_bprintf(bp, "%s", channel_names[channel_id].name);
-     else if (channel_id == AV_CHAN_NONE)
-         av_bprintf(bp, "NONE");
-+    else if (channel_id == AV_CHAN_UNKNOWN)
-+        av_bprintf(bp, "UNK");
-+    else if (channel_id == AV_CHAN_UNUSED)
-+        av_bprintf(bp, "UNSD");
-     else
-         av_bprintf(bp, "USR%d", channel_id);
- }
- 
- int av_channel_name(char *buf, size_t buf_size, enum AVChannel channel_id)
- {
-     AVBPrint bp;
- 
-@@ -118,16 +115,20 @@ void av_channel_description_bprint(AVBPr
-     if (channel_id >= AV_CHAN_AMBISONIC_BASE &&
-         channel_id <= AV_CHAN_AMBISONIC_END)
-         av_bprintf(bp, "ambisonic ACN %d", channel_id - AV_CHAN_AMBISONIC_BASE);
-     else if ((unsigned)channel_id < FF_ARRAY_ELEMS(channel_names) &&
-              channel_names[channel_id].description)
-         av_bprintf(bp, "%s", channel_names[channel_id].description);
-     else if (channel_id == AV_CHAN_NONE)
-         av_bprintf(bp, "none");
-+    else if (channel_id == AV_CHAN_UNKNOWN)
-+        av_bprintf(bp, "unknown");
-+    else if (channel_id == AV_CHAN_UNUSED)
-+        av_bprintf(bp, "unused");
-     else
-         av_bprintf(bp, "user %d", channel_id);
- }
- 
- int av_channel_description(char *buf, size_t buf_size, enum AVChannel channel_id)
- {
-     AVBPrint bp;
- 
-@@ -154,16 +155,21 @@ enum AVChannel av_channel_from_string(co
-             return AV_CHAN_NONE;
-         return AV_CHAN_AMBISONIC_BASE + i;
-     }
- 
-     for (i = 0; i < FF_ARRAY_ELEMS(channel_names); i++) {
-         if (channel_names[i].name && !strcmp(str, channel_names[i].name))
-             return i;
-     }
-+    if (!strcmp(str, "UNK"))
-+        return AV_CHAN_UNKNOWN;
-+    if (!strcmp(str, "UNSD"))
-+        return AV_CHAN_UNUSED;
-+
-     if (!strncmp(str, "USR", 3)) {
-         const char *p = str + 3;
-         id = strtol(p, &endptr, 0);
-     }
-     if (id >= 0 && !*endptr)
-         return id;
- 
-     return AV_CHAN_NONE;
-@@ -209,231 +215,116 @@ static const struct channel_layout_name 
-     { "7.1.4",          AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK  },
-     { "7.2.3",          AV_CHANNEL_LAYOUT_7POINT2POINT3       },
-     { "9.1.4",          AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK  },
-     { "hexadecagonal",  AV_CHANNEL_LAYOUT_HEXADECAGONAL       },
-     { "downmix",        AV_CHANNEL_LAYOUT_STEREO_DOWNMIX,     },
-     { "22.2",           AV_CHANNEL_LAYOUT_22POINT2,           },
- };
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--static uint64_t get_channel_layout_single(const char *name, int name_len)
--{
--    int i;
--    char *end;
--    int64_t layout;
--
--    for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++) {
--        if (strlen(channel_layout_map[i].name) == name_len &&
--            !memcmp(channel_layout_map[i].name, name, name_len))
--            return channel_layout_map[i].layout.u.mask;
--    }
--    for (i = 0; i < FF_ARRAY_ELEMS(channel_names); i++)
--        if (channel_names[i].name &&
--            strlen(channel_names[i].name) == name_len &&
--            !memcmp(channel_names[i].name, name, name_len))
--            return (int64_t)1 << i;
--
--    errno = 0;
--    i = strtol(name, &end, 10);
--
--    if (!errno && (end + 1 - name == name_len && *end  == 'c'))
--        return av_get_default_channel_layout(i);
--
--    errno = 0;
--    layout = strtoll(name, &end, 0);
--    if (!errno && end - name == name_len)
--        return FFMAX(layout, 0);
--    return 0;
--}
--
--uint64_t av_get_channel_layout(const char *name)
-+int av_channel_layout_custom_init(AVChannelLayout *channel_layout, int nb_channels)
- {
--    const char *n, *e;
--    const char *name_end = name + strlen(name);
--    int64_t layout = 0, layout_single;
--
--    for (n = name; n < name_end; n = e + 1) {
--        for (e = n; e < name_end && *e != '+' && *e != '|'; e++);
--        layout_single = get_channel_layout_single(n, e - n);
--        if (!layout_single)
--            return 0;
--        layout |= layout_single;
--    }
--    return layout;
--}
--
--int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels)
--{
--    int nb = 0;
--    char *end;
--    uint64_t layout = av_get_channel_layout(name);
--
--    if (layout) {
--        *channel_layout = layout;
--        *nb_channels = av_get_channel_layout_nb_channels(layout);
--        return 0;
--    }
--
--    nb = strtol(name, &end, 10);
--    if (!errno && *end  == 'C' && *(end + 1) == '\0' && nb > 0 && nb < 64) {
--        *channel_layout = 0;
--        *nb_channels = nb;
--        return 0;
--    }
--
--    return AVERROR(EINVAL);
--}
--
--void av_bprint_channel_layout(struct AVBPrint *bp,
--                              int nb_channels, uint64_t channel_layout)
--{
--    int i;
-+    AVChannelCustom *map;
- 
-     if (nb_channels <= 0)
--        nb_channels = av_get_channel_layout_nb_channels(channel_layout);
--
--    for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++)
--        if (nb_channels    == channel_layout_map[i].layout.nb_channels &&
--            channel_layout == channel_layout_map[i].layout.u.mask) {
--            av_bprintf(bp, "%s", channel_layout_map[i].name);
--            return;
--        }
-+        return AVERROR(EINVAL);
- 
--    av_bprintf(bp, "%d channels", nb_channels);
--    if (channel_layout) {
--        int i, ch;
--        av_bprintf(bp, " (");
--        for (i = 0, ch = 0; i < 64; i++) {
--            if ((channel_layout & (UINT64_C(1) << i))) {
--                const char *name = get_channel_name(i);
--                if (name) {
--                    if (ch > 0)
--                        av_bprintf(bp, "+");
--                    av_bprintf(bp, "%s", name);
--                }
--                ch++;
--            }
--        }
--        av_bprintf(bp, ")");
--    }
--}
-+    map = av_calloc(nb_channels, sizeof(*channel_layout->u.map));
-+    if (!map)
-+        return AVERROR(ENOMEM);
-+    for (int i = 0; i < nb_channels; i++)
-+        map[i].id = AV_CHAN_UNKNOWN;
- 
--void av_get_channel_layout_string(char *buf, int buf_size,
--                                  int nb_channels, uint64_t channel_layout)
--{
--    AVBPrint bp;
--
--    av_bprint_init_for_buffer(&bp, buf, buf_size);
--    av_bprint_channel_layout(&bp, nb_channels, channel_layout);
--}
-+    channel_layout->order       = AV_CHANNEL_ORDER_CUSTOM;
-+    channel_layout->nb_channels = nb_channels;
-+    channel_layout->u.map       = map;
- 
--int av_get_channel_layout_nb_channels(uint64_t channel_layout)
--{
--    return av_popcount64(channel_layout);
--}
--
--int64_t av_get_default_channel_layout(int nb_channels) {
--    int i;
--    for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++)
--        if (nb_channels == channel_layout_map[i].layout.nb_channels)
--            return channel_layout_map[i].layout.u.mask;
-     return 0;
- }
- 
--int av_get_channel_layout_channel_index(uint64_t channel_layout,
--                                        uint64_t channel)
--{
--    if (!(channel_layout & channel) ||
--        av_get_channel_layout_nb_channels(channel) != 1)
--        return AVERROR(EINVAL);
--    channel_layout &= channel - 1;
--    return av_get_channel_layout_nb_channels(channel_layout);
--}
--
--const char *av_get_channel_name(uint64_t channel)
--{
--    int i;
--    if (av_get_channel_layout_nb_channels(channel) != 1)
--        return NULL;
--    for (i = 0; i < 64; i++)
--        if ((1ULL<<i) & channel)
--            return get_channel_name(i);
--    return NULL;
--}
--
--const char *av_get_channel_description(uint64_t channel)
--{
--    int i;
--    if (av_get_channel_layout_nb_channels(channel) != 1)
--        return NULL;
--    for (i = 0; i < FF_ARRAY_ELEMS(channel_names); i++)
--        if ((1ULL<<i) & channel)
--            return channel_names[i].description;
--    return NULL;
--}
--
--uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index)
--{
--    int i;
--
--    if (av_get_channel_layout_nb_channels(channel_layout) <= index)
--        return 0;
--
--    for (i = 0; i < 64; i++) {
--        if ((1ULL << i) & channel_layout && !index--)
--            return 1ULL << i;
--    }
--    return 0;
--}
--
--int av_get_standard_channel_layout(unsigned index, uint64_t *layout,
--                                   const char **name)
--{
--    if (index >= FF_ARRAY_ELEMS(channel_layout_map))
--        return AVERROR_EOF;
--    if (layout) *layout = channel_layout_map[index].layout.u.mask;
--    if (name)   *name   = channel_layout_map[index].name;
--    return 0;
--}
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
- int av_channel_layout_from_mask(AVChannelLayout *channel_layout,
-                                 uint64_t mask)
- {
-     if (!mask)
-         return AVERROR(EINVAL);
- 
-     channel_layout->order       = AV_CHANNEL_ORDER_NATIVE;
-     channel_layout->nb_channels = av_popcount64(mask);
-     channel_layout->u.mask      = mask;
- 
-     return 0;
- }
- 
-+static int parse_channel_list(AVChannelLayout *ch_layout, const char *str)
-+{
-+    int ret;
-+    int nb_channels = 0;
-+    AVChannelCustom *map = NULL;
-+    AVChannelCustom custom = {0};
-+
-+    while (*str) {
-+        char *channel, *chname;
-+        int ret = av_opt_get_key_value(&str, "@", "+", AV_OPT_FLAG_IMPLICIT_KEY, &channel, &chname);
-+        if (ret < 0) {
-+            av_freep(&map);
-+            return ret;
-+        }
-+        if (*str)
-+            str++; // skip separator
-+        if (!channel) {
-+            channel = chname;
-+            chname = NULL;
-+        }
-+        av_strlcpy(custom.name, chname ? chname : "", sizeof(custom.name));
-+        custom.id = av_channel_from_string(channel);
-+        av_free(channel);
-+        av_free(chname);
-+        if (custom.id == AV_CHAN_NONE) {
-+            av_freep(&map);
-+            return AVERROR(EINVAL);
-+        }
-+
-+        av_dynarray2_add((void **)&map, &nb_channels, sizeof(custom), (void *)&custom);
-+        if (!map)
-+            return AVERROR(ENOMEM);
-+    }
-+
-+    if (!nb_channels)
-+        return AVERROR(EINVAL);
-+
-+    ch_layout->order = AV_CHANNEL_ORDER_CUSTOM;
-+    ch_layout->u.map = map;
-+    ch_layout->nb_channels = nb_channels;
-+
-+    ret = av_channel_layout_retype(ch_layout, 0, AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL);
-+    av_assert0(ret == 0);
-+
-+    return 0;
-+}
-+
- int av_channel_layout_from_string(AVChannelLayout *channel_layout,
-                                   const char *str)
- {
--    int i;
--    int channels = 0, nb_channels = 0, native = 1;
--    enum AVChannel highest_channel = AV_CHAN_NONE;
--    const char *dup;
-+    int i, matches, ret;
-+    int channels = 0, nb_channels = 0;
-     char *chlist, *end;
-     uint64_t mask = 0;
- 
-     /* channel layout names */
-     for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++) {
-         if (channel_layout_map[i].name && !strcmp(str, channel_layout_map[i].name)) {
-             *channel_layout = channel_layout_map[i].layout;
-             return 0;
-         }
-     }
- 
-+    /* This function is a channel layout initializer, so we have to
-+     * zero-initialize before we start setting fields individually. */
-+    memset(channel_layout, 0, sizeof(*channel_layout));
-+
-     /* ambisonic */
-     if (!strncmp(str, "ambisonic ", 10)) {
-         const char *p = str + 10;
-         char *endptr;
-         AVChannelLayout extra = {0};
-         int order;
- 
-         order = strtol(p, &endptr, 0);
-@@ -465,16 +356,17 @@ int av_channel_layout_from_string(AVChan
-                     return AVERROR(ENOMEM);
-                 }
- 
-                 for (i = 0; i < channel_layout->nb_channels; i++)
-                     channel_layout->u.map[i].id = AV_CHAN_AMBISONIC_BASE + i;
-                 for (i = 0; i < extra.nb_channels; i++) {
-                     enum AVChannel ch = av_channel_layout_channel_from_index(&extra, i);
-                     if (CHAN_IS_AMBI(ch)) {
-+                        av_channel_layout_uninit(channel_layout);
-                         av_channel_layout_uninit(&extra);
-                         return AVERROR(EINVAL);
-                     }
-                     channel_layout->u.map[channel_layout->nb_channels + i].id = ch;
-                     if (extra.order == AV_CHANNEL_ORDER_CUSTOM &&
-                         extra.u.map[i].name[0])
-                         av_strlcpy(channel_layout->u.map[channel_layout->nb_channels + i].name,
-                                    extra.u.map[i].name,
-@@ -488,132 +380,31 @@ int av_channel_layout_from_string(AVChan
-         return 0;
-     }
- 
-     chlist = av_strdup(str);
-     if (!chlist)
-         return AVERROR(ENOMEM);
- 
-     /* channel names */
--    av_sscanf(str, "%d channels (%[^)]", &nb_channels, chlist);
--    end = strchr(str, ')');
--
--    dup = chlist;
--    while (*dup) {
--        char *channel, *chname;
--        int ret = av_opt_get_key_value(&dup, "@", "+", AV_OPT_FLAG_IMPLICIT_KEY, &channel, &chname);
--        if (ret < 0) {
--            av_free(chlist);
--            return ret;
--        }
--        if (*dup)
--            dup++; // skip separator
--        if (channel && !*channel)
--            av_freep(&channel);
--        for (i = 0; i < FF_ARRAY_ELEMS(channel_names); i++) {
--            if (channel_names[i].name && !strcmp(channel ? channel : chname, channel_names[i].name)) {
--                if (channel || i < highest_channel || mask & (1ULL << i))
--                    native = 0; // Not a native layout, use a custom one
--                highest_channel = i;
--                mask |= 1ULL << i;
--                break;
--            }
--        }
--
--        if (!channel && i >= FF_ARRAY_ELEMS(channel_names)) {
--            char *endptr = chname;
--            enum AVChannel id = AV_CHAN_NONE;
-+    matches = av_sscanf(str, "%d channels (%[^)]", &nb_channels, chlist);
-+    ret = parse_channel_list(channel_layout, chlist);
-+    av_freep(&chlist);
-+    if (ret < 0 && ret != AVERROR(EINVAL))
-+        return ret;
- 
--            if (!strncmp(chname, "USR", 3)) {
--                const char *p = chname + 3;
--                id = strtol(p, &endptr, 0);
--            }
--            if (id < 0 || *endptr) {
--                native = 0; // Unknown channel name
--                channels = 0;
--                mask = 0;
--                av_free(chname);
--                break;
--            }
--            if (id > 63)
--                native = 0; // Not a native layout, use a custom one
--            else {
--                if (id < highest_channel || mask & (1ULL << id))
--                    native = 0; // Not a native layout, use a custom one
--                highest_channel = id;
--                mask |= 1ULL << id;
--            }
-+    if (ret >= 0) {
-+        end = strchr(str, ')');
-+        if (matches == 2 && (nb_channels != channel_layout->nb_channels || !end || *++end)) {
-+            av_channel_layout_uninit(channel_layout);
-+            return AVERROR(EINVAL);
-         }
--        channels++;
--        av_free(channel);
--        av_free(chname);
--    }
--
--    if (mask && native) {
--        av_free(chlist);
--        if (nb_channels && ((nb_channels != channels) || (!end || *++end)))
--            return AVERROR(EINVAL);
--        av_channel_layout_from_mask(channel_layout, mask);
-         return 0;
-     }
- 
--    /* custom layout of channel names */
--    if (channels && !native) {
--        int idx = 0;
--
--        if (nb_channels && ((nb_channels != channels) || (!end || *++end))) {
--            av_free(chlist);
--            return AVERROR(EINVAL);
--        }
--
--        channel_layout->u.map = av_calloc(channels, sizeof(*channel_layout->u.map));
--        if (!channel_layout->u.map) {
--            av_free(chlist);
--            return AVERROR(ENOMEM);
--        }
--
--        channel_layout->order = AV_CHANNEL_ORDER_CUSTOM;
--        channel_layout->nb_channels = channels;
--
--        dup = chlist;
--        while (*dup) {
--            char *channel, *chname;
--            int ret = av_opt_get_key_value(&dup, "@", "+", AV_OPT_FLAG_IMPLICIT_KEY, &channel, &chname);
--            if (ret < 0) {
--                av_freep(&channel_layout->u.map);
--                av_free(chlist);
--                return ret;
--            }
--            if (*dup)
--                dup++; // skip separator
--            for (i = 0; i < FF_ARRAY_ELEMS(channel_names); i++) {
--                if (channel_names[i].name && !strcmp(channel ? channel : chname, channel_names[i].name)) {
--                    channel_layout->u.map[idx].id = i;
--                    if (channel)
--                        av_strlcpy(channel_layout->u.map[idx].name, chname, sizeof(channel_layout->u.map[idx].name));
--                    idx++;
--                    break;
--                }
--            }
--            if (i >= FF_ARRAY_ELEMS(channel_names)) {
--                const char *p = (channel ? channel : chname) + 3;
--                channel_layout->u.map[idx].id = strtol(p, NULL, 0);
--                if (channel)
--                    av_strlcpy(channel_layout->u.map[idx].name, chname, sizeof(channel_layout->u.map[idx].name));
--                idx++;
--            }
--            av_free(channel);
--            av_free(chname);
--        }
--        av_free(chlist);
--
--        return 0;
--    }
--    av_freep(&chlist);
--
-     errno = 0;
-     mask = strtoull(str, &end, 0);
- 
-     /* channel layout mask */
-     if (!errno && !*end && !strchr(str, '-') && mask) {
-         av_channel_layout_from_mask(channel_layout, mask);
-         return 0;
-     }
-@@ -654,16 +445,39 @@ int av_channel_layout_copy(AVChannelLayo
-         dst->u.map = av_malloc_array(src->nb_channels, sizeof(*dst->u.map));
-         if (!dst->u.map)
-             return AVERROR(ENOMEM);
-         memcpy(dst->u.map, src->u.map, src->nb_channels * sizeof(*src->u.map));
-     }
-     return 0;
- }
- 
-+static int64_t masked_description(const AVChannelLayout *channel_layout, int start_channel)
-+{
-+    uint64_t mask = 0;
-+    for (int i = start_channel; i < channel_layout->nb_channels; i++) {
-+        enum AVChannel ch = channel_layout->u.map[i].id;
-+        if (ch >= 0 && ch < 63 && mask < (1ULL << ch))
-+            mask |= (1ULL << ch);
-+        else
-+            return AVERROR(EINVAL);
-+    }
-+    return mask;
-+}
-+
-+static int has_channel_names(const AVChannelLayout *channel_layout)
-+{
-+    if (channel_layout->order != AV_CHANNEL_ORDER_CUSTOM)
-+        return 0;
-+    for (int i = 0; i < channel_layout->nb_channels; i++)
-+        if (channel_layout->u.map[i].name[0])
-+            return 1;
-+    return 0;
-+}
-+
- /**
-  * If the layout is n-th order standard-order ambisonic, with optional
-  * extra non-diegetic channels at the end, return the order.
-  * Return a negative error code otherwise.
-  */
- static int ambisonic_order(const AVChannelLayout *channel_layout)
- {
-     int i, highest_ambi, order;
-@@ -697,16 +511,43 @@ static int ambisonic_order(const AVChann
-     order = floor(sqrt(highest_ambi));
-     /* incomplete order - some harmonics are missing */
-     if ((order + 1) * (order + 1) != highest_ambi + 1)
-         return AVERROR(EINVAL);
- 
-     return order;
- }
- 
-+static enum AVChannelOrder canonical_order(AVChannelLayout *channel_layout)
-+{
-+    int has_known_channel = 0;
-+    int order;
-+
-+    if (channel_layout->order != AV_CHANNEL_ORDER_CUSTOM)
-+        return channel_layout->order;
-+
-+    if (has_channel_names(channel_layout))
-+        return AV_CHANNEL_ORDER_CUSTOM;
-+
-+    for (int i = 0; i < channel_layout->nb_channels && !has_known_channel; i++)
-+        if (channel_layout->u.map[i].id != AV_CHAN_UNKNOWN)
-+            has_known_channel = 1;
-+    if (!has_known_channel)
-+        return AV_CHANNEL_ORDER_UNSPEC;
-+
-+    if (masked_description(channel_layout, 0) > 0)
-+        return AV_CHANNEL_ORDER_NATIVE;
-+
-+    order = ambisonic_order(channel_layout);
-+    if (order >= 0 && masked_description(channel_layout, (order + 1) * (order + 1)) >= 0)
-+        return AV_CHANNEL_ORDER_AMBISONIC;
-+
-+    return AV_CHANNEL_ORDER_CUSTOM;
-+}
-+
- /**
-  * If the custom layout is n-th order standard-order ambisonic, with optional
-  * extra non-diegetic channels at the end, write its string description in bp.
-  * Return a negative error code otherwise.
-  */
- static int try_describe_ambisonic(AVBPrint *bp, const AVChannelLayout *channel_layout)
- {
-     int nb_ambi_channels;
-@@ -721,19 +562,27 @@ static int try_describe_ambisonic(AVBPri
-     if (nb_ambi_channels < channel_layout->nb_channels) {
-         AVChannelLayout extra = { 0 };
- 
-         if (channel_layout->order == AV_CHANNEL_ORDER_AMBISONIC) {
-             extra.order       = AV_CHANNEL_ORDER_NATIVE;
-             extra.nb_channels = av_popcount64(channel_layout->u.mask);
-             extra.u.mask      = channel_layout->u.mask;
-         } else {
--            extra.order       = AV_CHANNEL_ORDER_CUSTOM;
--            extra.nb_channels = channel_layout->nb_channels - nb_ambi_channels;
--            extra.u.map       = channel_layout->u.map + nb_ambi_channels;
-+            int64_t mask;
-+            if (!has_channel_names(channel_layout) &&
-+                (mask = masked_description(channel_layout, nb_ambi_channels)) > 0) {
-+                extra.order       = AV_CHANNEL_ORDER_NATIVE;
-+                extra.nb_channels = av_popcount64(mask);
-+                extra.u.mask      = mask;
-+            } else {
-+                extra.order       = AV_CHANNEL_ORDER_CUSTOM;
-+                extra.nb_channels = channel_layout->nb_channels - nb_ambi_channels;
-+                extra.u.map       = channel_layout->u.map + nb_ambi_channels;
-+            }
-         }
- 
-         av_bprint_chars(bp, '+', 1);
-         av_channel_layout_describe_bprint(&extra, bp);
-         /* Not calling uninit here on extra because we don't own the u.map pointer */
-     }
- 
-     return 0;
-@@ -749,19 +598,27 @@ int av_channel_layout_describe_bprint(co
-         for (i = 0; i < FF_ARRAY_ELEMS(channel_layout_map); i++)
-             if (channel_layout->u.mask == channel_layout_map[i].layout.u.mask) {
-                 av_bprintf(bp, "%s", channel_layout_map[i].name);
-                 return 0;
-             }
-         // fall-through
-     case AV_CHANNEL_ORDER_CUSTOM:
-         if (channel_layout->order == AV_CHANNEL_ORDER_CUSTOM) {
-+            int64_t mask;
-             int res = try_describe_ambisonic(bp, channel_layout);
-             if (res >= 0)
-                 return 0;
-+            if (!has_channel_names(channel_layout) &&
-+                (mask = masked_description(channel_layout, 0)) > 0) {
-+                AVChannelLayout native = { .order       = AV_CHANNEL_ORDER_NATIVE,
-+                                           .nb_channels = av_popcount64(mask),
-+                                           .u.mask      = mask };
-+                return av_channel_layout_describe_bprint(&native, bp);
-+            }
-         }
-         if (channel_layout->nb_channels)
-             av_bprintf(bp, "%d channels (", channel_layout->nb_channels);
-         for (i = 0; i < channel_layout->nb_channels; i++) {
-             enum AVChannel ch = av_channel_layout_channel_from_index(channel_layout, i);
- 
-             if (i)
-                 av_bprintf(bp, "+");
-@@ -1011,8 +868,102 @@ uint64_t av_channel_layout_subset(const 
-         for (i = 0; i < 64; i++)
-             if (mask & (1ULL << i) && av_channel_layout_index_from_channel(channel_layout, i) >= 0)
-                 ret |= (1ULL << i);
-         break;
-     }
- 
-     return ret;
- }
-+
-+int av_channel_layout_retype(AVChannelLayout *channel_layout, enum AVChannelOrder order, int flags)
-+{
-+    int allow_lossy = !(flags & AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS);
-+    int lossy;
-+
-+    if (!av_channel_layout_check(channel_layout))
-+        return AVERROR(EINVAL);
-+
-+    if (flags & AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL)
-+        order = canonical_order(channel_layout);
-+
-+    if (channel_layout->order == order)
-+        return 0;
-+
-+    switch (order) {
-+    case AV_CHANNEL_ORDER_UNSPEC: {
-+        int nb_channels = channel_layout->nb_channels;
-+        if (channel_layout->order == AV_CHANNEL_ORDER_CUSTOM) {
-+            lossy = 0;
-+            for (int i = 0; i < nb_channels; i++) {
-+                if (channel_layout->u.map[i].id != AV_CHAN_UNKNOWN || channel_layout->u.map[i].name[0]) {
-+                    lossy = 1;
-+                    break;
-+                }
-+            }
-+        } else {
-+            lossy = 1;
-+        }
-+        if (!lossy || allow_lossy) {
-+            void *opaque = channel_layout->opaque;
-+            av_channel_layout_uninit(channel_layout);
-+            channel_layout->order       = AV_CHANNEL_ORDER_UNSPEC;
-+            channel_layout->nb_channels = nb_channels;
-+            channel_layout->opaque      = opaque;
-+            return lossy;
-+        }
-+        return AVERROR(ENOSYS);
-+        }
-+    case AV_CHANNEL_ORDER_NATIVE:
-+        if (channel_layout->order == AV_CHANNEL_ORDER_CUSTOM) {
-+            int64_t mask = masked_description(channel_layout, 0);
-+            if (mask < 0)
-+                return AVERROR(ENOSYS);
-+            lossy = has_channel_names(channel_layout);
-+            if (!lossy || allow_lossy) {
-+                void *opaque = channel_layout->opaque;
-+                av_channel_layout_uninit(channel_layout);
-+                av_channel_layout_from_mask(channel_layout, mask);
-+                channel_layout->opaque = opaque;
-+                return lossy;
-+            }
-+        }
-+        return AVERROR(ENOSYS);
-+    case AV_CHANNEL_ORDER_CUSTOM: {
-+        AVChannelLayout custom = { 0 };
-+        int ret = av_channel_layout_custom_init(&custom, channel_layout->nb_channels);
-+        void *opaque = channel_layout->opaque;
-+        if (ret < 0)
-+            return ret;
-+        if (channel_layout->order != AV_CHANNEL_ORDER_UNSPEC)
-+            for (int i = 0; i < channel_layout->nb_channels; i++)
-+                custom.u.map[i].id = av_channel_layout_channel_from_index(channel_layout, i);
-+        av_channel_layout_uninit(channel_layout);
-+        *channel_layout = custom;
-+        channel_layout->opaque = opaque;
-+        return 0;
-+        }
-+    case AV_CHANNEL_ORDER_AMBISONIC:
-+        if (channel_layout->order == AV_CHANNEL_ORDER_CUSTOM) {
-+            int64_t mask;
-+            int nb_channels = channel_layout->nb_channels;
-+            int order = ambisonic_order(channel_layout);
-+            if (order < 0)
-+                return AVERROR(ENOSYS);
-+            mask = masked_description(channel_layout, (order + 1) * (order + 1));
-+            if (mask < 0)
-+                return AVERROR(ENOSYS);
-+            lossy = has_channel_names(channel_layout);
-+            if (!lossy || allow_lossy) {
-+                void *opaque = channel_layout->opaque;
-+                av_channel_layout_uninit(channel_layout);
-+                channel_layout->order       = AV_CHANNEL_ORDER_AMBISONIC;
-+                channel_layout->nb_channels = nb_channels;
-+                channel_layout->u.mask      = mask;
-+                channel_layout->opaque      = opaque;
-+                return lossy;
-+            }
-+        }
-+        return AVERROR(ENOSYS);
-+    default:
-+        return AVERROR(EINVAL);
-+    }
-+}
-diff --git a/media/ffvpx/libavutil/channel_layout.h b/media/ffvpx/libavutil/channel_layout.h
---- a/media/ffvpx/libavutil/channel_layout.h
-+++ b/media/ffvpx/libavutil/channel_layout.h
-@@ -114,17 +114,17 @@ enum AVChannelOrder {
-      * The native channel order, i.e. the channels are in the same order in
-      * which they are defined in the AVChannel enum. This supports up to 63
-      * different channels.
-      */
-     AV_CHANNEL_ORDER_NATIVE,
-     /**
-      * The channel order does not correspond to any other predefined order and
-      * is stored as an explicit map. For example, this could be used to support
--     * layouts with 64 or more channels, or with empty/skipped (AV_CHAN_SILENCE)
-+     * layouts with 64 or more channels, or with empty/skipped (AV_CHAN_UNUSED)
-      * channels at arbitrary positions.
-      */
-     AV_CHANNEL_ORDER_CUSTOM,
-     /**
-      * The audio is represented as the decomposition of the sound field into
-      * spherical harmonics. Each channel corresponds to a single expansion
-      * component. Channels are ordered according to ACN (Ambisonic Channel
-      * Number).
-@@ -141,16 +141,20 @@ enum AVChannelOrder {
-      * @code{.unparsed}
-      *   n = l * (l + 1) + m.
-      * @endcode
-      *
-      * Normalization is assumed to be SN3D (Schmidt Semi-Normalization)
-      * as defined in AmbiX format $ 2.1.
-      */
-     AV_CHANNEL_ORDER_AMBISONIC,
-+    /**
-+     * Number of channel orders, not part of ABI/API
-+     */
-+    FF_CHANNEL_ORDER_NB
- };
- 
- 
- /**
-  * @defgroup channel_masks Audio channel masks
-  *
-  * A channel layout is a 64-bits integer with a bit set for every channel.
-  * The number of bits set must be equal to the number of channels.
-@@ -187,26 +191,16 @@ enum AVChannelOrder {
- #define AV_CH_SURROUND_DIRECT_RIGHT  (1ULL << AV_CHAN_SURROUND_DIRECT_RIGHT)
- #define AV_CH_LOW_FREQUENCY_2        (1ULL << AV_CHAN_LOW_FREQUENCY_2      )
- #define AV_CH_TOP_SIDE_LEFT          (1ULL << AV_CHAN_TOP_SIDE_LEFT        )
- #define AV_CH_TOP_SIDE_RIGHT         (1ULL << AV_CHAN_TOP_SIDE_RIGHT       )
- #define AV_CH_BOTTOM_FRONT_CENTER    (1ULL << AV_CHAN_BOTTOM_FRONT_CENTER  )
- #define AV_CH_BOTTOM_FRONT_LEFT      (1ULL << AV_CHAN_BOTTOM_FRONT_LEFT    )
- #define AV_CH_BOTTOM_FRONT_RIGHT     (1ULL << AV_CHAN_BOTTOM_FRONT_RIGHT   )
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--/** Channel mask value used for AVCodecContext.request_channel_layout
--    to indicate that the user requests the channel order of the decoder output
--    to be the native codec channel order.
--    @deprecated channel order is now indicated in a special field in
--                AVChannelLayout
--    */
--#define AV_CH_LAYOUT_NATIVE          0x8000000000000000ULL
--#endif
--
- /**
-  * @}
-  * @defgroup channel_mask_c Audio channel layouts
-  * @{
-  * */
- #define AV_CH_LAYOUT_MONO              (AV_CH_FRONT_CENTER)
- #define AV_CH_LAYOUT_STEREO            (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)
- #define AV_CH_LAYOUT_2POINT1           (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY)
-@@ -425,156 +419,16 @@ typedef struct AVChannelLayout {
-     { /* .order */ AV_CHANNEL_ORDER_AMBISONIC, \
-       /* .nb_channels */ 4, \
-       /* .u.mask */ { 0 }, \
-       /* .opaque */ NULL }
- /** @} */
- 
- struct AVBPrint;
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--/**
-- * @name Deprecated Functions
-- * @{
-- */
--
--/**
-- * Return a channel layout id that matches name, or 0 if no match is found.
-- *
-- * name can be one or several of the following notations,
-- * separated by '+' or '|':
-- * - the name of an usual channel layout (mono, stereo, 4.0, quad, 5.0,
-- *   5.0(side), 5.1, 5.1(side), 7.1, 7.1(wide), downmix);
-- * - the name of a single channel (FL, FR, FC, LFE, BL, BR, FLC, FRC, BC,
-- *   SL, SR, TC, TFL, TFC, TFR, TBL, TBC, TBR, DL, DR);
-- * - a number of channels, in decimal, followed by 'c', yielding
-- *   the default channel layout for that number of channels (@see
-- *   av_get_default_channel_layout);
-- * - a channel layout mask, in hexadecimal starting with "0x" (see the
-- *   AV_CH_* macros).
-- *
-- * Example: "stereo+FC" = "2c+FC" = "2c+1c" = "0x7"
-- *
-- * @deprecated use av_channel_layout_from_string()
-- */
--attribute_deprecated
--uint64_t av_get_channel_layout(const char *name);
--
--/**
-- * Return a channel layout and the number of channels based on the specified name.
-- *
-- * This function is similar to (@see av_get_channel_layout), but can also parse
-- * unknown channel layout specifications.
-- *
-- * @param[in]  name             channel layout specification string
-- * @param[out] channel_layout   parsed channel layout (0 if unknown)
-- * @param[out] nb_channels      number of channels
-- *
-- * @return 0 on success, AVERROR(EINVAL) if the parsing fails.
-- * @deprecated use av_channel_layout_from_string()
-- */
--attribute_deprecated
--int av_get_extended_channel_layout(const char *name, uint64_t* channel_layout, int* nb_channels);
--
--/**
-- * Return a description of a channel layout.
-- * If nb_channels is <= 0, it is guessed from the channel_layout.
-- *
-- * @param buf put here the string containing the channel layout
-- * @param buf_size size in bytes of the buffer
-- * @param nb_channels number of channels
-- * @param channel_layout channel layout bitset
-- * @deprecated use av_channel_layout_describe()
-- */
--attribute_deprecated
--void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout);
--
--/**
-- * Append a description of a channel layout to a bprint buffer.
-- * @deprecated use av_channel_layout_describe()
-- */
--attribute_deprecated
--void av_bprint_channel_layout(struct AVBPrint *bp, int nb_channels, uint64_t channel_layout);
--
--/**
-- * Return the number of channels in the channel layout.
-- * @deprecated use AVChannelLayout.nb_channels
-- */
--attribute_deprecated
--int av_get_channel_layout_nb_channels(uint64_t channel_layout);
--
--/**
-- * Return default channel layout for a given number of channels.
-- *
-- * @deprecated use av_channel_layout_default()
-- */
--attribute_deprecated
--int64_t av_get_default_channel_layout(int nb_channels);
--
--/**
-- * Get the index of a channel in channel_layout.
-- *
-- * @param channel_layout channel layout bitset
-- * @param channel a channel layout describing exactly one channel which must be
-- *                present in channel_layout.
-- *
-- * @return index of channel in channel_layout on success, a negative AVERROR
-- *         on error.
-- *
-- * @deprecated use av_channel_layout_index_from_channel()
-- */
--attribute_deprecated
--int av_get_channel_layout_channel_index(uint64_t channel_layout,
--                                        uint64_t channel);
--
--/**
-- * Get the channel with the given index in channel_layout.
-- * @deprecated use av_channel_layout_channel_from_index()
-- */
--attribute_deprecated
--uint64_t av_channel_layout_extract_channel(uint64_t channel_layout, int index);
--
--/**
-- * Get the name of a given channel.
-- *
-- * @return channel name on success, NULL on error.
-- *
-- * @deprecated use av_channel_name()
-- */
--attribute_deprecated
--const char *av_get_channel_name(uint64_t channel);
--
--/**
-- * Get the description of a given channel.
-- *
-- * @param channel  a channel layout with a single channel
-- * @return  channel description on success, NULL on error
-- * @deprecated use av_channel_description()
-- */
--attribute_deprecated
--const char *av_get_channel_description(uint64_t channel);
--
--/**
-- * Get the value and name of a standard channel layout.
-- *
-- * @param[in]  index   index in an internal list, starting at 0
-- * @param[out] layout  channel layout mask
-- * @param[out] name    name of the layout
-- * @return  0  if the layout exists,
-- *          <0 if index is beyond the limits
-- * @deprecated use av_channel_layout_standard()
-- */
--attribute_deprecated
--int av_get_standard_channel_layout(unsigned index, uint64_t *layout,
--                                   const char **name);
--/**
-- * @}
-- */
--#endif
--
- /**
-  * Get a human readable string in an abbreviated form describing a given channel.
-  * This is the inverse function of @ref av_channel_from_string().
-  *
-  * @param buf pre-allocated buffer where to put the generated string
-  * @param buf_size size in bytes of the buffer.
-  * @param channel the AVChannel whose name to get
-  * @return amount of bytes needed to hold the output string, or a negative AVERROR
-@@ -613,16 +467,33 @@ void av_channel_description_bprint(struc
-  * This is the inverse function of @ref av_channel_name().
-  *
-  * @return the channel with the given name
-  *         AV_CHAN_NONE when name does not identify a known channel
-  */
- enum AVChannel av_channel_from_string(const char *name);
- 
- /**
-+ * Initialize a custom channel layout with the specified number of channels.
-+ * The channel map will be allocated and the designation of all channels will
-+ * be set to AV_CHAN_UNKNOWN.
-+ *
-+ * This is only a convenience helper function, a custom channel layout can also
-+ * be constructed without using this.
-+ *
-+ * @param channel_layout the layout structure to be initialized
-+ * @param nb_channels the number of channels
-+ *
-+ * @return 0 on success
-+ *         AVERROR(EINVAL) if the number of channels <= 0
-+ *         AVERROR(ENOMEM) if the channel map could not be allocated
-+ */
-+int av_channel_layout_custom_init(AVChannelLayout *channel_layout, int nb_channels);
-+
-+/**
-  * Initialize a native channel layout from a bitmask indicating which channels
-  * are present.
-  *
-  * @param channel_layout the layout structure to be initialized
-  * @param mask bitmask describing the channel layout
-  *
-  * @return 0 on success
-  *         AVERROR(EINVAL) for invalid mask values
-@@ -636,20 +507,24 @@ int av_channel_layout_from_mask(AVChanne
-  *  - single or multiple channel names (returned by av_channel_name(), eg. "FL",
-  *    or concatenated with "+", each optionally containing a custom name after
-  *    a "@", eg. "FL@Left+FR@Right+LFE")
-  *  - a decimal or hexadecimal value of a native channel layout (eg. "4" or "0x4")
-  *  - the number of channels with default layout (eg. "4c")
-  *  - the number of unordered channels (eg. "4C" or "4 channels")
-  *  - the ambisonic order followed by optional non-diegetic channels (eg.
-  *    "ambisonic 2+stereo")
-+ * On error, the channel layout will remain uninitialized, but not necessarily
-+ * untouched.
-  *
-- * @param channel_layout input channel layout
-+ * @param channel_layout uninitialized channel layout for the result
-  * @param str string describing the channel layout
-- * @return 0 channel layout was detected, AVERROR_INVALIDATATA otherwise
-+ * @return 0 on success parsing the channel layout
-+ *         AVERROR(EINVAL) if an invalid channel layout string was provided
-+ *         AVERROR(ENOMEM) if there was not enough memory
-  */
- int av_channel_layout_from_string(AVChannelLayout *channel_layout,
-                                   const char *str);
- 
- /**
-  * Get the default channel layout for a given number of channels.
-  *
-  * @param ch_layout the layout structure to be initialized
-@@ -800,12 +675,59 @@ int av_channel_layout_check(const AVChan
-  * @param chl input channel layout
-  * @param chl1 input channel layout
-  * @return 0 if chl and chl1 are equal, 1 if they are not equal. A negative
-  *         AVERROR code if one or both are invalid.
-  */
- int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1);
- 
- /**
-+ * The conversion must be lossless.
-+ */
-+#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS (1 << 0)
-+
-+/**
-+ * The specified retype target order is ignored and the simplest possible
-+ * (canonical) order is used for which the input layout can be losslessy
-+ * represented.
-+ */
-+#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL (1 << 1)
-+
-+/**
-+ * Change the AVChannelOrder of a channel layout.
-+ *
-+ * Change of AVChannelOrder can be either lossless or lossy. In case of a
-+ * lossless conversion all the channel designations and the associated channel
-+ * names (if any) are kept. On a lossy conversion the channel names and channel
-+ * designations might be lost depending on the capabilities of the desired
-+ * AVChannelOrder. Note that some conversions are simply not possible in which
-+ * case this function returns AVERROR(ENOSYS).
-+ *
-+ * The following conversions are supported:
-+ *
-+ * Any       -> Custom     : Always possible, always lossless.
-+ * Any       -> Unspecified: Always possible, lossless if channel designations
-+ *   are all unknown and channel names are not used, lossy otherwise.
-+ * Custom    -> Ambisonic  : Possible if it contains ambisonic channels with
-+ *   optional non-diegetic channels in the end. Lossy if the channels have
-+ *   custom names, lossless otherwise.
-+ * Custom    -> Native     : Possible if it contains native channels in native
-+ *     order. Lossy if the channels have custom names, lossless otherwise.
-+ *
-+ * On error this function keeps the original channel layout untouched.
-+ *
-+ * @param channel_layout channel layout which will be changed
-+ * @param order the desired channel layout order
-+ * @param flags a combination of AV_CHANNEL_LAYOUT_RETYPE_FLAG_* constants
-+ * @return 0 if the conversion was successful and lossless or if the channel
-+ *           layout was already in the desired order
-+ *         >0 if the conversion was successful but lossy
-+ *         AVERROR(ENOSYS) if the conversion was not possible (or would be
-+ *           lossy and AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS was specified)
-+ *         AVERROR(EINVAL), AVERROR(ENOMEM) on error
-+ */
-+int av_channel_layout_retype(AVChannelLayout *channel_layout, enum AVChannelOrder order, int flags);
-+
-+/**
-  * @}
-  */
- 
- #endif /* AVUTIL_CHANNEL_LAYOUT_H */
-diff --git a/media/ffvpx/libavutil/color_utils.c b/media/ffvpx/libavutil/color_utils.c
-deleted file mode 100644
---- a/media/ffvpx/libavutil/color_utils.c
-+++ /dev/null
-@@ -1,234 +0,0 @@
--/*
-- * Copyright (c) 2015 Kevin Wheatley <kevin.j.wheatley@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 <stddef.h>
--#include <math.h>
--
--#include "libavutil/color_utils.h"
--#include "libavutil/pixfmt.h"
--
--double avpriv_get_gamma_from_trc(enum AVColorTransferCharacteristic trc)
--{
--    double gamma;
--    switch (trc) {
--        case AVCOL_TRC_BT709:
--        case AVCOL_TRC_SMPTE170M:
--        case AVCOL_TRC_SMPTE240M:
--        case AVCOL_TRC_BT1361_ECG:
--        case AVCOL_TRC_BT2020_10:
--        case AVCOL_TRC_BT2020_12:
--            /* these share a segmented TRC, but gamma 1.961 is a close
--              approximation, and also more correct for decoding content */
--            gamma = 1.961;
--            break;
--        case AVCOL_TRC_GAMMA22:
--        case AVCOL_TRC_IEC61966_2_1:
--            gamma = 2.2;
--            break;
--        case AVCOL_TRC_GAMMA28:
--            gamma = 2.8;
--            break;
--        case AVCOL_TRC_LINEAR:
--            gamma = 1.0;
--            break;
--        default:
--            gamma = 0.0; // Unknown value representation
--    }
--    return gamma;
--}
--
--#define BT709_alpha 1.099296826809442
--#define BT709_beta 0.018053968510807
--
--static double avpriv_trc_bt709(double Lc)
--{
--    const double a = BT709_alpha;
--    const double b = BT709_beta;
--
--    return (0.0 > Lc) ? 0.0
--         : (  b > Lc) ? 4.500 * Lc
--         :              a * pow(Lc, 0.45) - (a - 1.0);
--}
--
--static double avpriv_trc_gamma22(double Lc)
--{
--    return (0.0 > Lc) ? 0.0 : pow(Lc, 1.0/ 2.2);
--}
--
--static double avpriv_trc_gamma28(double Lc)
--{
--    return (0.0 > Lc) ? 0.0 : pow(Lc, 1.0/ 2.8);
--}
--
--static double avpriv_trc_smpte240M(double Lc)
--{
--    const double a = 1.1115;
--    const double b = 0.0228;
--
--    return (0.0 > Lc) ? 0.0
--         : (  b > Lc) ? 4.000 * Lc
--         :              a * pow(Lc, 0.45) - (a - 1.0);
--}
--
--static double avpriv_trc_linear(double Lc)
--{
--    return Lc;
--}
--
--static double avpriv_trc_log(double Lc)
--{
--    return (0.01 > Lc) ? 0.0 : 1.0 + log10(Lc) / 2.0;
--}
--
--static double avpriv_trc_log_sqrt(double Lc)
--{
--    // sqrt(10) / 1000
--    return (0.00316227766 > Lc) ? 0.0 : 1.0 + log10(Lc) / 2.5;
--}
--
--static double avpriv_trc_iec61966_2_4(double Lc)
--{
--    const double a = BT709_alpha;
--    const double b = BT709_beta;
--
--    return (-b >= Lc) ? -a * pow(-Lc, 0.45) + (a - 1.0)
--         : ( b >  Lc) ? 4.500 * Lc
--         :               a * pow( Lc, 0.45) - (a - 1.0);
--}
--
--static double avpriv_trc_bt1361(double Lc)
--{
--    const double a = BT709_alpha;
--    const double b = BT709_beta;
--
--    return (-0.0045 >= Lc) ? -(a * pow(-4.0 * Lc, 0.45) + (a - 1.0)) / 4.0
--         : ( b >  Lc) ? 4.500 * Lc
--         :               a * pow( Lc, 0.45) - (a - 1.0);
--}
--
--static double avpriv_trc_iec61966_2_1(double Lc)
--{
--    const double a = 1.055;
--    const double b = 0.0031308;
--
--    return (0.0 > Lc) ? 0.0
--         : (  b > Lc) ? 12.92 * Lc
--         :              a * pow(Lc, 1.0  / 2.4) - (a - 1.0);
--}
--
--static double avpriv_trc_smpte_st2084(double Lc)
--{
--    const double c1 =         3424.0 / 4096.0; // c3-c2 + 1
--    const double c2 =  32.0 * 2413.0 / 4096.0;
--    const double c3 =  32.0 * 2392.0 / 4096.0;
--    const double m  = 128.0 * 2523.0 / 4096.0;
--    const double n  =  0.25 * 2610.0 / 4096.0;
--    const double L  = Lc / 10000.0;
--    const double Ln = pow(L, n);
--
--    return (0.0 > Lc) ? 0.0
--         :              pow((c1 + c2 * Ln) / (1.0 + c3 * Ln), m);
--
--}
--
--static double avpriv_trc_smpte_st428_1(double Lc)
--{
--    return (0.0 > Lc) ? 0.0
--         :              pow(48.0 * Lc / 52.37, 1.0 / 2.6);
--}
--
--
--static double avpriv_trc_arib_std_b67(double Lc) {
--    // The function uses the definition from HEVC, which assumes that the peak
--    // white is input level = 1. (this is equivalent to scaling E = Lc * 12 and
--    // using the definition from the ARIB STD-B67 spec)
--    const double a = 0.17883277;
--    const double b = 0.28466892;
--    const double c = 0.55991073;
--    return (0.0 > Lc) ? 0.0 :
--        (Lc <= 1.0 / 12.0 ? sqrt(3.0 * Lc) : a * log(12.0 * Lc - b) + c);
--}
--
--avpriv_trc_function avpriv_get_trc_function_from_trc(enum AVColorTransferCharacteristic trc)
--{
--    avpriv_trc_function func = NULL;
--    switch (trc) {
--        case AVCOL_TRC_BT709:
--        case AVCOL_TRC_SMPTE170M:
--        case AVCOL_TRC_BT2020_10:
--        case AVCOL_TRC_BT2020_12:
--            func = avpriv_trc_bt709;
--            break;
--
--        case AVCOL_TRC_GAMMA22:
--            func = avpriv_trc_gamma22;
--            break;
--        case AVCOL_TRC_GAMMA28:
--            func = avpriv_trc_gamma28;
--            break;
--
--        case AVCOL_TRC_SMPTE240M:
--            func = avpriv_trc_smpte240M;
--            break;
--
--        case AVCOL_TRC_LINEAR:
--            func = avpriv_trc_linear;
--            break;
--
--        case AVCOL_TRC_LOG:
--            func = avpriv_trc_log;
--            break;
--
--        case AVCOL_TRC_LOG_SQRT:
--            func = avpriv_trc_log_sqrt;
--            break;
--
--        case AVCOL_TRC_IEC61966_2_4:
--            func = avpriv_trc_iec61966_2_4;
--            break;
--
--        case AVCOL_TRC_BT1361_ECG:
--            func = avpriv_trc_bt1361;
--            break;
--
--        case AVCOL_TRC_IEC61966_2_1:
--            func = avpriv_trc_iec61966_2_1;
--            break;
--
--        case AVCOL_TRC_SMPTEST2084:
--            func = avpriv_trc_smpte_st2084;
--            break;
--
--        case AVCOL_TRC_SMPTEST428_1:
--            func = avpriv_trc_smpte_st428_1;
--            break;
--
--        case AVCOL_TRC_ARIB_STD_B67:
--            func = avpriv_trc_arib_std_b67;
--            break;
--
--        case AVCOL_TRC_RESERVED0:
--        case AVCOL_TRC_UNSPECIFIED:
--        case AVCOL_TRC_RESERVED:
--        default:
--            break;
--    }
--    return func;
--}
-diff --git a/media/ffvpx/libavutil/color_utils.h b/media/ffvpx/libavutil/color_utils.h
-deleted file mode 100644
---- a/media/ffvpx/libavutil/color_utils.h
-+++ /dev/null
-@@ -1,56 +0,0 @@
--/*
-- * Copyright (c) 2015 Kevin Wheatley <kevin.j.wheatley@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_COLOR_UTILS_H
--#define AVUTIL_COLOR_UTILS_H
--
--
--#include "libavutil/pixfmt.h"
--
--/**
-- * Determine a suitable 'gamma' value to match the supplied
-- * AVColorTransferCharacteristic.
-- *
-- * See Apple Technical Note TN2257 (https://developer.apple.com/library/mac/technotes/tn2257/_index.html)
-- *
-- * @return Will return an approximation to the simple gamma function matching
-- *         the supplied Transfer Characteristic, Will return 0.0 for any
-- *         we cannot reasonably match against.
-- */
--double avpriv_get_gamma_from_trc(enum AVColorTransferCharacteristic trc);
--
--
--typedef double (*avpriv_trc_function)(double);
--
--/**
-- * Determine the function needed to apply the given
-- * AVColorTransferCharacteristic to linear input.
-- *
-- * The function returned should expect a nominal domain and range of [0.0-1.0]
-- * values outside of this range maybe valid depending on the chosen
-- * characteristic function.
-- *
-- * @return Will return pointer to the function matching the
-- *         supplied Transfer Characteristic. If unspecified will
-- *         return NULL:
-- */
--avpriv_trc_function avpriv_get_trc_function_from_trc(enum AVColorTransferCharacteristic trc);
--
--#endif
-diff --git a/media/ffvpx/libavutil/common.h b/media/ffvpx/libavutil/common.h
---- a/media/ffvpx/libavutil/common.h
-+++ b/media/ffvpx/libavutil/common.h
-@@ -38,16 +38,24 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- 
- #include "attributes.h"
- #include "error.h"
- #include "macros.h"
- 
-+#ifdef HAVE_AV_CONFIG_H
-+#   include "config.h"
-+#   include "intmath.h"
-+#   include "internal.h"
-+#else
-+#   include "mem.h"
-+#endif /* HAVE_AV_CONFIG_H */
-+
- //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))
- /* 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))
- /* Backwards compat. */
-@@ -79,21 +87,16 @@
-  * This also works with INT_MIN which would otherwise not be representable
-  * As with many macros, this evaluates its argument twice.
-  */
- #define FFABSU(a) ((a) <= 0 ? -(unsigned)(a) : (unsigned)(a))
- #define FFABS64U(a) ((a) <= 0 ? -(uint64_t)(a) : (uint64_t)(a))
- 
- /* misc math functions */
- 
--#ifdef HAVE_AV_CONFIG_H
--#   include "config.h"
--#   include "intmath.h"
--#endif
--
- #ifndef av_ceil_log2
- #   define av_ceil_log2     av_ceil_log2_c
- #endif
- #ifndef av_clip
- #   define av_clip          av_clip_c
- #endif
- #ifndef av_clip64
- #   define av_clip64        av_clip64_c
-@@ -563,17 +566,9 @@ static av_always_inline av_const int av_
-         } else {\
-             tmp = 0xD800 | ((in - 0x10000) >> 10);\
-             PUT_16BIT\
-             tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\
-             PUT_16BIT\
-         }\
-     }\
- 
--
--
--#include "mem.h"
--
--#ifdef HAVE_AV_CONFIG_H
--#    include "internal.h"
--#endif /* HAVE_AV_CONFIG_H */
--
- #endif /* AVUTIL_COMMON_H */
-diff --git a/media/ffvpx/libavutil/cpu.c b/media/ffvpx/libavutil/cpu.c
---- a/media/ffvpx/libavutil/cpu.c
-+++ b/media/ffvpx/libavutil/cpu.c
-@@ -44,18 +44,18 @@
- #endif
- #include <sys/types.h>
- #include <sys/sysctl.h>
- #endif
- #if HAVE_UNISTD_H
- #include <unistd.h>
- #endif
- 
--static atomic_int cpu_flags = ATOMIC_VAR_INIT(-1);
--static atomic_int cpu_count = ATOMIC_VAR_INIT(-1);
-+static atomic_int cpu_flags = -1;
-+static atomic_int cpu_count = -1;
- 
- static int get_cpu_flags(void)
- {
- #if ARCH_MIPS
-     return ff_get_cpu_flags_mips();
- #elif ARCH_AARCH64
-     return ff_get_cpu_flags_aarch64();
- #elif ARCH_ARM
-@@ -203,17 +203,17 @@ int av_parse_cpu_caps(unsigned *flags, c
-     };
-     const AVClass *pclass = &class;
- 
-     return av_opt_eval_flags(&pclass, &cpuflags_opts[0], s, flags);
- }
- 
- int av_cpu_count(void)
- {
--    static atomic_int printed = ATOMIC_VAR_INIT(0);
-+    static atomic_int printed = 0;
- 
-     int nb_cpus = 1;
-     int count   = 0;
- #if HAVE_WINRT
-     SYSTEM_INFO sysinfo;
- #endif
- #if HAVE_SCHED_GETAFFINITY && defined(CPU_COUNT)
-     cpu_set_t cpuset;
-diff --git a/media/ffvpx/libavutil/csp.h b/media/ffvpx/libavutil/csp.h
-new file mode 100644
---- /dev/null
-+++ b/media/ffvpx/libavutil/csp.h
-@@ -0,0 +1,150 @@
-+/*
-+ * Copyright (c) 2015 Kevin Wheatley <kevin.j.wheatley@gmail.com>
-+ * Copyright (c) 2016 Ronald S. Bultje <rsbultje@gmail.com>
-+ * Copyright (c) 2023 Leo Izen <leo.izen@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_CSP_H
-+#define AVUTIL_CSP_H
-+
-+#include "pixfmt.h"
-+#include "rational.h"
-+
-+/**
-+ * @file
-+ * Colorspace value utility functions for libavutil.
-+ * @ingroup lavu_math_csp
-+ * @author Ronald S. Bultje <rsbultje@gmail.com>
-+ * @author Leo Izen <leo.izen@gmail.com>
-+ * @author Kevin Wheatley <kevin.j.wheatley@gmail.com>
-+ */
-+
-+/**
-+ * @defgroup lavu_math_csp Colorspace Utility
-+ * @ingroup lavu_math
-+ * @{
-+ */
-+
-+/**
-+ * Struct containing luma coefficients to be used for RGB to YUV/YCoCg, or similar
-+ * calculations.
-+ */
-+typedef struct AVLumaCoefficients {
-+    AVRational cr, cg, cb;
-+} AVLumaCoefficients;
-+
-+/**
-+ * Struct containing chromaticity x and y values for the standard CIE 1931
-+ * chromaticity definition.
-+ */
-+typedef struct AVCIExy {
-+    AVRational x, y;
-+} AVCIExy;
-+
-+/**
-+ * Struct defining the red, green, and blue primary locations in terms of CIE
-+ * 1931 chromaticity x and y.
-+ */
-+typedef struct AVPrimaryCoefficients {
-+    AVCIExy r, g, b;
-+} AVPrimaryCoefficients;
-+
-+/**
-+ * Struct defining white point location in terms of CIE 1931 chromaticity x
-+ * and y.
-+ */
-+typedef AVCIExy AVWhitepointCoefficients;
-+
-+/**
-+ * Struct that contains both white point location and primaries location, providing
-+ * the complete description of a color gamut.
-+ */
-+typedef struct AVColorPrimariesDesc {
-+    AVWhitepointCoefficients wp;
-+    AVPrimaryCoefficients prim;
-+} AVColorPrimariesDesc;
-+
-+/**
-+ * Function pointer representing a double -> double transfer function that performs
-+ * an EOTF transfer inversion. This function outputs linear light.
-+ */
-+typedef double (*av_csp_trc_function)(double);
-+
-+/**
-+ * Retrieves the Luma coefficients necessary to construct a conversion matrix
-+ * from an enum constant describing the colorspace.
-+ * @param csp An enum constant indicating YUV or similar colorspace.
-+ * @return The Luma coefficients associated with that colorspace, or NULL
-+ *     if the constant is unknown to libavutil.
-+ */
-+const AVLumaCoefficients *av_csp_luma_coeffs_from_avcsp(enum AVColorSpace csp);
-+
-+/**
-+ * Retrieves a complete gamut description from an enum constant describing the
-+ * color primaries.
-+ * @param prm An enum constant indicating primaries
-+ * @return A description of the colorspace gamut associated with that enum
-+ *     constant, or NULL if the constant is unknown to libavutil.
-+ */
-+const AVColorPrimariesDesc *av_csp_primaries_desc_from_id(enum AVColorPrimaries prm);
-+
-+/**
-+ * Detects which enum AVColorPrimaries constant corresponds to the given complete
-+ * gamut description.
-+ * @see enum AVColorPrimaries
-+ * @param prm A description of the colorspace gamut
-+ * @return The enum constant associated with this gamut, or
-+ *     AVCOL_PRI_UNSPECIFIED if no clear match can be idenitified.
-+ */
-+enum AVColorPrimaries av_csp_primaries_id_from_desc(const AVColorPrimariesDesc *prm);
-+
-+/**
-+ * Determine a suitable 'gamma' value to match the supplied
-+ * AVColorTransferCharacteristic.
-+ *
-+ * See Apple Technical Note TN2257 (https://developer.apple.com/library/mac/technotes/tn2257/_index.html)
-+ *
-+ * This function returns the gamma exponent for the OETF. For example, sRGB is approximated
-+ * by gamma 2.2, not by gamma 0.45455.
-+ *
-+ * @return Will return an approximation to the simple gamma function matching
-+ *         the supplied Transfer Characteristic, Will return 0.0 for any
-+ *         we cannot reasonably match against.
-+ */
-+double av_csp_approximate_trc_gamma(enum AVColorTransferCharacteristic trc);
-+
-+/**
-+ * Determine the function needed to apply the given
-+ * AVColorTransferCharacteristic to linear input.
-+ *
-+ * The function returned should expect a nominal domain and range of [0.0-1.0]
-+ * values outside of this range maybe valid depending on the chosen
-+ * characteristic function.
-+ *
-+ * @return Will return pointer to the function matching the
-+ *         supplied Transfer Characteristic. If unspecified will
-+ *         return NULL:
-+ */
-+av_csp_trc_function av_csp_trc_func_from_id(enum AVColorTransferCharacteristic trc);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_CSP_H */
-diff --git a/media/ffvpx/libavutil/dict.c b/media/ffvpx/libavutil/dict.c
---- a/media/ffvpx/libavutil/dict.c
-+++ b/media/ffvpx/libavutil/dict.c
-@@ -140,34 +140,32 @@ int av_dict_set(AVDictionary **pm, const
-             goto enomem;
-         m->elems = tmp;
-     }
-     if (copy_value) {
-         m->elems[m->count].key = copy_key;
-         m->elems[m->count].value = copy_value;
-         m->count++;
-     } else {
--        if (!m->count) {
--            av_freep(&m->elems);
--            av_freep(pm);
--        }
--        av_freep(&copy_key);
-+        err = 0;
-+        goto end;
-     }
- 
-     return 0;
- 
- enomem:
-     err = AVERROR(ENOMEM);
- err_out:
-+    av_free(copy_value);
-+end:
-     if (m && !m->count) {
-         av_freep(&m->elems);
-         av_freep(pm);
-     }
-     av_free(copy_key);
--    av_free(copy_value);
-     return err;
- }
- 
- int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value,
-                 int flags)
- {
-     char valuestr[22];
-     snprintf(valuestr, sizeof(valuestr), "%"PRId64, value);
-diff --git a/media/ffvpx/libavutil/eval.c b/media/ffvpx/libavutil/eval.c
---- a/media/ffvpx/libavutil/eval.c
-+++ b/media/ffvpx/libavutil/eval.c
-@@ -27,23 +27,22 @@
-  */
- 
- #include <float.h>
- #include "attributes.h"
- #include "avutil.h"
- #include "common.h"
- #include "eval.h"
- #include "ffmath.h"
--#include "internal.h"
- #include "log.h"
- #include "mathematics.h"
-+#include "mem.h"
- #include "sfc64.h"
- #include "fftime.h"
- #include "avstring.h"
--#include "timer.h"
- #include "reverse.h"
- 
- typedef struct Parser {
-     const AVClass *class;
-     int stack_index;
-     char *s;
-     const double *const_values;
-     const char * const *const_names;          // NULL terminated
-diff --git a/media/ffvpx/libavutil/fftime.h b/media/ffvpx/libavutil/fftime.h
---- a/media/ffvpx/libavutil/fftime.h
-+++ b/media/ffvpx/libavutil/fftime.h
-@@ -17,17 +17,16 @@
-  * 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_TIME_H
- #define AVUTIL_TIME_H
- 
- #include <stdint.h>
--#include <time.h>
- 
- /**
-  * Get the current time in microseconds.
-  */
- int64_t av_gettime(void);
- 
- /**
-  * Get the current time in microseconds since some unspecified starting point.
-diff --git a/media/ffvpx/libavutil/ffversion.h b/media/ffvpx/libavutil/ffversion.h
---- a/media/ffvpx/libavutil/ffversion.h
-+++ b/media/ffvpx/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-111736-gd9d5695390"
-+#define FFMPEG_VERSION "N-114439-gf0ee4bbc6b"
- #endif /* AVUTIL_FFVERSION_H */
-diff --git a/media/ffvpx/libavutil/fifo.c b/media/ffvpx/libavutil/fifo.c
---- a/media/ffvpx/libavutil/fifo.c
-+++ b/media/ffvpx/libavutil/fifo.c
-@@ -285,227 +285,8 @@ void av_fifo_reset2(AVFifo *f)
- 
- void av_fifo_freep2(AVFifo **f)
- {
-     if (*f) {
-         av_freep(&(*f)->buffer);
-         av_freep(f);
-     }
- }
--
--
--#if FF_API_FIFO_OLD_API
--#include "internal.h"
--FF_DISABLE_DEPRECATION_WARNINGS
--#define OLD_FIFO_SIZE_MAX (size_t)FFMIN3(INT_MAX, UINT32_MAX, SIZE_MAX)
--
--AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size)
--{
--    AVFifoBuffer *f;
--    void *buffer;
--
--    if (nmemb > OLD_FIFO_SIZE_MAX / size)
--        return NULL;
--
--    buffer = av_realloc_array(NULL, nmemb, size);
--    if (!buffer)
--        return NULL;
--    f = av_mallocz(sizeof(AVFifoBuffer));
--    if (!f) {
--        av_free(buffer);
--        return NULL;
--    }
--    f->buffer = buffer;
--    f->end    = f->buffer + nmemb * size;
--    av_fifo_reset(f);
--    return f;
--}
--
--AVFifoBuffer *av_fifo_alloc(unsigned int size)
--{
--    return av_fifo_alloc_array(size, 1);
--}
--
--void av_fifo_free(AVFifoBuffer *f)
--{
--    if (f) {
--        av_freep(&f->buffer);
--        av_free(f);
--    }
--}
--
--void av_fifo_freep(AVFifoBuffer **f)
--{
--    if (f) {
--        av_fifo_free(*f);
--        *f = NULL;
--    }
--}
--
--void av_fifo_reset(AVFifoBuffer *f)
--{
--    f->wptr = f->rptr = f->buffer;
--    f->wndx = f->rndx = 0;
--}
--
--int av_fifo_size(const AVFifoBuffer *f)
--{
--    return (uint32_t)(f->wndx - f->rndx);
--}
--
--int av_fifo_space(const AVFifoBuffer *f)
--{
--    return f->end - f->buffer - av_fifo_size(f);
--}
--
--int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size)
--{
--    unsigned int old_size = f->end - f->buffer;
--
--    if (new_size > OLD_FIFO_SIZE_MAX)
--        return AVERROR(EINVAL);
--
--    if (old_size < new_size) {
--        size_t offset_r = f->rptr - f->buffer;
--        size_t offset_w = f->wptr - f->buffer;
--        uint8_t *tmp;
--
--        tmp = av_realloc(f->buffer, new_size);
--        if (!tmp)
--            return AVERROR(ENOMEM);
--
--        // move the data from the beginning of the ring buffer
--        // to the newly allocated space
--        // the second condition distinguishes full vs empty fifo
--        if (offset_w <= offset_r && av_fifo_size(f)) {
--            const size_t copy = FFMIN(new_size - old_size, offset_w);
--            memcpy(tmp + old_size, tmp, copy);
--            if (copy < offset_w) {
--                memmove(tmp, tmp + copy , offset_w - copy);
--                offset_w -= copy;
--            } else
--                offset_w = old_size + copy;
--        }
--
--        f->buffer = tmp;
--        f->end    = f->buffer + new_size;
--        f->rptr   = f->buffer + offset_r;
--        f->wptr   = f->buffer + offset_w;
--    }
--    return 0;
--}
--
--int av_fifo_grow(AVFifoBuffer *f, unsigned int size)
--{
--    unsigned int old_size = f->end - f->buffer;
--    if(size + (unsigned)av_fifo_size(f) < size)
--        return AVERROR(EINVAL);
--
--    size += av_fifo_size(f);
--
--    if (old_size < size)
--        return av_fifo_realloc2(f, FFMAX(size, 2*old_size));
--    return 0;
--}
--
--/* src must NOT be const as it can be a context for func that may need
-- * updating (like a pointer or byte counter) */
--int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size,
--                          int (*func)(void *, void *, int))
--{
--    int total = size;
--    uint32_t wndx= f->wndx;
--    uint8_t *wptr= f->wptr;
--
--    if (size > av_fifo_space(f))
--        return AVERROR(ENOSPC);
--
--    do {
--        int len = FFMIN(f->end - wptr, size);
--        if (func) {
--            len = func(src, wptr, len);
--            if (len <= 0)
--                break;
--        } else {
--            memcpy(wptr, src, len);
--            src = (uint8_t *)src + len;
--        }
--        wptr += len;
--        if (wptr >= f->end)
--            wptr = f->buffer;
--        wndx    += len;
--        size    -= len;
--    } while (size > 0);
--    f->wndx= wndx;
--    f->wptr= wptr;
--    return total - size;
--}
--
--int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int))
--{
--    uint8_t *rptr = f->rptr;
--
--    if (offset < 0 || buf_size > av_fifo_size(f) - offset)
--        return AVERROR(EINVAL);
--
--    if (offset >= f->end - rptr)
--        rptr += offset - (f->end - f->buffer);
--    else
--        rptr += offset;
--
--    while (buf_size > 0) {
--        int len;
--
--        if (rptr >= f->end)
--            rptr -= f->end - f->buffer;
--
--        len = FFMIN(f->end - rptr, buf_size);
--        if (func)
--            func(dest, rptr, len);
--        else {
--            memcpy(dest, rptr, len);
--            dest = (uint8_t *)dest + len;
--        }
--
--        buf_size -= len;
--        rptr     += len;
--    }
--
--    return 0;
--}
--
--int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size,
--                         void (*func)(void *, void *, int))
--{
--    return av_fifo_generic_peek_at(f, dest, 0, buf_size, func);
--}
--
--int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size,
--                         void (*func)(void *, void *, int))
--{
--    if (buf_size > av_fifo_size(f))
--        return AVERROR(EINVAL);
--
--    do {
--        int len = FFMIN(f->end - f->rptr, buf_size);
--        if (func)
--            func(dest, f->rptr, len);
--        else {
--            memcpy(dest, f->rptr, len);
--            dest = (uint8_t *)dest + len;
--        }
--        av_fifo_drain(f, len);
--        buf_size -= len;
--    } while (buf_size > 0);
--    return 0;
--}
--
--/** Discard data from the FIFO. */
--void av_fifo_drain(AVFifoBuffer *f, int size)
--{
--    av_assert2(av_fifo_size(f) >= size);
--    f->rptr += size;
--    if (f->rptr >= f->end)
--        f->rptr -= f->end - f->buffer;
--    f->rndx += size;
--}
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-diff --git a/media/ffvpx/libavutil/fifo.h b/media/ffvpx/libavutil/fifo.h
---- a/media/ffvpx/libavutil/fifo.h
-+++ b/media/ffvpx/libavutil/fifo.h
-@@ -21,20 +21,16 @@
-  * @ingroup lavu_fifo
-  * A generic FIFO API
-  */
- 
- #ifndef AVUTIL_FIFO_H
- #define AVUTIL_FIFO_H
- 
- #include <stddef.h>
--#include <stdint.h>
--
--#include "attributes.h"
--#include "version.h"
- 
- /**
-  * @defgroup lavu_fifo AVFifo
-  * @ingroup lavu_data
-  *
-  * @{
-  * A generic FIFO API
-  */
-@@ -234,215 +230,13 @@ void av_fifo_drain2(AVFifo *f, size_t si
- void av_fifo_reset2(AVFifo *f);
- 
- /**
-  * Free an AVFifo and reset pointer to NULL.
-  * @param f Pointer to an AVFifo to free. *f == NULL is allowed.
-  */
- void av_fifo_freep2(AVFifo **f);
- 
--
--#if FF_API_FIFO_OLD_API
--typedef struct AVFifoBuffer {
--    uint8_t *buffer;
--    uint8_t *rptr, *wptr, *end;
--    uint32_t rndx, wndx;
--} AVFifoBuffer;
--
--/**
-- * Initialize an AVFifoBuffer.
-- * @param size of FIFO
-- * @return AVFifoBuffer or NULL in case of memory allocation failure
-- * @deprecated use av_fifo_alloc2()
-- */
--attribute_deprecated
--AVFifoBuffer *av_fifo_alloc(unsigned int size);
--
--/**
-- * Initialize an AVFifoBuffer.
-- * @param nmemb number of elements
-- * @param size  size of the single element
-- * @return AVFifoBuffer or NULL in case of memory allocation failure
-- * @deprecated use av_fifo_alloc2()
-- */
--attribute_deprecated
--AVFifoBuffer *av_fifo_alloc_array(size_t nmemb, size_t size);
--
--/**
-- * Free an AVFifoBuffer.
-- * @param f AVFifoBuffer to free
-- * @deprecated use the AVFifo API with av_fifo_freep2()
-- */
--attribute_deprecated
--void av_fifo_free(AVFifoBuffer *f);
--
--/**
-- * Free an AVFifoBuffer and reset pointer to NULL.
-- * @param f AVFifoBuffer to free
-- * @deprecated use the AVFifo API with av_fifo_freep2()
-- */
--attribute_deprecated
--void av_fifo_freep(AVFifoBuffer **f);
--
--/**
-- * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied.
-- * @param f AVFifoBuffer to reset
-- * @deprecated use av_fifo_reset2() with the new AVFifo-API
-- */
--attribute_deprecated
--void av_fifo_reset(AVFifoBuffer *f);
--
--/**
-- * Return the amount of data in bytes in the AVFifoBuffer, that is the
-- * amount of data you can read from it.
-- * @param f AVFifoBuffer to read from
-- * @return size
-- * @deprecated use av_fifo_can_read() with the new AVFifo-API
-- */
--attribute_deprecated
--int av_fifo_size(const AVFifoBuffer *f);
--
--/**
-- * Return the amount of space in bytes in the AVFifoBuffer, that is the
-- * amount of data you can write into it.
-- * @param f AVFifoBuffer to write into
-- * @return size
-- * @deprecated use av_fifo_can_write() with the new AVFifo-API
-- */
--attribute_deprecated
--int av_fifo_space(const AVFifoBuffer *f);
--
--/**
-- * Feed data at specific position from an AVFifoBuffer to a user-supplied callback.
-- * Similar as av_fifo_gereric_read but without discarding data.
-- * @param f AVFifoBuffer to read from
-- * @param offset offset from current read position
-- * @param buf_size number of bytes to read
-- * @param func generic read function
-- * @param dest data destination
-- *
-- * @return a non-negative number on success, a negative error code on failure
-- *
-- * @deprecated use the new AVFifo-API with av_fifo_peek() when func == NULL,
-- *             av_fifo_peek_to_cb() otherwise
-- */
--attribute_deprecated
--int av_fifo_generic_peek_at(AVFifoBuffer *f, void *dest, int offset, int buf_size, void (*func)(void*, void*, int));
--
--/**
-- * Feed data from an AVFifoBuffer to a user-supplied callback.
-- * Similar as av_fifo_gereric_read but without discarding data.
-- * @param f AVFifoBuffer to read from
-- * @param buf_size number of bytes to read
-- * @param func generic read function
-- * @param dest data destination
-- *
-- * @return a non-negative number on success, a negative error code on failure
-- *
-- * @deprecated use the new AVFifo-API with av_fifo_peek() when func == NULL,
-- *             av_fifo_peek_to_cb() otherwise
-- */
--attribute_deprecated
--int av_fifo_generic_peek(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int));
--
--/**
-- * Feed data from an AVFifoBuffer to a user-supplied callback.
-- * @param f AVFifoBuffer to read from
-- * @param buf_size number of bytes to read
-- * @param func generic read function
-- * @param dest data destination
-- *
-- * @return a non-negative number on success, a negative error code on failure
-- *
-- * @deprecated use the new AVFifo-API with av_fifo_read() when func == NULL,
-- *             av_fifo_read_to_cb() otherwise
-- */
--attribute_deprecated
--int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int));
--
--/**
-- * Feed data from a user-supplied callback to an AVFifoBuffer.
-- * @param f AVFifoBuffer to write to
-- * @param src data source; non-const since it may be used as a
-- * modifiable context by the function defined in func
-- * @param size number of bytes to write
-- * @param func generic write function; the first parameter is src,
-- * the second is dest_buf, the third is dest_buf_size.
-- * func must return the number of bytes written to dest_buf, or <= 0 to
-- * indicate no more data available to write.
-- * If func is NULL, src is interpreted as a simple byte array for source data.
-- * @return the number of bytes written to the FIFO or a negative error code on failure
-- *
-- * @deprecated use the new AVFifo-API with av_fifo_write() when func == NULL,
-- *             av_fifo_write_from_cb() otherwise
-- */
--attribute_deprecated
--int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int));
--
--/**
-- * Resize an AVFifoBuffer.
-- * In case of reallocation failure, the old FIFO is kept unchanged.
-- *
-- * @param f AVFifoBuffer to resize
-- * @param size new AVFifoBuffer size in bytes
-- * @return <0 for failure, >=0 otherwise
-- *
-- * @deprecated use the new AVFifo-API with av_fifo_grow2() to increase FIFO size,
-- *             decreasing FIFO size is not supported
-- */
--attribute_deprecated
--int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size);
--
--/**
-- * Enlarge an AVFifoBuffer.
-- * In case of reallocation failure, the old FIFO is kept unchanged.
-- * The new fifo size may be larger than the requested size.
-- *
-- * @param f AVFifoBuffer to resize
-- * @param additional_space the amount of space in bytes to allocate in addition to av_fifo_size()
-- * @return <0 for failure, >=0 otherwise
-- *
-- * @deprecated use the new AVFifo-API with av_fifo_grow2(); note that unlike
-- * this function it adds to the allocated size, rather than to the used size
-- */
--attribute_deprecated
--int av_fifo_grow(AVFifoBuffer *f, unsigned int additional_space);
--
--/**
-- * Read and discard the specified amount of data from an AVFifoBuffer.
-- * @param f AVFifoBuffer to read from
-- * @param size amount of data to read in bytes
-- *
-- * @deprecated use the new AVFifo-API with av_fifo_drain2()
-- */
--attribute_deprecated
--void av_fifo_drain(AVFifoBuffer *f, int size);
--
--#if FF_API_FIFO_PEEK2
--/**
-- * Return a pointer to the data stored in a FIFO buffer at a certain offset.
-- * The FIFO buffer is not modified.
-- *
-- * @param f    AVFifoBuffer to peek at, f must be non-NULL
-- * @param offs an offset in bytes, its absolute value must be less
-- *             than the used buffer size or the returned pointer will
-- *             point outside to the buffer data.
-- *             The used buffer size can be checked with av_fifo_size().
-- * @deprecated use the new AVFifo-API with av_fifo_peek() or av_fifo_peek_to_cb()
-- */
--attribute_deprecated
--static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs)
--{
--    uint8_t *ptr = f->rptr + offs;
--    if (ptr >= f->end)
--        ptr = f->buffer + (ptr - f->end);
--    else if (ptr < f->buffer)
--        ptr = f->end - (f->buffer - ptr);
--    return ptr;
--}
--#endif
--#endif
--
- /**
-  * @}
-  */
- 
- #endif /* AVUTIL_FIFO_H */
-diff --git a/media/ffvpx/libavutil/film_grain_params.c b/media/ffvpx/libavutil/film_grain_params.c
---- a/media/ffvpx/libavutil/film_grain_params.c
-+++ b/media/ffvpx/libavutil/film_grain_params.c
-@@ -12,31 +12,95 @@
-  * 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 "film_grain_params.h"
-+#include "mem.h"
-+#include "pixdesc.h"
- 
- AVFilmGrainParams *av_film_grain_params_alloc(size_t *size)
- {
-     AVFilmGrainParams *params = av_mallocz(sizeof(AVFilmGrainParams));
- 
-     if (size)
-         *size = sizeof(*params);
- 
-     return params;
- }
- 
- AVFilmGrainParams *av_film_grain_params_create_side_data(AVFrame *frame)
- {
-+    AVFilmGrainParams *fgp;
-     AVFrameSideData *side_data = av_frame_new_side_data(frame,
-                                                         AV_FRAME_DATA_FILM_GRAIN_PARAMS,
-                                                         sizeof(AVFilmGrainParams));
-     if (!side_data)
-         return NULL;
- 
--    memset(side_data->data, 0, sizeof(AVFilmGrainParams));
-+    fgp = (AVFilmGrainParams *) side_data->data;
-+    *fgp = (AVFilmGrainParams) {
-+        .color_range     = AVCOL_RANGE_UNSPECIFIED,
-+        .color_primaries = AVCOL_PRI_UNSPECIFIED,
-+        .color_trc       = AVCOL_TRC_UNSPECIFIED,
-+        .color_space     = AVCOL_SPC_UNSPECIFIED,
-+    };
-+
-+    return fgp;
-+}
-+
-+const AVFilmGrainParams *av_film_grain_params_select(const AVFrame *frame)
-+{
-+    const AVFilmGrainParams *fgp, *best = NULL;
-+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
-+    int bit_depth_luma, bit_depth_chroma;
-+    if (!desc)
-+        return NULL;
-+
-+    /* There are no YUV formats with different bit depth per component,
-+     * so just check both against the first component for simplicity */
-+    bit_depth_luma = bit_depth_chroma = desc->comp[0].depth;
-+
-+    for (int i = 0; i < frame->nb_side_data; i++) {
-+        if (frame->side_data[i]->type != AV_FRAME_DATA_FILM_GRAIN_PARAMS)
-+            continue;
-+        fgp = (const AVFilmGrainParams*)frame->side_data[i]->data;
-+        if (fgp->width  && fgp->width  > frame->width ||
-+            fgp->height && fgp->height > frame->height)
-+            continue;
- 
--    return (AVFilmGrainParams *)side_data->data;
-+#define CHECK(a, b, unspec)                                     \
-+        if ((a) != (unspec) && (b) != (unspec) && (a) != (b))   \
-+            continue
-+
-+        CHECK(fgp->bit_depth_luma,   bit_depth_luma,         0);
-+        CHECK(fgp->bit_depth_chroma, bit_depth_chroma,       0);
-+        CHECK(fgp->color_range,      frame->color_range,     AVCOL_RANGE_UNSPECIFIED);
-+        CHECK(fgp->color_primaries,  frame->color_primaries, AVCOL_PRI_UNSPECIFIED);
-+        CHECK(fgp->color_trc,        frame->color_trc,       AVCOL_TRC_UNSPECIFIED);
-+        CHECK(fgp->color_space,      frame->colorspace,      AVCOL_SPC_UNSPECIFIED);
-+
-+        switch (fgp->type) {
-+        case AV_FILM_GRAIN_PARAMS_NONE:
-+            continue;
-+        case AV_FILM_GRAIN_PARAMS_AV1:
-+            /* AOM FGS needs an exact match for the chroma resolution */
-+            if (fgp->subsampling_x != desc->log2_chroma_w ||
-+                fgp->subsampling_y != desc->log2_chroma_h)
-+                continue;
-+            break;
-+        case AV_FILM_GRAIN_PARAMS_H274:
-+            /* H.274 FGS can be adapted to any lower chroma resolution */
-+            if (fgp->subsampling_x > desc->log2_chroma_w ||
-+                fgp->subsampling_y > desc->log2_chroma_h)
-+                continue;
-+            break;
-+        }
-+
-+        if (!best || best->width < fgp->width || best->height < fgp->height)
-+            best = fgp;
-+    }
-+
-+    return best;
- }
-diff --git a/media/ffvpx/libavutil/film_grain_params.h b/media/ffvpx/libavutil/film_grain_params.h
---- a/media/ffvpx/libavutil/film_grain_params.h
-+++ b/media/ffvpx/libavutil/film_grain_params.h
-@@ -131,30 +131,52 @@ typedef struct AVFilmGrainAOMParams {
-  */
- typedef struct AVFilmGrainH274Params {
-     /**
-      * Specifies the film grain simulation mode.
-      * 0 = Frequency filtering, 1 = Auto-regression
-      */
-     int model_id;
- 
--    /**
--     * Specifies the bit depth used for the luma component.
--     */
-+#if FF_API_H274_FILM_GRAIN_VCS
-+  /**
-+   * TODO: On this ABI bump, please also re-order the fields in
-+   * AVFilmGrainParams (see below)
-+   */
-+
-+  /**
-+   * Specifies the bit depth used for the luma component.
-+   *
-+   * @deprecated use AVFilmGrainParams.bit_depth_luma.
-+   */
-+    attribute_deprecated
-     int bit_depth_luma;
- 
-     /**
-      * Specifies the bit depth used for the chroma components.
-+     *
-+     * @deprecated use AVFilmGrainParams.bit_depth_chroma.
-      */
-+    attribute_deprecated
-     int bit_depth_chroma;
- 
-+    /**
-+     * Specifies the video signal characteristics.
-+     *
-+     * @deprecated use AVFilmGrainParams.color_{range,primaries,trc,space}.
-+     */
-+    attribute_deprecated
-     enum AVColorRange                  color_range;
-+    attribute_deprecated
-     enum AVColorPrimaries              color_primaries;
-+    attribute_deprecated
-     enum AVColorTransferCharacteristic color_trc;
-+    attribute_deprecated
-     enum AVColorSpace                  color_space;
-+#endif
- 
-     /**
-      * Specifies the blending mode used to blend the simulated film grain
-      * with the decoded images.
-      *
-      * 0 = Additive, 1 = Multiplicative
-      */
-     int blending_mode_id;
-@@ -226,21 +248,50 @@ typedef struct AVFilmGrainParams {
-      *       SMPTE RDD 5-2006.
-      */
-     uint64_t seed;
- 
-     /**
-      * Additional fields may be added both here and in any structure included.
-      * If a codec's film grain structure differs slightly over another
-      * codec's, fields within may change meaning depending on the type.
-+     *
-+     * TODO: Move this to the end of the structure, at the next ABI bump.
-      */
-     union {
-         AVFilmGrainAOMParams aom;
-         AVFilmGrainH274Params h274;
-     } codec;
-+
-+    /**
-+     * Intended display resolution. May be 0 if the codec does not specify
-+     * any restrictions.
-+     */
-+
-+    int width, height;
-+
-+    /**
-+     * Intended subsampling ratio, or 0 for luma-only streams.
-+     */
-+    int subsampling_x, subsampling_y;
-+
-+    /**
-+     * Intended video signal characteristics.
-+     */
-+    enum AVColorRange                  color_range;
-+    enum AVColorPrimaries              color_primaries;
-+    enum AVColorTransferCharacteristic color_trc;
-+    enum AVColorSpace                  color_space;
-+
-+    /**
-+     * Intended bit depth, or 0 for unknown/unspecified.
-+     */
-+    int bit_depth_luma;
-+    int bit_depth_chroma;
-+
- } AVFilmGrainParams;
- 
- /**
-  * Allocate an AVFilmGrainParams structure and set its fields to
-  * default values. The resulting struct can be freed using av_freep().
-  * If size is not NULL it will be set to the number of bytes allocated.
-  *
-  * @return An AVFilmGrainParams filled with default values or NULL
-@@ -252,9 +303,20 @@ AVFilmGrainParams *av_film_grain_params_
-  * Allocate a complete AVFilmGrainParams and add it to the frame.
-  *
-  * @param frame The frame which side data is added to.
-  *
-  * @return The AVFilmGrainParams structure to be filled by caller.
-  */
- AVFilmGrainParams *av_film_grain_params_create_side_data(AVFrame *frame);
- 
-+/**
-+ * Select the most appropriate film grain parameters set for the frame,
-+ * taking into account the frame's format, resolution and video signal
-+ * characteristics.
-+ *
-+ * @note, for H.274, this may select a film grain parameter set with
-+ * greater chroma resolution than the frame. Users should take care to
-+ * correctly adjust the chroma grain frequency to the frame.
-+ */
-+const AVFilmGrainParams *av_film_grain_params_select(const AVFrame *frame);
-+
- #endif /* AVUTIL_FILM_GRAIN_PARAMS_H */
-diff --git a/media/ffvpx/libavutil/fixed_dsp.c b/media/ffvpx/libavutil/fixed_dsp.c
---- a/media/ffvpx/libavutil/fixed_dsp.c
-+++ b/media/ffvpx/libavutil/fixed_dsp.c
-@@ -42,16 +42,17 @@
-  *
-  * 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 "common.h"
- #include "fixed_dsp.h"
-+#include "mem.h"
- 
- static void vector_fmul_add_c(int *dst, const int *src0, const int *src1, const int *src2, int len){
-     int i;
-     int64_t accu;
- 
-     for (i=0; i<len; i++) {
-         accu = (int64_t)src0[i] * src1[i];
-         dst[i] = src2[i] + (int)((accu + 0x40000000) >> 31);
-@@ -130,17 +131,17 @@ static int scalarproduct_fixed_c(const i
-     int i;
- 
-     for (i = 0; i < len; i++)
-         p += (int64_t)v1[i] * v2[i];
- 
-     return (int)(p >> 31);
- }
- 
--static void butterflies_fixed_c(int *av_restrict v1s, int *av_restrict v2, int len)
-+static void butterflies_fixed_c(int *restrict v1s, int *restrict v2, int len)
- {
-     int i;
-     unsigned int *v1 = v1s;
- 
-     for (i = 0; i < len; i++){
-         int t = v1[i] - v2[i];
-         v1[i] += v2[i];
-         v2[i] = t;
-diff --git a/media/ffvpx/libavutil/fixed_dsp.h b/media/ffvpx/libavutil/fixed_dsp.h
---- a/media/ffvpx/libavutil/fixed_dsp.h
-+++ b/media/ffvpx/libavutil/fixed_dsp.h
-@@ -44,17 +44,16 @@
-  * 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_FIXED_DSP_H
- #define AVUTIL_FIXED_DSP_H
- 
- #include <stdint.h>
--#include "config.h"
- #include "attributes.h"
- #include "libavcodec/mathops.h"
- 
- typedef struct AVFixedDSPContext {
-     /* Assume len is a multiple of 16, and arrays are 32-byte aligned */
-     /* Results of multiplications are scaled down by 31 bit (and rounded) if not
-      * stated otherwise */
- 
-@@ -145,17 +144,17 @@ typedef struct AVFixedDSPContext {
- 
-     /**
-      * Calculate the sum and difference of two vectors of integers.
-      *
-      * @param v1  first input vector, sum output, 16-byte aligned
-      * @param v2  second input vector, difference output, 16-byte aligned
-      * @param len length of vectors, multiple of 4
-      */
--    void (*butterflies_fixed)(int *av_restrict v1, int *av_restrict v2, int len);
-+    void (*butterflies_fixed)(int *restrict v1, int *restrict v2, int len);
- } AVFixedDSPContext;
- 
- /**
-  * Allocate and initialize a fixed DSP context.
-  * note: should be freed with a av_free call when no longer needed.
-  *
-  * @param strict  setting to non-zero avoids using functions which may not be IEEE-754 compliant
-  */
-diff --git a/media/ffvpx/libavutil/float_dsp.c b/media/ffvpx/libavutil/float_dsp.c
---- a/media/ffvpx/libavutil/float_dsp.c
-+++ b/media/ffvpx/libavutil/float_dsp.c
-@@ -104,17 +104,17 @@ static void vector_fmul_reverse_c(float 
- {
-     int i;
- 
-     src1 += len-1;
-     for (i = 0; i < len; i++)
-         dst[i] = src0[i] * src1[-i];
- }
- 
--static void butterflies_float_c(float *av_restrict v1, float *av_restrict v2,
-+static void butterflies_float_c(float *restrict v1, float *restrict v2,
-                                 int len)
- {
-     int i;
- 
-     for (i = 0; i < len; i++) {
-         float t = v1[i] - v2[i];
-         v1[i] += v2[i];
-         v2[i] = t;
-diff --git a/media/ffvpx/libavutil/float_dsp.h b/media/ffvpx/libavutil/float_dsp.h
---- a/media/ffvpx/libavutil/float_dsp.h
-+++ b/media/ffvpx/libavutil/float_dsp.h
-@@ -14,18 +14,16 @@
-  * 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_FLOAT_DSP_H
- #define AVUTIL_FLOAT_DSP_H
- 
--#include "config.h"
--
- typedef struct AVFloatDSPContext {
-     /**
-      * Calculate the entry wise product of two vectors of floats and store the result in
-      * a vector of floats.
-      *
-      * @param dst  output vector
-      *             constraints: 32-byte aligned
-      * @param src0 first input vector
-@@ -156,17 +154,17 @@ typedef struct AVFloatDSPContext {
- 
-     /**
-      * Calculate the sum and difference of two vectors of floats.
-      *
-      * @param v1  first input vector, sum output, 16-byte aligned
-      * @param v2  second input vector, difference output, 16-byte aligned
-      * @param len length of vectors, multiple of 4
-      */
--    void (*butterflies_float)(float *av_restrict v1, float *av_restrict v2, int len);
-+    void (*butterflies_float)(float *restrict v1, float *restrict v2, int len);
- 
-     /**
-      * Calculate the scalar product of two vectors of floats.
-      *
-      * @param v1  first vector, 16-byte aligned
-      * @param v2  second vector, 16-byte aligned
-      * @param len length of vectors, multiple of 4
-      *
-diff --git a/media/ffvpx/libavutil/frame.c b/media/ffvpx/libavutil/frame.c
---- a/media/ffvpx/libavutil/frame.c
-+++ b/media/ffvpx/libavutil/frame.c
-@@ -23,36 +23,54 @@
- #include "cpu.h"
- #include "dict.h"
- #include "frame.h"
- #include "imgutils.h"
- #include "mem.h"
- #include "samplefmt.h"
- #include "hwcontext.h"
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--#define CHECK_CHANNELS_CONSISTENCY(frame) \
--    av_assert2(!(frame)->channel_layout || \
--               (frame)->channels == \
--               av_get_channel_layout_nb_channels((frame)->channel_layout))
--#endif
-+static const AVSideDataDescriptor sd_props[] = {
-+    [AV_FRAME_DATA_PANSCAN]                     = { "AVPanScan" },
-+    [AV_FRAME_DATA_A53_CC]                      = { "ATSC A53 Part 4 Closed Captions" },
-+    [AV_FRAME_DATA_MATRIXENCODING]              = { "AVMatrixEncoding" },
-+    [AV_FRAME_DATA_DOWNMIX_INFO]                = { "Metadata relevant to a downmix procedure" },
-+    [AV_FRAME_DATA_AFD]                         = { "Active format description" },
-+    [AV_FRAME_DATA_MOTION_VECTORS]              = { "Motion vectors" },
-+    [AV_FRAME_DATA_SKIP_SAMPLES]                = { "Skip samples" },
-+    [AV_FRAME_DATA_GOP_TIMECODE]                = { "GOP timecode" },
-+    [AV_FRAME_DATA_S12M_TIMECODE]               = { "SMPTE 12-1 timecode" },
-+    [AV_FRAME_DATA_DYNAMIC_HDR_PLUS]            = { "HDR Dynamic Metadata SMPTE2094-40 (HDR10+)" },
-+    [AV_FRAME_DATA_DYNAMIC_HDR_VIVID]           = { "HDR Dynamic Metadata CUVA 005.1 2021 (Vivid)" },
-+    [AV_FRAME_DATA_REGIONS_OF_INTEREST]         = { "Regions Of Interest" },
-+    [AV_FRAME_DATA_VIDEO_ENC_PARAMS]            = { "Video encoding parameters" },
-+    [AV_FRAME_DATA_FILM_GRAIN_PARAMS]           = { "Film grain parameters" },
-+    [AV_FRAME_DATA_DETECTION_BBOXES]            = { "Bounding boxes for object detection and classification" },
-+    [AV_FRAME_DATA_DOVI_RPU_BUFFER]             = { "Dolby Vision RPU Data" },
-+    [AV_FRAME_DATA_DOVI_METADATA]               = { "Dolby Vision Metadata" },
-+    [AV_FRAME_DATA_STEREO3D]                    = { "Stereo 3D",                                    AV_SIDE_DATA_PROP_GLOBAL },
-+    [AV_FRAME_DATA_REPLAYGAIN]                  = { "AVReplayGain",                                 AV_SIDE_DATA_PROP_GLOBAL },
-+    [AV_FRAME_DATA_DISPLAYMATRIX]               = { "3x3 displaymatrix",                            AV_SIDE_DATA_PROP_GLOBAL },
-+    [AV_FRAME_DATA_AUDIO_SERVICE_TYPE]          = { "Audio service type",                           AV_SIDE_DATA_PROP_GLOBAL },
-+    [AV_FRAME_DATA_MASTERING_DISPLAY_METADATA]  = { "Mastering display metadata",                   AV_SIDE_DATA_PROP_GLOBAL },
-+    [AV_FRAME_DATA_CONTENT_LIGHT_LEVEL]         = { "Content light level metadata",                 AV_SIDE_DATA_PROP_GLOBAL },
-+    [AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT] = { "Ambient viewing environment",                  AV_SIDE_DATA_PROP_GLOBAL },
-+    [AV_FRAME_DATA_SPHERICAL]                   = { "Spherical Mapping",                            AV_SIDE_DATA_PROP_GLOBAL },
-+    [AV_FRAME_DATA_ICC_PROFILE]                 = { "ICC profile",                                  AV_SIDE_DATA_PROP_GLOBAL },
-+    [AV_FRAME_DATA_SEI_UNREGISTERED]            = { "H.26[45] User Data Unregistered SEI message",  AV_SIDE_DATA_PROP_MULTI },
-+};
- 
- static void get_frame_defaults(AVFrame *frame)
- {
-     memset(frame, 0, sizeof(*frame));
- 
-     frame->pts                   =
-     frame->pkt_dts               = AV_NOPTS_VALUE;
-     frame->best_effort_timestamp = AV_NOPTS_VALUE;
-     frame->duration            = 0;
--#if FF_API_PKT_DURATION
--FF_DISABLE_DEPRECATION_WARNINGS
--    frame->pkt_duration        = 0;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
- #if FF_API_FRAME_PKT
- FF_DISABLE_DEPRECATION_WARNINGS
-     frame->pkt_pos             = -1;
-     frame->pkt_size            = -1;
- FF_ENABLE_DEPRECATION_WARNINGS
- #endif
-     frame->time_base           = (AVRational){ 0, 1 };
-     frame->sample_aspect_ratio = (AVRational){ 0, 1 };
-@@ -70,24 +88,66 @@ static void free_side_data(AVFrameSideDa
- {
-     AVFrameSideData *sd = *ptr_sd;
- 
-     av_buffer_unref(&sd->buf);
-     av_dict_free(&sd->metadata);
-     av_freep(ptr_sd);
- }
- 
--static void wipe_side_data(AVFrame *frame)
-+static void wipe_side_data(AVFrameSideData ***sd, int *nb_side_data)
-+{
-+    for (int i = 0; i < *nb_side_data; i++) {
-+        free_side_data(&((*sd)[i]));
-+    }
-+    *nb_side_data = 0;
-+
-+    av_freep(sd);
-+}
-+
-+static void frame_side_data_wipe(AVFrame *frame)
-+{
-+    wipe_side_data(&frame->side_data, &frame->nb_side_data);
-+}
-+
-+void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd)
-+{
-+    wipe_side_data(sd, nb_sd);
-+}
-+
-+static void remove_side_data(AVFrameSideData ***sd, int *nb_side_data,
-+                             const enum AVFrameSideDataType type)
- {
--    for (int i = 0; i < frame->nb_side_data; i++) {
--        free_side_data(&frame->side_data[i]);
-+    for (int i = *nb_side_data - 1; i >= 0; i--) {
-+        AVFrameSideData *entry = ((*sd)[i]);
-+        if (entry->type != type)
-+            continue;
-+
-+        free_side_data(&entry);
-+
-+        ((*sd)[i]) = ((*sd)[*nb_side_data - 1]);
-+        (*nb_side_data)--;
-     }
--    frame->nb_side_data = 0;
-+}
- 
--    av_freep(&frame->side_data);
-+static void remove_side_data_by_entry(AVFrameSideData ***sd, int *nb_sd,
-+                                      const AVFrameSideData *target)
-+{
-+    for (int i = *nb_sd - 1; i >= 0; i--) {
-+        AVFrameSideData *entry = ((*sd)[i]);
-+        if (entry != target)
-+            continue;
-+
-+        free_side_data(&entry);
-+
-+        ((*sd)[i]) = ((*sd)[*nb_sd - 1]);
-+        (*nb_sd)--;
-+
-+        return;
-+    }
- }
- 
- AVFrame *av_frame_alloc(void)
- {
-     AVFrame *frame = av_malloc(sizeof(*frame));
- 
-     if (!frame)
-         return NULL;
-@@ -176,31 +236,16 @@ fail:
- }
- 
- static int get_audio_buffer(AVFrame *frame, int align)
- {
-     int planar   = av_sample_fmt_is_planar(frame->format);
-     int channels, planes;
-     int ret;
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    if (!frame->ch_layout.nb_channels) {
--        if (frame->channel_layout) {
--            av_channel_layout_from_mask(&frame->ch_layout, frame->channel_layout);
--        } else {
--            frame->ch_layout.nb_channels = frame->channels;
--            frame->ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
--        }
--    }
--    frame->channels = frame->ch_layout.nb_channels;
--    frame->channel_layout = frame->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
--                            frame->ch_layout.u.mask : 0;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     channels = frame->ch_layout.nb_channels;
-     planes   = planar ? channels : 1;
-     if (!frame->linesize[0]) {
-         ret = av_samples_get_buffer_size(&frame->linesize[0], channels,
-                                          frame->nb_samples, frame->format,
-                                          align);
-         if (ret < 0)
-             return ret;
-@@ -240,27 +285,21 @@ FF_ENABLE_DEPRECATION_WARNINGS
- 
- }
- 
- int av_frame_get_buffer(AVFrame *frame, int align)
- {
-     if (frame->format < 0)
-         return AVERROR(EINVAL);
- 
--FF_DISABLE_DEPRECATION_WARNINGS
-     if (frame->width > 0 && frame->height > 0)
-         return get_video_buffer(frame, align);
-     else if (frame->nb_samples > 0 &&
--             (av_channel_layout_check(&frame->ch_layout)
--#if FF_API_OLD_CHANNEL_LAYOUT
--              || frame->channel_layout || frame->channels > 0
--#endif
--             ))
-+             (av_channel_layout_check(&frame->ch_layout)))
-         return get_audio_buffer(frame, align);
--FF_ENABLE_DEPRECATION_WARNINGS
- 
-     return AVERROR(EINVAL);
- }
- 
- static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy)
- {
-     int ret;
- 
-@@ -293,35 +332,19 @@ FF_ENABLE_DEPRECATION_WARNINGS
-     dst->opaque                 = src->opaque;
-     dst->pkt_dts                = src->pkt_dts;
- #if FF_API_FRAME_PKT
- FF_DISABLE_DEPRECATION_WARNINGS
-     dst->pkt_pos                = src->pkt_pos;
-     dst->pkt_size               = src->pkt_size;
- FF_ENABLE_DEPRECATION_WARNINGS
- #endif
--#if FF_API_PKT_DURATION
--FF_DISABLE_DEPRECATION_WARNINGS
--    dst->pkt_duration           = src->pkt_duration;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     dst->time_base              = src->time_base;
--#if FF_API_REORDERED_OPAQUE
--FF_DISABLE_DEPRECATION_WARNINGS
--    dst->reordered_opaque       = src->reordered_opaque;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     dst->quality                = src->quality;
-     dst->best_effort_timestamp  = src->best_effort_timestamp;
--#if FF_API_FRAME_PICTURE_NUMBER
--FF_DISABLE_DEPRECATION_WARNINGS
--    dst->coded_picture_number   = src->coded_picture_number;
--    dst->display_picture_number = src->display_picture_number;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     dst->flags                  = src->flags;
-     dst->decode_error_flags     = src->decode_error_flags;
-     dst->color_primaries        = src->color_primaries;
-     dst->color_trc              = src->color_trc;
-     dst->colorspace             = src->colorspace;
-     dst->color_range            = src->color_range;
-     dst->chroma_location        = src->chroma_location;
- 
-@@ -332,79 +355,57 @@ FF_ENABLE_DEPRECATION_WARNINGS
-         AVFrameSideData *sd_dst;
-         if (   sd_src->type == AV_FRAME_DATA_PANSCAN
-             && (src->width != dst->width || src->height != dst->height))
-             continue;
-         if (force_copy) {
-             sd_dst = av_frame_new_side_data(dst, sd_src->type,
-                                             sd_src->size);
-             if (!sd_dst) {
--                wipe_side_data(dst);
-+                frame_side_data_wipe(dst);
-                 return AVERROR(ENOMEM);
-             }
-             memcpy(sd_dst->data, sd_src->data, sd_src->size);
-         } else {
-             AVBufferRef *ref = av_buffer_ref(sd_src->buf);
-             sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref);
-             if (!sd_dst) {
-                 av_buffer_unref(&ref);
--                wipe_side_data(dst);
-+                frame_side_data_wipe(dst);
-                 return AVERROR(ENOMEM);
-             }
-         }
-         av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0);
-     }
- 
-     ret = av_buffer_replace(&dst->opaque_ref, src->opaque_ref);
-     ret |= av_buffer_replace(&dst->private_ref, src->private_ref);
-     return ret;
- }
- 
- int av_frame_ref(AVFrame *dst, const AVFrame *src)
- {
-     int ret = 0;
- 
-     av_assert1(dst->width == 0 && dst->height == 0);
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    av_assert1(dst->channels == 0);
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     av_assert1(dst->ch_layout.nb_channels == 0 &&
-                dst->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC);
- 
-     dst->format         = src->format;
-     dst->width          = src->width;
-     dst->height         = src->height;
-     dst->nb_samples     = src->nb_samples;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    dst->channels       = src->channels;
--    dst->channel_layout = src->channel_layout;
--    if (!av_channel_layout_check(&src->ch_layout)) {
--        if (src->channel_layout)
--            av_channel_layout_from_mask(&dst->ch_layout, src->channel_layout);
--        else {
--            dst->ch_layout.nb_channels = src->channels;
--            dst->ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
--        }
--    }
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
- 
-     ret = frame_copy_props(dst, src, 0);
-     if (ret < 0)
-         goto fail;
- 
--    // this check is needed only until FF_API_OLD_CHANNEL_LAYOUT is out
--    if (av_channel_layout_check(&src->ch_layout)) {
--        ret = av_channel_layout_copy(&dst->ch_layout, &src->ch_layout);
--        if (ret < 0)
--            goto fail;
--    }
-+    ret = av_channel_layout_copy(&dst->ch_layout, &src->ch_layout);
-+    if (ret < 0)
-+        goto fail;
- 
-     /* duplicate the frame data if it's not refcounted */
-     if (!src->buf[0]) {
-         ret = av_frame_get_buffer(dst, 0);
-         if (ret < 0)
-             goto fail;
- 
-         ret = av_frame_copy(dst, src);
-@@ -498,39 +499,22 @@ int av_frame_replace(AVFrame *dst, const
-         if (ret < 0)
-             goto fail;
-     }
- 
-     dst->format         = src->format;
-     dst->width          = src->width;
-     dst->height         = src->height;
-     dst->nb_samples     = src->nb_samples;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    dst->channels       = src->channels;
--    dst->channel_layout = src->channel_layout;
--    if (!av_channel_layout_check(&src->ch_layout)) {
--        av_channel_layout_uninit(&dst->ch_layout);
--        if (src->channel_layout)
--            av_channel_layout_from_mask(&dst->ch_layout, src->channel_layout);
--        else {
--            dst->ch_layout.nb_channels = src->channels;
--            dst->ch_layout.order       = AV_CHANNEL_ORDER_UNSPEC;
--        }
--    } else {
--#endif
-+
-     ret = av_channel_layout_copy(&dst->ch_layout, &src->ch_layout);
-     if (ret < 0)
-         goto fail;
--#if FF_API_OLD_CHANNEL_LAYOUT
--    }
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
- 
--    wipe_side_data(dst);
-+    frame_side_data_wipe(dst);
-     av_dict_free(&dst->metadata);
-     ret = frame_copy_props(dst, src, 0);
-     if (ret < 0)
-         goto fail;
- 
-     /* replace the buffers */
-     for (int i = 0; i < FF_ARRAY_ELEMS(src->buf); i++) {
-         ret = av_buffer_replace(&dst->buf[i], src->buf[i]);
-@@ -619,17 +603,17 @@ AVFrame *av_frame_clone(const AVFrame *s
-     return ret;
- }
- 
- void av_frame_unref(AVFrame *frame)
- {
-     if (!frame)
-         return;
- 
--    wipe_side_data(frame);
-+    frame_side_data_wipe(frame);
- 
-     for (int i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)
-         av_buffer_unref(&frame->buf[i]);
-     for (int i = 0; i < frame->nb_extended_buf; i++)
-         av_buffer_unref(&frame->extended_buf[i]);
-     av_freep(&frame->extended_buf);
-     av_dict_free(&frame->metadata);
- 
-@@ -644,21 +628,16 @@ void av_frame_unref(AVFrame *frame)
-     av_channel_layout_uninit(&frame->ch_layout);
- 
-     get_frame_defaults(frame);
- }
- 
- void av_frame_move_ref(AVFrame *dst, AVFrame *src)
- {
-     av_assert1(dst->width == 0 && dst->height == 0);
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    av_assert1(dst->channels == 0);
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     av_assert1(dst->ch_layout.nb_channels == 0 &&
-                dst->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC);
- 
-     *dst = *src;
-     if (src->extended_data == src->data)
-         dst->extended_data = dst->data;
-     get_frame_defaults(src);
- }
-@@ -687,22 +666,16 @@ int av_frame_make_writable(AVFrame *fram
- 
-     if (av_frame_is_writable(frame))
-         return 0;
- 
-     memset(&tmp, 0, sizeof(tmp));
-     tmp.format         = frame->format;
-     tmp.width          = frame->width;
-     tmp.height         = frame->height;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    tmp.channels       = frame->channels;
--    tmp.channel_layout = frame->channel_layout;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     tmp.nb_samples     = frame->nb_samples;
-     ret = av_channel_layout_copy(&tmp.ch_layout, &frame->ch_layout);
-     if (ret < 0) {
-         av_frame_unref(&tmp);
-         return ret;
-     }
- 
-     if (frame->hw_frames_ctx)
-@@ -740,25 +713,16 @@ int av_frame_copy_props(AVFrame *dst, co
- 
- AVBufferRef *av_frame_get_plane_buffer(const AVFrame *frame, int plane)
- {
-     uint8_t *data;
-     int planes;
- 
-     if (frame->nb_samples) {
-         int channels = frame->ch_layout.nb_channels;
--
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--        if (!channels) {
--            channels = frame->channels;
--            CHECK_CHANNELS_CONSISTENCY(frame);
--        }
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-         if (!channels)
-             return NULL;
-         planes = av_sample_fmt_is_planar(frame->format) ? channels : 1;
-     } else
-         planes = 4;
- 
-     if (plane < 0 || plane >= planes || !frame->extended_data[plane])
-         return NULL;
-@@ -772,68 +736,147 @@ FF_ENABLE_DEPRECATION_WARNINGS
-     for (int i = 0; i < frame->nb_extended_buf; i++) {
-         AVBufferRef *buf = frame->extended_buf[i];
-         if (data >= buf->data && data < buf->data + buf->size)
-             return buf;
-     }
-     return NULL;
- }
- 
--AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
--                                                 enum AVFrameSideDataType type,
--                                                 AVBufferRef *buf)
-+static AVFrameSideData *add_side_data_from_buf_ext(AVFrameSideData ***sd,
-+                                                   int *nb_sd,
-+                                                   enum AVFrameSideDataType type,
-+                                                   AVBufferRef *buf, uint8_t *data,
-+                                                   size_t size)
- {
-     AVFrameSideData *ret, **tmp;
- 
--    if (!buf)
--        return NULL;
--
--    if (frame->nb_side_data > INT_MAX / sizeof(*frame->side_data) - 1)
-+    // *nb_sd + 1 needs to fit into an int and a size_t.
-+    if ((unsigned)*nb_sd >= FFMIN(INT_MAX, SIZE_MAX))
-         return NULL;
- 
--    tmp = av_realloc(frame->side_data,
--                     (frame->nb_side_data + 1) * sizeof(*frame->side_data));
-+    tmp = av_realloc_array(*sd, sizeof(**sd), *nb_sd + 1);
-     if (!tmp)
-         return NULL;
--    frame->side_data = tmp;
-+    *sd = tmp;
- 
-     ret = av_mallocz(sizeof(*ret));
-     if (!ret)
-         return NULL;
- 
-     ret->buf = buf;
--    ret->data = ret->buf->data;
--    ret->size = buf->size;
-+    ret->data = data;
-+    ret->size = size;
-     ret->type = type;
- 
--    frame->side_data[frame->nb_side_data++] = ret;
-+    (*sd)[(*nb_sd)++] = ret;
- 
-     return ret;
- }
- 
-+static AVFrameSideData *add_side_data_from_buf(AVFrameSideData ***sd,
-+                                               int *nb_sd,
-+                                               enum AVFrameSideDataType type,
-+                                               AVBufferRef *buf)
-+{
-+    if (!buf)
-+        return NULL;
-+
-+    return add_side_data_from_buf_ext(sd, nb_sd, type, buf, buf->data, buf->size);
-+}
-+
-+AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
-+                                                 enum AVFrameSideDataType type,
-+                                                 AVBufferRef *buf)
-+{
-+    return
-+        add_side_data_from_buf(
-+            &frame->side_data, &frame->nb_side_data, type, buf);
-+}
-+
- AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
-                                         enum AVFrameSideDataType type,
-                                         size_t size)
- {
-     AVFrameSideData *ret;
-     AVBufferRef *buf = av_buffer_alloc(size);
-     ret = av_frame_new_side_data_from_buf(frame, type, buf);
-     if (!ret)
-         av_buffer_unref(&buf);
-     return ret;
- }
- 
-+AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
-+                                        enum AVFrameSideDataType type,
-+                                        size_t size, unsigned int flags)
-+{
-+    AVBufferRef     *buf = av_buffer_alloc(size);
-+    AVFrameSideData *ret = NULL;
-+
-+    if (flags & AV_FRAME_SIDE_DATA_FLAG_UNIQUE)
-+        remove_side_data(sd, nb_sd, type);
-+
-+    ret = add_side_data_from_buf(sd, nb_sd, type, buf);
-+    if (!ret)
-+        av_buffer_unref(&buf);
-+
-+    return ret;
-+}
-+
-+int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd,
-+                             const AVFrameSideData *src, unsigned int flags)
-+{
-+    AVBufferRef     *buf    = NULL;
-+    AVFrameSideData *sd_dst = NULL;
-+    int              ret    = AVERROR_BUG;
-+
-+    if (!sd || !src || !nb_sd || (*nb_sd && !*sd))
-+        return AVERROR(EINVAL);
-+
-+    buf = av_buffer_ref(src->buf);
-+    if (!buf)
-+        return AVERROR(ENOMEM);
-+
-+    if (flags & AV_FRAME_SIDE_DATA_FLAG_UNIQUE)
-+        remove_side_data(sd, nb_sd, src->type);
-+
-+    sd_dst = add_side_data_from_buf_ext(sd, nb_sd, src->type, buf,
-+                                        src->data, src->size);
-+    if (!sd_dst) {
-+        av_buffer_unref(&buf);
-+        return AVERROR(ENOMEM);
-+    }
-+
-+    ret = av_dict_copy(&sd_dst->metadata, src->metadata, 0);
-+    if (ret < 0) {
-+        remove_side_data_by_entry(sd, nb_sd, sd_dst);
-+        return ret;
-+    }
-+
-+    return 0;
-+}
-+
-+const AVFrameSideData *av_frame_side_data_get_c(const AVFrameSideData * const *sd,
-+                                                const int nb_sd,
-+                                                enum AVFrameSideDataType type)
-+{
-+    for (int i = 0; i < nb_sd; i++) {
-+        if (sd[i]->type == type)
-+            return sd[i];
-+    }
-+    return NULL;
-+}
-+
- AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
-                                         enum AVFrameSideDataType type)
- {
--    for (int i = 0; i < frame->nb_side_data; i++) {
--        if (frame->side_data[i]->type == type)
--            return frame->side_data[i];
--    }
--    return NULL;
-+    return (AVFrameSideData *)av_frame_side_data_get(
-+        frame->side_data, frame->nb_side_data,
-+        type
-+    );
- }
- 
- static int frame_copy_video(AVFrame *dst, const AVFrame *src)
- {
-     int planes;
- 
-     if (dst->width  < src->width ||
-         dst->height < src->height)
-@@ -855,40 +898,18 @@ static int frame_copy_video(AVFrame *dst
- }
- 
- static int frame_copy_audio(AVFrame *dst, const AVFrame *src)
- {
-     int planar   = av_sample_fmt_is_planar(dst->format);
-     int channels = dst->ch_layout.nb_channels;
-     int planes   = planar ? channels : 1;
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    if (!channels || !src->ch_layout.nb_channels) {
--        if (dst->channels       != src->channels ||
--            dst->channel_layout != src->channel_layout)
--            return AVERROR(EINVAL);
--        CHECK_CHANNELS_CONSISTENCY(src);
--    }
--    if (!channels) {
--        channels = dst->channels;
--        planes = planar ? channels : 1;
--    }
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
-     if (dst->nb_samples != src->nb_samples ||
--#if FF_API_OLD_CHANNEL_LAYOUT
--        (av_channel_layout_check(&dst->ch_layout) &&
--         av_channel_layout_check(&src->ch_layout) &&
--#endif
-         av_channel_layout_compare(&dst->ch_layout, &src->ch_layout))
--#if FF_API_OLD_CHANNEL_LAYOUT
--        )
--#endif
-         return AVERROR(EINVAL);
- 
-     for (int i = 0; i < planes; i++)
-         if (!dst->extended_data[i] || !src->extended_data[i])
-             return AVERROR(EINVAL);
- 
-     av_samples_copy(dst->extended_data, src->extended_data, 0, 0,
-                     dst->nb_samples, channels, dst->format);
-@@ -896,75 +917,42 @@ FF_ENABLE_DEPRECATION_WARNINGS
-     return 0;
- }
- 
- int av_frame_copy(AVFrame *dst, const AVFrame *src)
- {
-     if (dst->format != src->format || dst->format < 0)
-         return AVERROR(EINVAL);
- 
--FF_DISABLE_DEPRECATION_WARNINGS
-     if (dst->width > 0 && dst->height > 0)
-         return frame_copy_video(dst, src);
-     else if (dst->nb_samples > 0 &&
--             (av_channel_layout_check(&dst->ch_layout)
--#if FF_API_OLD_CHANNEL_LAYOUT
--              || dst->channels > 0
--#endif
--            ))
-+             (av_channel_layout_check(&dst->ch_layout)))
-         return frame_copy_audio(dst, src);
--FF_ENABLE_DEPRECATION_WARNINGS
- 
-     return AVERROR(EINVAL);
- }
- 
- void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
- {
--    for (int 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]);
--            frame->side_data[i] = frame->side_data[frame->nb_side_data - 1];
--            frame->nb_side_data--;
--        }
--    }
-+    remove_side_data(&frame->side_data, &frame->nb_side_data, type);
-+}
-+
-+const AVSideDataDescriptor *av_frame_side_data_desc(enum AVFrameSideDataType type)
-+{
-+    unsigned t = type;
-+    if (t < FF_ARRAY_ELEMS(sd_props) && sd_props[t].name)
-+        return &sd_props[t];
-+    return NULL;
- }
- 
- const char *av_frame_side_data_name(enum AVFrameSideDataType type)
- {
--    switch(type) {
--    case AV_FRAME_DATA_PANSCAN:         return "AVPanScan";
--    case AV_FRAME_DATA_A53_CC:          return "ATSC A53 Part 4 Closed Captions";
--    case AV_FRAME_DATA_STEREO3D:        return "Stereo 3D";
--    case AV_FRAME_DATA_MATRIXENCODING:  return "AVMatrixEncoding";
--    case AV_FRAME_DATA_DOWNMIX_INFO:    return "Metadata relevant to a downmix procedure";
--    case AV_FRAME_DATA_REPLAYGAIN:      return "AVReplayGain";
--    case AV_FRAME_DATA_DISPLAYMATRIX:   return "3x3 displaymatrix";
--    case AV_FRAME_DATA_AFD:             return "Active format description";
--    case AV_FRAME_DATA_MOTION_VECTORS:  return "Motion vectors";
--    case AV_FRAME_DATA_SKIP_SAMPLES:    return "Skip samples";
--    case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:          return "Audio service type";
--    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";
--    case AV_FRAME_DATA_DYNAMIC_HDR_PLUS: return "HDR Dynamic Metadata SMPTE2094-40 (HDR10+)";
--    case AV_FRAME_DATA_DYNAMIC_HDR_VIVID: return "HDR Dynamic Metadata CUVA 005.1 2021 (Vivid)";
--    case AV_FRAME_DATA_REGIONS_OF_INTEREST: return "Regions Of Interest";
--    case AV_FRAME_DATA_VIDEO_ENC_PARAMS:            return "Video encoding parameters";
--    case AV_FRAME_DATA_SEI_UNREGISTERED:            return "H.26[45] User Data Unregistered SEI message";
--    case AV_FRAME_DATA_FILM_GRAIN_PARAMS:           return "Film grain parameters";
--    case AV_FRAME_DATA_DETECTION_BBOXES:            return "Bounding boxes for object detection and classification";
--    case AV_FRAME_DATA_DOVI_RPU_BUFFER:             return "Dolby Vision RPU Data";
--    case AV_FRAME_DATA_DOVI_METADATA:               return "Dolby Vision Metadata";
--    case AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT: return "Ambient viewing environment";
--    }
--    return NULL;
-+    const AVSideDataDescriptor *desc = av_frame_side_data_desc(type);
-+    return desc ? desc->name : NULL;
- }
- 
- static int calc_cropping_offsets(size_t offsets[4], const AVFrame *frame,
-                                  const AVPixFmtDescriptor *desc)
- {
-     for (int i = 0; frame->data[i]; i++) {
-         const AVComponentDescriptor *comp = NULL;
-         int shift_x = (i == 1 || i == 2) ? desc->log2_chroma_w : 0;
-diff --git a/media/ffvpx/libavutil/frame.h b/media/ffvpx/libavutil/frame.h
---- a/media/ffvpx/libavutil/frame.h
-+++ b/media/ffvpx/libavutil/frame.h
-@@ -175,16 +175,20 @@ enum AVFrameSideDataType {
-      * The data is stored as uint8_t in AVFrameSideData.data which is 16 bytes of
-      * uuid_iso_iec_11578 followed by AVFrameSideData.size - 16 bytes of user_data_payload_byte.
-      */
-     AV_FRAME_DATA_SEI_UNREGISTERED,
- 
-     /**
-      * Film grain parameters for a frame, described by AVFilmGrainParams.
-      * Must be present for every frame which should have film grain applied.
-+     *
-+     * May be present multiple times, for example when there are multiple
-+     * alternative parameter sets for different video signal characteristics.
-+     * The user should select the most appropriate set for the application.
-      */
-     AV_FRAME_DATA_FILM_GRAIN_PARAMS,
- 
-     /**
-      * Bounding boxes for object detection and classification,
-      * as described by AVDetectionBBoxHeader.
-      */
-     AV_FRAME_DATA_DETECTION_BBOXES,
-@@ -246,16 +250,47 @@ enum AVActiveFormatDescription {
- typedef struct AVFrameSideData {
-     enum AVFrameSideDataType type;
-     uint8_t *data;
-     size_t   size;
-     AVDictionary *metadata;
-     AVBufferRef *buf;
- } AVFrameSideData;
- 
-+enum AVSideDataProps {
-+    /**
-+     * The side data type can be used in stream-global structures.
-+     * Side data types without this property are only meaningful on per-frame
-+     * basis.
-+     */
-+    AV_SIDE_DATA_PROP_GLOBAL = (1 << 0),
-+
-+    /**
-+     * Multiple instances of this side data type can be meaningfully present in
-+     * a single side data array.
-+     */
-+    AV_SIDE_DATA_PROP_MULTI  = (1 << 1),
-+};
-+
-+/**
-+ * This struct describes the properties of a side data type. Its instance
-+ * corresponding to a given type can be obtained from av_frame_side_data_desc().
-+ */
-+typedef struct AVSideDataDescriptor {
-+    /**
-+     * Human-readable side data description.
-+     */
-+    const char      *name;
-+
-+    /**
-+     * Side data property flags, a combination of AVSideDataProps values.
-+     */
-+    unsigned         props;
-+} AVSideDataDescriptor;
-+
- /**
-  * 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.
-  *
-@@ -461,29 +496,16 @@ typedef struct AVFrame {
-     /**
-      * Time base for the timestamps in this frame.
-      * In the future, this field may be set on frames output by decoders or
-      * filters, but its value will be by default ignored on input to encoders
-      * or filters.
-      */
-     AVRational time_base;
- 
--#if FF_API_FRAME_PICTURE_NUMBER
--    /**
--     * picture number in bitstream order
--     */
--    attribute_deprecated
--    int coded_picture_number;
--    /**
--     * picture number in display order
--     */
--    attribute_deprecated
--    int display_picture_number;
--#endif
--
-     /**
-      * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
-      */
-     int quality;
- 
-     /**
-      * Frame owner's private data.
-      *
-@@ -541,45 +563,21 @@ typedef struct AVFrame {
- #if FF_API_PALETTE_HAS_CHANGED
-     /**
-      * Tell user application that palette has changed from previous frame.
-      */
-     attribute_deprecated
-     int palette_has_changed;
- #endif
- 
--#if FF_API_REORDERED_OPAQUE
--    /**
--     * reordered opaque 64 bits (generally an integer or a double precision float
--     * PTS but can be anything).
--     * The user sets AVCodecContext.reordered_opaque to represent the input at
--     * 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 Use AV_CODEC_FLAG_COPY_OPAQUE instead
--     */
--    attribute_deprecated
--    int64_t reordered_opaque;
--#endif
--
-     /**
-      * Sample rate of the audio data.
-      */
-     int sample_rate;
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--    /**
--     * Channel layout of the audio data.
--     * @deprecated use ch_layout instead
--     */
--    attribute_deprecated
--    uint64_t channel_layout;
--#endif
--
-     /**
-      * AVBuffer references backing the data for this frame. All the pointers in
-      * data and extended_data must point inside one of the buffers in buf or
-      * extended_buf. This array must be filled contiguously -- if buf[i] is
-      * non-NULL then buf[j] must also be non-NULL for all j < i.
-      *
-      * There may be at most one AVBuffer per data plane, so for video this array
-      * always contains all the references. For planar audio with more than
-@@ -682,29 +680,16 @@ typedef struct AVFrame {
-      * - decoding: Read by user.
-      * @deprecated use AV_CODEC_FLAG_COPY_OPAQUE to pass through arbitrary user
-      *             data from packets to frames
-      */
-     attribute_deprecated
-     int64_t pkt_pos;
- #endif
- 
--#if FF_API_PKT_DURATION
--    /**
--     * duration of the corresponding packet, expressed in
--     * AVStream->time_base units, 0 if unknown.
--     * - encoding: unused
--     * - decoding: Read by user.
--     *
--     * @deprecated use duration instead
--     */
--    attribute_deprecated
--    int64_t pkt_duration;
--#endif
--
-     /**
-      * metadata.
-      * - encoding: Set by user.
-      * - decoding: Set by libavcodec.
-      */
-     AVDictionary *metadata;
- 
-     /**
-@@ -715,27 +700,16 @@ typedef struct AVFrame {
-      * - decoding: set by libavcodec, read by user.
-      */
-     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
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--    /**
--     * number of audio channels, only used for audio.
--     * - encoding: unused
--     * - decoding: Read by user.
--     * @deprecated use ch_layout instead
--     */
--    attribute_deprecated
--    int channels;
--#endif
--
- #if FF_API_FRAME_PKT
-     /**
-      * size of the corresponding packet containing the compressed
-      * frame.
-      * It is set to a negative value if unknown.
-      * - encoding: unused
-      * - decoding: set by libavcodec, read by user.
-      * @deprecated use AV_CODEC_FLAG_COPY_OPAQUE to pass through arbitrary user
-@@ -1045,12 +1019,100 @@ enum {
- int av_frame_apply_cropping(AVFrame *frame, int flags);
- 
- /**
-  * @return a string identifying the side data type
-  */
- const char *av_frame_side_data_name(enum AVFrameSideDataType type);
- 
- /**
-+ * @return side data descriptor corresponding to a given side data type, NULL
-+ *         when not available.
-+ */
-+const AVSideDataDescriptor *av_frame_side_data_desc(enum AVFrameSideDataType type);
-+
-+/**
-+ * Free all side data entries and their contents, then zeroes out the
-+ * values which the pointers are pointing to.
-+ *
-+ * @param sd    pointer to array of side data to free. Will be set to NULL
-+ *              upon return.
-+ * @param nb_sd pointer to an integer containing the number of entries in
-+ *              the array. Will be set to 0 upon return.
-+ */
-+void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd);
-+
-+#define AV_FRAME_SIDE_DATA_FLAG_UNIQUE (1 << 0)
-+
-+/**
-+ * Add new side data entry to an array.
-+ *
-+ * @param sd    pointer to array of side data to which to add another entry,
-+ *              or to NULL in order to start a new array.
-+ * @param nb_sd pointer to an integer containing the number of entries in
-+ *              the array.
-+ * @param type  type of the added side data
-+ * @param size  size of the side data
-+ * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.
-+ *
-+ * @return newly added side data on success, NULL on error. In case of
-+ *         AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of matching
-+ *         AVFrameSideDataType will be removed before the addition is
-+ *         attempted.
-+ */
-+AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
-+                                        enum AVFrameSideDataType type,
-+                                        size_t size, unsigned int flags);
-+
-+/**
-+ * Add a new side data entry to an array based on existing side data, taking
-+ * a reference towards the contained AVBufferRef.
-+ *
-+ * @param sd    pointer to array of side data to which to add another entry,
-+ *              or to NULL in order to start a new array.
-+ * @param nb_sd pointer to an integer containing the number of entries in
-+ *              the array.
-+ * @param src   side data to be cloned, with a new reference utilized
-+ *              for the buffer.
-+ * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.
-+ *
-+ * @return negative error code on failure, >=0 on success. In case of
-+ *         AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of matching
-+ *         AVFrameSideDataType will be removed before the addition is
-+ *         attempted.
-+ */
-+int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd,
-+                             const AVFrameSideData *src, unsigned int flags);
-+
-+/**
-+ * Get a side data entry of a specific type from an array.
-+ *
-+ * @param sd    array of side data.
-+ * @param nb_sd integer containing the number of entries in the array.
-+ * @param type  type of side data to be queried
-+ *
-+ * @return a pointer to the side data of a given type on success, NULL if there
-+ *         is no side data with such type in this set.
-+ */
-+const AVFrameSideData *av_frame_side_data_get_c(const AVFrameSideData * const *sd,
-+                                                const int nb_sd,
-+                                                enum AVFrameSideDataType type);
-+
-+/**
-+ * Wrapper around av_frame_side_data_get_c() to workaround the limitation
-+ * that for any type T the conversion from T * const * to const T * const *
-+ * is not performed automatically in C.
-+ * @see av_frame_side_data_get_c()
-+ */
-+static inline
-+const AVFrameSideData *av_frame_side_data_get(AVFrameSideData * const *sd,
-+                                              const int nb_sd,
-+                                              enum AVFrameSideDataType type)
-+{
-+    return av_frame_side_data_get_c((const AVFrameSideData * const *)sd,
-+                                    nb_sd, type);
-+}
-+
-+/**
-  * @}
-  */
- 
- #endif /* AVUTIL_FRAME_H */
-diff --git a/media/ffvpx/libavutil/hdr_dynamic_metadata.h b/media/ffvpx/libavutil/hdr_dynamic_metadata.h
---- a/media/ffvpx/libavutil/hdr_dynamic_metadata.h
-+++ b/media/ffvpx/libavutil/hdr_dynamic_metadata.h
-@@ -354,23 +354,23 @@ int av_dynamic_hdr_plus_from_t35(AVDynam
-                                  size_t size);
- 
- #define AV_HDR_PLUS_MAX_PAYLOAD_SIZE 907
- 
- /**
-  * Serialize dynamic HDR10+ metadata to a user data registered ITU-T T.35 buffer,
-  * excluding the first 48 bytes of the header, and beginning with the application mode.
-  * @param s A pointer containing the decoded AVDynamicHDRPlus structure.
-- * @param data[in,out] A pointer to pointer to a byte buffer to be filled with the
-+ * @param[in,out] data A pointer to pointer to a byte buffer to be filled with the
-  *                     serialized metadata.
-  *                     If *data is NULL, a buffer be will be allocated and a pointer to
-  *                     it stored in its place. The caller assumes ownership of the buffer.
-  *                     May be NULL, in which case the function will only store the
-  *                     required buffer size in *size.
-- * @param size[in,out] A pointer to a size to be set to the returned buffer's size.
-+ * @param[in,out] size A pointer to a size to be set to the returned buffer's size.
-  *                     If *data is not NULL, *size must contain the size of the input
-  *                     buffer. May be NULL only if *data is NULL.
-  *
-  * @return >= 0 on success. Otherwise, returns the appropriate AVERROR.
-  */
- int av_dynamic_hdr_plus_to_t35(const AVDynamicHDRPlus *s, uint8_t **data, size_t *size);
- 
- #endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */
-diff --git a/media/ffvpx/libavutil/hwcontext.c b/media/ffvpx/libavutil/hwcontext.c
---- a/media/ffvpx/libavutil/hwcontext.c
-+++ b/media/ffvpx/libavutil/hwcontext.c
-@@ -79,16 +79,31 @@ static const char *const hw_type_names[]
-     [AV_HWDEVICE_TYPE_QSV]    = "qsv",
-     [AV_HWDEVICE_TYPE_VAAPI]  = "vaapi",
-     [AV_HWDEVICE_TYPE_VDPAU]  = "vdpau",
-     [AV_HWDEVICE_TYPE_VIDEOTOOLBOX] = "videotoolbox",
-     [AV_HWDEVICE_TYPE_MEDIACODEC] = "mediacodec",
-     [AV_HWDEVICE_TYPE_VULKAN] = "vulkan",
- };
- 
-+typedef struct FFHWDeviceContext {
-+    /**
-+     * The public AVHWDeviceContext. See hwcontext.h for it.
-+     */
-+    AVHWDeviceContext p;
-+
-+    const HWContextType *hw_type;
-+
-+    /**
-+     * For a derived device, a reference to the original device
-+     * context it was derived from.
-+     */
-+    AVBufferRef *source_device;
-+} FFHWDeviceContext;
-+
- enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name)
- {
-     int type;
-     for (type = 0; type < FF_ARRAY_ELEMS(hw_type_names); type++) {
-         if (hw_type_names[type] && !strcmp(hw_type_names[type], name))
-             return type;
-     }
-     return AV_HWDEVICE_TYPE_NONE;
-@@ -121,159 +136,132 @@ enum AVHWDeviceType av_hwdevice_iterate_
- static const AVClass hwdevice_ctx_class = {
-     .class_name = "AVHWDeviceContext",
-     .item_name  = av_default_item_name,
-     .version    = LIBAVUTIL_VERSION_INT,
- };
- 
- static void hwdevice_ctx_free(void *opaque, uint8_t *data)
- {
--    AVHWDeviceContext *ctx = (AVHWDeviceContext*)data;
-+    FFHWDeviceContext *ctxi = (FFHWDeviceContext*)data;
-+    AVHWDeviceContext *ctx  = &ctxi->p;
- 
-     /* uninit might still want access the hw context and the user
-      * free() callback might destroy it, so uninit has to be called first */
--    if (ctx->internal->hw_type->device_uninit)
--        ctx->internal->hw_type->device_uninit(ctx);
-+    if (ctxi->hw_type->device_uninit)
-+        ctxi->hw_type->device_uninit(ctx);
- 
-     if (ctx->free)
-         ctx->free(ctx);
- 
--    av_buffer_unref(&ctx->internal->source_device);
-+    av_buffer_unref(&ctxi->source_device);
- 
-     av_freep(&ctx->hwctx);
--    av_freep(&ctx->internal->priv);
--    av_freep(&ctx->internal);
-     av_freep(&ctx);
- }
- 
- AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type)
- {
-+    FFHWDeviceContext *ctxi;
-     AVHWDeviceContext *ctx;
-     AVBufferRef *buf;
-     const HWContextType *hw_type = NULL;
-     int i;
- 
-     for (i = 0; hw_table[i]; i++) {
-         if (hw_table[i]->type == type) {
-             hw_type = hw_table[i];
-             break;
-         }
-     }
-     if (!hw_type)
-         return NULL;
- 
--    ctx = av_mallocz(sizeof(*ctx));
--    if (!ctx)
-+    ctxi = av_mallocz(sizeof(*ctxi));
-+    if (!ctxi)
-         return NULL;
--
--    ctx->internal = av_mallocz(sizeof(*ctx->internal));
--    if (!ctx->internal)
--        goto fail;
--
--    if (hw_type->device_priv_size) {
--        ctx->internal->priv = av_mallocz(hw_type->device_priv_size);
--        if (!ctx->internal->priv)
--            goto fail;
--    }
-+    ctx = &ctxi->p;
- 
-     if (hw_type->device_hwctx_size) {
-         ctx->hwctx = av_mallocz(hw_type->device_hwctx_size);
-         if (!ctx->hwctx)
-             goto fail;
-     }
- 
-     buf = av_buffer_create((uint8_t*)ctx, sizeof(*ctx),
-                            hwdevice_ctx_free, NULL,
-                            AV_BUFFER_FLAG_READONLY);
-     if (!buf)
-         goto fail;
- 
-     ctx->type     = type;
-     ctx->av_class = &hwdevice_ctx_class;
- 
--    ctx->internal->hw_type = hw_type;
-+    ctxi->hw_type = hw_type;
- 
-     return buf;
- 
- fail:
--    if (ctx->internal)
--        av_freep(&ctx->internal->priv);
--    av_freep(&ctx->internal);
-     av_freep(&ctx->hwctx);
-     av_freep(&ctx);
-     return NULL;
- }
- 
- int av_hwdevice_ctx_init(AVBufferRef *ref)
- {
--    AVHWDeviceContext *ctx = (AVHWDeviceContext*)ref->data;
--    int ret;
-+    FFHWDeviceContext *ctxi = (FFHWDeviceContext*)ref->data;
-+    AVHWDeviceContext *ctx  = &ctxi->p;
-+    int ret = 0;
- 
--    if (ctx->internal->hw_type->device_init) {
--        ret = ctx->internal->hw_type->device_init(ctx);
--        if (ret < 0)
--            goto fail;
--    }
-+    if (ctxi->hw_type->device_init)
-+        ret = ctxi->hw_type->device_init(ctx);
- 
--    return 0;
--fail:
--    if (ctx->internal->hw_type->device_uninit)
--        ctx->internal->hw_type->device_uninit(ctx);
-     return ret;
- }
- 
- static const AVClass hwframe_ctx_class = {
-     .class_name = "AVHWFramesContext",
-     .item_name  = av_default_item_name,
-     .version    = LIBAVUTIL_VERSION_INT,
- };
- 
- static void hwframe_ctx_free(void *opaque, uint8_t *data)
- {
--    AVHWFramesContext *ctx = (AVHWFramesContext*)data;
-+    FFHWFramesContext *ctxi = (FFHWFramesContext*)data;
-+    AVHWFramesContext *ctx  = &ctxi->p;
- 
--    if (ctx->internal->pool_internal)
--        av_buffer_pool_uninit(&ctx->internal->pool_internal);
-+    if (ctxi->pool_internal)
-+        av_buffer_pool_uninit(&ctxi->pool_internal);
- 
--    if (ctx->internal->hw_type->frames_uninit)
--        ctx->internal->hw_type->frames_uninit(ctx);
-+    if (ctxi->hw_type->frames_uninit)
-+        ctxi->hw_type->frames_uninit(ctx);
- 
-     if (ctx->free)
-         ctx->free(ctx);
- 
--    av_buffer_unref(&ctx->internal->source_frames);
-+    av_buffer_unref(&ctxi->source_frames);
- 
-     av_buffer_unref(&ctx->device_ref);
- 
-     av_freep(&ctx->hwctx);
--    av_freep(&ctx->internal->priv);
--    av_freep(&ctx->internal);
-     av_freep(&ctx);
- }
- 
- AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
- {
--    AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)device_ref_in->data;
--    const HWContextType  *hw_type = device_ctx->internal->hw_type;
-+    FFHWDeviceContext *device_ctx = (FFHWDeviceContext*)device_ref_in->data;
-+    const HWContextType  *hw_type = device_ctx->hw_type;
-+    FFHWFramesContext *ctxi;
-     AVHWFramesContext *ctx;
-     AVBufferRef *buf, *device_ref = NULL;
- 
--    ctx = av_mallocz(sizeof(*ctx));
--    if (!ctx)
-+    ctxi = av_mallocz(sizeof(*ctxi));
-+    if (!ctxi)
-         return NULL;
--
--    ctx->internal = av_mallocz(sizeof(*ctx->internal));
--    if (!ctx->internal)
--        goto fail;
--
--    if (hw_type->frames_priv_size) {
--        ctx->internal->priv = av_mallocz(hw_type->frames_priv_size);
--        if (!ctx->internal->priv)
--            goto fail;
--    }
-+    ctx  = &ctxi->p;
- 
-     if (hw_type->frames_hwctx_size) {
-         ctx->hwctx = av_mallocz(hw_type->frames_hwctx_size);
-         if (!ctx->hwctx)
-             goto fail;
-     }
- 
-     device_ref = av_buffer_ref(device_ref_in);
-@@ -283,30 +271,26 @@ AVBufferRef *av_hwframe_ctx_alloc(AVBuff
-     buf = av_buffer_create((uint8_t*)ctx, sizeof(*ctx),
-                            hwframe_ctx_free, NULL,
-                            AV_BUFFER_FLAG_READONLY);
-     if (!buf)
-         goto fail;
- 
-     ctx->av_class   = &hwframe_ctx_class;
-     ctx->device_ref = device_ref;
--    ctx->device_ctx = device_ctx;
-+    ctx->device_ctx = &device_ctx->p;
-     ctx->format     = AV_PIX_FMT_NONE;
-     ctx->sw_format  = AV_PIX_FMT_NONE;
- 
--    ctx->internal->hw_type = hw_type;
-+    ctxi->hw_type = hw_type;
- 
-     return buf;
- 
- fail:
--    if (device_ref)
--        av_buffer_unref(&device_ref);
--    if (ctx->internal)
--        av_freep(&ctx->internal->priv);
--    av_freep(&ctx->internal);
-+    av_buffer_unref(&device_ref);
-     av_freep(&ctx->hwctx);
-     av_freep(&ctx);
-     return NULL;
- }
- 
- static int hwframe_pool_prealloc(AVBufferRef *ref)
- {
-     AVHWFramesContext *ctx = (AVHWFramesContext*)ref->data;
-@@ -332,76 +316,73 @@ fail:
-         av_frame_free(&frames[i]);
-     av_freep(&frames);
- 
-     return ret;
- }
- 
- int av_hwframe_ctx_init(AVBufferRef *ref)
- {
--    AVHWFramesContext *ctx = (AVHWFramesContext*)ref->data;
-+    FFHWFramesContext *ctxi = (FFHWFramesContext*)ref->data;
-+    AVHWFramesContext *ctx  = &ctxi->p;
-     const enum AVPixelFormat *pix_fmt;
-     int ret;
- 
--    if (ctx->internal->source_frames) {
-+    if (ctxi->source_frames) {
-         /* A derived frame context is already initialised. */
-         return 0;
-     }
- 
-     /* validate the pixel format */
--    for (pix_fmt = ctx->internal->hw_type->pix_fmts; *pix_fmt != AV_PIX_FMT_NONE; pix_fmt++) {
-+    for (pix_fmt = ctxi->hw_type->pix_fmts; *pix_fmt != AV_PIX_FMT_NONE; pix_fmt++) {
-         if (*pix_fmt == ctx->format)
-             break;
-     }
-     if (*pix_fmt == AV_PIX_FMT_NONE) {
-         av_log(ctx, AV_LOG_ERROR,
-                "The hardware pixel format '%s' is not supported by the device type '%s'\n",
--               av_get_pix_fmt_name(ctx->format), ctx->internal->hw_type->name);
-+               av_get_pix_fmt_name(ctx->format), ctxi->hw_type->name);
-         return AVERROR(ENOSYS);
-     }
- 
-     /* validate the dimensions */
-     ret = av_image_check_size(ctx->width, ctx->height, 0, ctx);
-     if (ret < 0)
-         return ret;
- 
-     /* format-specific init */
--    if (ctx->internal->hw_type->frames_init) {
--        ret = ctx->internal->hw_type->frames_init(ctx);
-+    if (ctxi->hw_type->frames_init) {
-+        ret = ctxi->hw_type->frames_init(ctx);
-         if (ret < 0)
--            goto fail;
-+            return ret;
-     }
- 
--    if (ctx->internal->pool_internal && !ctx->pool)
--        ctx->pool = ctx->internal->pool_internal;
-+    if (ctxi->pool_internal && !ctx->pool)
-+        ctx->pool = ctxi->pool_internal;
- 
-     /* preallocate the frames in the pool, if requested */
-     if (ctx->initial_pool_size > 0) {
-         ret = hwframe_pool_prealloc(ref);
-         if (ret < 0)
--            goto fail;
-+            return ret;
-     }
- 
-     return 0;
--fail:
--    if (ctx->internal->hw_type->frames_uninit)
--        ctx->internal->hw_type->frames_uninit(ctx);
--    return ret;
- }
- 
- int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ref,
-                                     enum AVHWFrameTransferDirection dir,
-                                     enum AVPixelFormat **formats, int flags)
- {
--    AVHWFramesContext *ctx = (AVHWFramesContext*)hwframe_ref->data;
-+    FFHWFramesContext *ctxi = (FFHWFramesContext*)hwframe_ref->data;
- 
--    if (!ctx->internal->hw_type->transfer_get_formats)
-+    if (!ctxi->hw_type->transfer_get_formats)
-         return AVERROR(ENOSYS);
- 
--    return ctx->internal->hw_type->transfer_get_formats(ctx, dir, formats);
-+    return ctxi->hw_type->transfer_get_formats(&ctxi->p, dir, formats);
- }
- 
- static int transfer_data_alloc(AVFrame *dst, const AVFrame *src, int flags)
- {
-     AVHWFramesContext *ctx;
-     AVFrame *frame_tmp;
-     int ret = 0;
- 
-@@ -446,165 +427,165 @@ static int transfer_data_alloc(AVFrame *
- 
- fail:
-     av_frame_free(&frame_tmp);
-     return ret;
- }
- 
- int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags)
- {
--    AVHWFramesContext *ctx;
-     int ret;
- 
-     if (!dst->buf[0])
-         return transfer_data_alloc(dst, src, flags);
- 
-     /*
-      * 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;
-+        FFHWFramesContext *src_ctx =
-+            (FFHWFramesContext*)src->hw_frames_ctx->data;
-+        FFHWFramesContext *dst_ctx =
-+            (FFHWFramesContext*)dst->hw_frames_ctx->data;
- 
--        if (src_ctx->internal->source_frames) {
-+        if (src_ctx->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) {
-+        if (dst_ctx->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);
-+        ret = src_ctx->hw_type->transfer_data_from(&src_ctx->p, dst, src);
-         if (ret == AVERROR(ENOSYS))
--            ret = dst_ctx->internal->hw_type->transfer_data_to(dst_ctx, dst, src);
-+            ret = dst_ctx->hw_type->transfer_data_to(&dst_ctx->p, dst, src);
-         if (ret < 0)
-             return ret;
-     } else {
-         if (src->hw_frames_ctx) {
--            ctx = (AVHWFramesContext*)src->hw_frames_ctx->data;
-+            FFHWFramesContext *ctx = (FFHWFramesContext*)src->hw_frames_ctx->data;
- 
--            ret = ctx->internal->hw_type->transfer_data_from(ctx, dst, src);
-+            ret = ctx->hw_type->transfer_data_from(&ctx->p, dst, src);
-             if (ret < 0)
-                 return ret;
-         } else if (dst->hw_frames_ctx) {
--            ctx = (AVHWFramesContext*)dst->hw_frames_ctx->data;
-+            FFHWFramesContext *ctx = (FFHWFramesContext*)dst->hw_frames_ctx->data;
- 
--            ret = ctx->internal->hw_type->transfer_data_to(ctx, dst, src);
-+            ret = ctx->hw_type->transfer_data_to(&ctx->p, dst, src);
-             if (ret < 0)
-                 return ret;
-         } else {
-             return AVERROR(ENOSYS);
-         }
-     }
-     return 0;
- }
- 
- int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
- {
--    AVHWFramesContext *ctx = (AVHWFramesContext*)hwframe_ref->data;
-+    FFHWFramesContext *ctxi = (FFHWFramesContext*)hwframe_ref->data;
-+    AVHWFramesContext *ctx  = &ctxi->p;
-     int ret;
- 
--    if (ctx->internal->source_frames) {
-+    if (ctxi->source_frames) {
-         // This is a derived frame context, so we allocate in the source
-         // and map the frame immediately.
-         AVFrame *src_frame;
- 
-         frame->format = ctx->format;
-         frame->hw_frames_ctx = av_buffer_ref(hwframe_ref);
-         if (!frame->hw_frames_ctx)
-             return AVERROR(ENOMEM);
- 
-         src_frame = av_frame_alloc();
-         if (!src_frame)
-             return AVERROR(ENOMEM);
- 
--        ret = av_hwframe_get_buffer(ctx->internal->source_frames,
-+        ret = av_hwframe_get_buffer(ctxi->source_frames,
-                                     src_frame, 0);
-         if (ret < 0) {
-             av_frame_free(&src_frame);
-             return ret;
-         }
- 
-         ret = av_hwframe_map(frame, src_frame,
--                             ctx->internal->source_allocation_map_flags);
-+                             ctxi->source_allocation_map_flags);
-         if (ret) {
-             av_log(ctx, AV_LOG_ERROR, "Failed to map frame into derived "
-                    "frame context: %d.\n", ret);
-             av_frame_free(&src_frame);
-             return ret;
-         }
- 
-         // Free the source frame immediately - the mapped frame still
-         // contains a reference to it.
-         av_frame_free(&src_frame);
- 
-         return 0;
-     }
- 
--    if (!ctx->internal->hw_type->frames_get_buffer)
-+    if (!ctxi->hw_type->frames_get_buffer)
-         return AVERROR(ENOSYS);
- 
-     if (!ctx->pool)
-         return AVERROR(EINVAL);
- 
-     frame->hw_frames_ctx = av_buffer_ref(hwframe_ref);
-     if (!frame->hw_frames_ctx)
-         return AVERROR(ENOMEM);
- 
--    ret = ctx->internal->hw_type->frames_get_buffer(ctx, frame);
-+    ret = ctxi->hw_type->frames_get_buffer(ctx, frame);
-     if (ret < 0) {
-         av_buffer_unref(&frame->hw_frames_ctx);
-         return ret;
-     }
- 
-     frame->extended_data = frame->data;
- 
-     return 0;
- }
- 
- void *av_hwdevice_hwconfig_alloc(AVBufferRef *ref)
- {
--    AVHWDeviceContext *ctx = (AVHWDeviceContext*)ref->data;
--    const HWContextType  *hw_type = ctx->internal->hw_type;
-+    FFHWDeviceContext *ctx = (FFHWDeviceContext*)ref->data;
-+    const HWContextType  *hw_type = ctx->hw_type;
- 
-     if (hw_type->device_hwconfig_size == 0)
-         return NULL;
- 
-     return av_mallocz(hw_type->device_hwconfig_size);
- }
- 
- AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref,
-                                                            const void *hwconfig)
- {
--    AVHWDeviceContext *ctx = (AVHWDeviceContext*)ref->data;
--    const HWContextType  *hw_type = ctx->internal->hw_type;
-+    FFHWDeviceContext *ctx = (FFHWDeviceContext*)ref->data;
-+    const HWContextType  *hw_type = ctx->hw_type;
-     AVHWFramesConstraints *constraints;
- 
-     if (!hw_type->frames_get_constraints)
-         return NULL;
- 
-     constraints = av_mallocz(sizeof(*constraints));
-     if (!constraints)
-         return NULL;
- 
-     constraints->min_width = constraints->min_height = 0;
-     constraints->max_width = constraints->max_height = INT_MAX;
- 
--    if (hw_type->frames_get_constraints(ctx, hwconfig, constraints) >= 0) {
-+    if (hw_type->frames_get_constraints(&ctx->p, hwconfig, constraints) >= 0) {
-         return constraints;
-     } else {
-         av_hwframe_constraints_free(&constraints);
-         return NULL;
-     }
- }
- 
- void av_hwframe_constraints_free(AVHWFramesConstraints **constraints)
-@@ -615,33 +596,33 @@ void av_hwframe_constraints_free(AVHWFra
-     }
-     av_freep(constraints);
- }
- 
- int av_hwdevice_ctx_create(AVBufferRef **pdevice_ref, enum AVHWDeviceType type,
-                            const char *device, AVDictionary *opts, int flags)
- {
-     AVBufferRef *device_ref = NULL;
--    AVHWDeviceContext *device_ctx;
-+    FFHWDeviceContext *device_ctx;
-     int ret = 0;
- 
-     device_ref = av_hwdevice_ctx_alloc(type);
-     if (!device_ref) {
-         ret = AVERROR(ENOMEM);
-         goto fail;
-     }
--    device_ctx = (AVHWDeviceContext*)device_ref->data;
-+    device_ctx = (FFHWDeviceContext*)device_ref->data;
- 
--    if (!device_ctx->internal->hw_type->device_create) {
-+    if (!device_ctx->hw_type->device_create) {
-         ret = AVERROR(ENOSYS);
-         goto fail;
-     }
- 
--    ret = device_ctx->internal->hw_type->device_create(device_ctx, device,
--                                                       opts, flags);
-+    ret = device_ctx->hw_type->device_create(&device_ctx->p, device,
-+                                             opts, flags);
-     if (ret < 0)
-         goto fail;
- 
-     ret = av_hwdevice_ctx_init(device_ref);
-     if (ret < 0)
-         goto fail;
- 
-     *pdevice_ref = device_ref;
-@@ -653,63 +634,62 @@ fail:
- }
- 
- int av_hwdevice_ctx_create_derived_opts(AVBufferRef **dst_ref_ptr,
-                                         enum AVHWDeviceType type,
-                                         AVBufferRef *src_ref,
-                                         AVDictionary *options, int flags)
- {
-     AVBufferRef *dst_ref = NULL, *tmp_ref;
--    AVHWDeviceContext *dst_ctx, *tmp_ctx;
-+    FFHWDeviceContext *dst_ctx;
-     int ret = 0;
- 
-     tmp_ref = src_ref;
-     while (tmp_ref) {
--        tmp_ctx = (AVHWDeviceContext*)tmp_ref->data;
--        if (tmp_ctx->type == type) {
-+        FFHWDeviceContext *tmp_ctx = (FFHWDeviceContext*)tmp_ref->data;
-+        if (tmp_ctx->p.type == type) {
-             dst_ref = av_buffer_ref(tmp_ref);
-             if (!dst_ref) {
-                 ret = AVERROR(ENOMEM);
-                 goto fail;
-             }
-             goto done;
-         }
--        tmp_ref = tmp_ctx->internal->source_device;
-+        tmp_ref = tmp_ctx->source_device;
-     }
- 
-     dst_ref = av_hwdevice_ctx_alloc(type);
-     if (!dst_ref) {
-         ret = AVERROR(ENOMEM);
-         goto fail;
-     }
--    dst_ctx = (AVHWDeviceContext*)dst_ref->data;
-+    dst_ctx = (FFHWDeviceContext*)dst_ref->data;
- 
-     tmp_ref = src_ref;
-     while (tmp_ref) {
--        tmp_ctx = (AVHWDeviceContext*)tmp_ref->data;
--        if (dst_ctx->internal->hw_type->device_derive) {
--            ret = dst_ctx->internal->hw_type->device_derive(dst_ctx,
--                                                            tmp_ctx,
--                                                            options,
--                                                            flags);
-+        FFHWDeviceContext *tmp_ctx = (FFHWDeviceContext*)tmp_ref->data;
-+        if (dst_ctx->hw_type->device_derive) {
-+            ret = dst_ctx->hw_type->device_derive(&dst_ctx->p,
-+                                                  &tmp_ctx->p,
-+                                                  options, flags);
-             if (ret == 0) {
--                dst_ctx->internal->source_device = av_buffer_ref(src_ref);
--                if (!dst_ctx->internal->source_device) {
-+                dst_ctx->source_device = av_buffer_ref(src_ref);
-+                if (!dst_ctx->source_device) {
-                     ret = AVERROR(ENOMEM);
-                     goto fail;
-                 }
-                 ret = av_hwdevice_ctx_init(dst_ref);
-                 if (ret < 0)
-                     goto fail;
-                 goto done;
-             }
-             if (ret != AVERROR(ENOSYS))
-                 goto fail;
-         }
--        tmp_ref = tmp_ctx->internal->source_device;
-+        tmp_ref = tmp_ctx->source_device;
-     }
- 
-     ret = AVERROR(ENOSYS);
-     goto fail;
- 
- done:
-     *dst_ref_ptr = dst_ref;
-     return 0;
-@@ -794,65 +774,64 @@ fail:
-     av_free(hwmap);
-     return ret;
- }
- 
- int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags)
- {
-     AVBufferRef    *orig_dst_frames = dst->hw_frames_ctx;
-     enum AVPixelFormat orig_dst_fmt = dst->format;
--    AVHWFramesContext *src_frames, *dst_frames;
-     HWMapDescriptor *hwmap;
-     int ret;
- 
-     if (src->hw_frames_ctx && dst->hw_frames_ctx) {
--        src_frames = (AVHWFramesContext*)src->hw_frames_ctx->data;
--        dst_frames = (AVHWFramesContext*)dst->hw_frames_ctx->data;
-+        FFHWFramesContext *src_frames = (FFHWFramesContext*)src->hw_frames_ctx->data;
-+        FFHWFramesContext *dst_frames = (FFHWFramesContext*)dst->hw_frames_ctx->data;
- 
-         if ((src_frames == dst_frames &&
--             src->format == dst_frames->sw_format &&
--             dst->format == dst_frames->format) ||
--            (src_frames->internal->source_frames &&
--             src_frames->internal->source_frames->data ==
-+             src->format == dst_frames->p.sw_format &&
-+             dst->format == dst_frames->p.format) ||
-+            (src_frames->source_frames &&
-+             src_frames->source_frames->data ==
-              (uint8_t*)dst_frames)) {
-             // This is an unmap operation.  We don't need to directly
-             // do anything here other than fill in the original frame,
-             // because the real unmap will be invoked when the last
-             // reference to the mapped frame disappears.
-             if (!src->buf[0]) {
-                 av_log(src_frames, AV_LOG_ERROR, "Invalid mapping "
-                        "found when attempting unmap.\n");
-                 return AVERROR(EINVAL);
-             }
-             hwmap = (HWMapDescriptor*)src->buf[0]->data;
-             return av_frame_replace(dst, hwmap->source);
-         }
-     }
- 
-     if (src->hw_frames_ctx) {
--        src_frames = (AVHWFramesContext*)src->hw_frames_ctx->data;
-+        FFHWFramesContext *src_frames = (FFHWFramesContext*)src->hw_frames_ctx->data;
- 
--        if (src_frames->format == src->format &&
--            src_frames->internal->hw_type->map_from) {
--            ret = src_frames->internal->hw_type->map_from(src_frames,
--                                                          dst, src, flags);
-+        if (src_frames->p.format == src->format &&
-+            src_frames->hw_type->map_from) {
-+            ret = src_frames->hw_type->map_from(&src_frames->p,
-+                                                dst, src, flags);
-             if (ret >= 0)
-                 return ret;
-             else if (ret != AVERROR(ENOSYS))
-                 goto fail;
-         }
-     }
- 
-     if (dst->hw_frames_ctx) {
--        dst_frames = (AVHWFramesContext*)dst->hw_frames_ctx->data;
-+        FFHWFramesContext *dst_frames = (FFHWFramesContext*)dst->hw_frames_ctx->data;
- 
--        if (dst_frames->format == dst->format &&
--            dst_frames->internal->hw_type->map_to) {
--            ret = dst_frames->internal->hw_type->map_to(dst_frames,
--                                                        dst, src, flags);
-+        if (dst_frames->p.format == dst->format &&
-+            dst_frames->hw_type->map_to) {
-+            ret = dst_frames->hw_type->map_to(&dst_frames->p,
-+                                              dst, src, flags);
-             if (ret >= 0)
-                 return ret;
-             else if (ret != AVERROR(ENOSYS))
-                 goto fail;
-         }
-     }
- 
-     return AVERROR(ENOSYS);
-@@ -876,81 +855,82 @@ fail:
- 
- int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx,
-                                   enum AVPixelFormat format,
-                                   AVBufferRef *derived_device_ctx,
-                                   AVBufferRef *source_frame_ctx,
-                                   int flags)
- {
-     AVBufferRef   *dst_ref = NULL;
--    AVHWFramesContext *dst = NULL;
--    AVHWFramesContext *src = (AVHWFramesContext*)source_frame_ctx->data;
-+    FFHWFramesContext *dsti = NULL;
-+    FFHWFramesContext *srci = (FFHWFramesContext*)source_frame_ctx->data;
-+    AVHWFramesContext *dst, *src = &srci->p;
-     int ret;
- 
--    if (src->internal->source_frames) {
-+    if (srci->source_frames) {
-         AVHWFramesContext *src_src =
--            (AVHWFramesContext*)src->internal->source_frames->data;
-+            (AVHWFramesContext*)srci->source_frames->data;
-         AVHWDeviceContext *dst_dev =
-             (AVHWDeviceContext*)derived_device_ctx->data;
- 
-         if (src_src->device_ctx == dst_dev) {
-             // This is actually an unmapping, so we just return a
-             // reference to the source frame context.
--            *derived_frame_ctx =
--                av_buffer_ref(src->internal->source_frames);
-+            *derived_frame_ctx = av_buffer_ref(srci->source_frames);
-             if (!*derived_frame_ctx) {
-                 ret = AVERROR(ENOMEM);
-                 goto fail;
-             }
-             return 0;
-         }
-     }
- 
-     dst_ref = av_hwframe_ctx_alloc(derived_device_ctx);
-     if (!dst_ref) {
-         ret = AVERROR(ENOMEM);
-         goto fail;
-     }
- 
--    dst = (AVHWFramesContext*)dst_ref->data;
-+    dsti = (FFHWFramesContext*)dst_ref->data;
-+    dst  = &dsti->p;
- 
-     dst->format    = format;
-     dst->sw_format = src->sw_format;
-     dst->width     = src->width;
-     dst->height    = src->height;
- 
--    dst->internal->source_frames = av_buffer_ref(source_frame_ctx);
--    if (!dst->internal->source_frames) {
-+    dsti->source_frames = av_buffer_ref(source_frame_ctx);
-+    if (!dsti->source_frames) {
-         ret = AVERROR(ENOMEM);
-         goto fail;
-     }
- 
--    dst->internal->source_allocation_map_flags =
-+    dsti->source_allocation_map_flags =
-         flags & (AV_HWFRAME_MAP_READ      |
-                  AV_HWFRAME_MAP_WRITE     |
-                  AV_HWFRAME_MAP_OVERWRITE |
-                  AV_HWFRAME_MAP_DIRECT);
- 
-     ret = AVERROR(ENOSYS);
--    if (src->internal->hw_type->frames_derive_from)
--        ret = src->internal->hw_type->frames_derive_from(dst, src, flags);
-+    if (srci->hw_type->frames_derive_from)
-+        ret = srci->hw_type->frames_derive_from(dst, src, flags);
-     if (ret == AVERROR(ENOSYS) &&
--        dst->internal->hw_type->frames_derive_to)
--        ret = dst->internal->hw_type->frames_derive_to(dst, src, flags);
-+        dsti->hw_type->frames_derive_to)
-+        ret = dsti->hw_type->frames_derive_to(dst, src, flags);
-     if (ret == AVERROR(ENOSYS))
-         ret = 0;
-     if (ret)
-         goto fail;
- 
-     *derived_frame_ctx = dst_ref;
-     return 0;
- 
- fail:
--    if (dst)
--        av_buffer_unref(&dst->internal->source_frames);
-+    if (dsti)
-+        av_buffer_unref(&dsti->source_frames);
-     av_buffer_unref(&dst_ref);
-     return ret;
- }
- 
- int ff_hwframe_map_replace(AVFrame *dst, const AVFrame *src)
- {
-     HWMapDescriptor *hwmap = (HWMapDescriptor*)dst->buf[0]->data;
-     return av_frame_replace(hwmap->source, src);
-diff --git a/media/ffvpx/libavutil/hwcontext.h b/media/ffvpx/libavutil/hwcontext.h
---- a/media/ffvpx/libavutil/hwcontext.h
-+++ b/media/ffvpx/libavutil/hwcontext.h
-@@ -35,18 +35,16 @@ enum AVHWDeviceType {
-     AV_HWDEVICE_TYPE_D3D11VA,
-     AV_HWDEVICE_TYPE_DRM,
-     AV_HWDEVICE_TYPE_OPENCL,
-     AV_HWDEVICE_TYPE_MEDIACODEC,
-     AV_HWDEVICE_TYPE_VULKAN,
-     AV_HWDEVICE_TYPE_D3D12VA,
- };
- 
--typedef struct AVHWDeviceInternal AVHWDeviceInternal;
--
- /**
-  * This struct aggregates all the (hardware/vendor-specific) "high-level" state,
-  * i.e. state that is not tied to a concrete processing configuration.
-  * E.g., in an API that supports hardware-accelerated encoding and decoding,
-  * this struct will (if possible) wrap the state that is common to both encoding
-  * and decoding and from which specific instances of encoders or decoders can be
-  * derived.
-  *
-@@ -61,22 +59,16 @@ typedef struct AVHWDeviceInternal AVHWDe
-  */
- typedef struct AVHWDeviceContext {
-     /**
-      * A class for logging. Set by av_hwdevice_ctx_alloc().
-      */
-     const AVClass *av_class;
- 
-     /**
--     * Private data used internally by libavutil. Must not be accessed in any
--     * way by the caller.
--     */
--    AVHWDeviceInternal *internal;
--
--    /**
-      * This field identifies the underlying API used for hardware access.
-      *
-      * This field is set when this struct is allocated and never changed
-      * afterwards.
-      */
-     enum AVHWDeviceType type;
- 
-     /**
-@@ -105,18 +97,16 @@ typedef struct AVHWDeviceContext {
-     void (*free)(struct AVHWDeviceContext *ctx);
- 
-     /**
-      * Arbitrary user data, to be used e.g. by the free() callback.
-      */
-     void *user_opaque;
- } AVHWDeviceContext;
- 
--typedef struct AVHWFramesInternal AVHWFramesInternal;
--
- /**
-  * This struct describes a set or pool of "hardware" frames (i.e. those with
-  * data not located in normal system memory). All the frames in the pool are
-  * assumed to be allocated in the same way and interchangeable.
-  *
-  * This struct is reference-counted with the AVBuffer mechanism and tied to a
-  * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor
-  * yields a reference, whose data field points to the actual AVHWFramesContext
-@@ -124,22 +114,16 @@ typedef struct AVHWFramesInternal AVHWFr
-  */
- typedef struct AVHWFramesContext {
-     /**
-      * A class for logging.
-      */
-     const AVClass *av_class;
- 
-     /**
--     * Private data used internally by libavutil. Must not be accessed in any
--     * way by the caller.
--     */
--    AVHWFramesInternal *internal;
--
--    /**
-      * A reference to the parent AVHWDeviceContext. This reference is owned and
-      * managed by the enclosing AVHWFramesContext, but the caller may derive
-      * additional references from it.
-      */
-     AVBufferRef *device_ref;
- 
-     /**
-      * The parent AVHWDeviceContext. This is simply a pointer to
-@@ -148,19 +132,22 @@ typedef struct AVHWFramesContext {
-      * Set by libavutil in av_hwframe_ctx_init().
-      */
-     AVHWDeviceContext *device_ctx;
- 
-     /**
-      * The format-specific data, allocated and freed automatically along with
-      * this context.
-      *
--     * Should be cast by the user to the format-specific context defined in the
--     * corresponding header (hwframe_*.h) and filled as described in the
--     * documentation before calling av_hwframe_ctx_init().
-+     * The user shall ignore this field if the corresponding format-specific
-+     * header (hwcontext_*.h) does not define a context to be used as
-+     * AVHWFramesContext.hwctx.
-+     *
-+     * Otherwise, it should be cast by the user to said context and filled
-+     * as described in the documentation before calling av_hwframe_ctx_init().
-      *
-      * After any frames using this context are created, the contents of this
-      * struct should not be modified by the caller.
-      */
-     void *hwctx;
- 
-     /**
-      * This field may be set by the caller before calling av_hwframe_ctx_init().
-diff --git a/media/ffvpx/libavutil/hwcontext_internal.h b/media/ffvpx/libavutil/hwcontext_internal.h
---- a/media/ffvpx/libavutil/hwcontext_internal.h
-+++ b/media/ffvpx/libavutil/hwcontext_internal.h
-@@ -36,38 +36,28 @@ typedef struct HWContextType {
-      */
-     const enum AVPixelFormat *pix_fmts;
- 
-     /**
-      * size of the public hardware-specific context,
-      * i.e. AVHWDeviceContext.hwctx
-      */
-     size_t             device_hwctx_size;
--    /**
--     * size of the private data, i.e.
--     * AVHWDeviceInternal.priv
--     */
--    size_t             device_priv_size;
- 
-     /**
-      * Size of the hardware-specific device configuration.
-      * (Used to query hwframe constraints.)
-      */
-     size_t             device_hwconfig_size;
- 
-     /**
-      * size of the public frame pool hardware-specific context,
-      * i.e. AVHWFramesContext.hwctx
-      */
-     size_t             frames_hwctx_size;
--    /**
--     * size of the private data, i.e.
--     * AVHWFramesInternal.priv
--     */
--    size_t             frames_priv_size;
- 
-     int              (*device_create)(AVHWDeviceContext *ctx, const char *device,
-                                       AVDictionary *opts, int flags);
-     int              (*device_derive)(AVHWDeviceContext *dst_ctx,
-                                       AVHWDeviceContext *src_ctx,
-                                       AVDictionary *opts, int flags);
- 
-     int              (*device_init)(AVHWDeviceContext *ctx);
-@@ -95,44 +85,42 @@ typedef struct HWContextType {
-                                  const AVFrame *src, int flags);
- 
-     int              (*frames_derive_to)(AVHWFramesContext *dst_ctx,
-                                          AVHWFramesContext *src_ctx, int flags);
-     int              (*frames_derive_from)(AVHWFramesContext *dst_ctx,
-                                            AVHWFramesContext *src_ctx, int flags);
- } HWContextType;
- 
--struct AVHWDeviceInternal {
--    const HWContextType *hw_type;
--    void                *priv;
--
-+typedef struct FFHWFramesContext {
-     /**
--     * For a derived device, a reference to the original device
--     * context it was derived from.
-+     * The public AVHWFramesContext. See hwcontext.h for it.
-      */
--    AVBufferRef *source_device;
--};
-+    AVHWFramesContext p;
- 
--struct AVHWFramesInternal {
-     const HWContextType *hw_type;
--    void                *priv;
- 
-     AVBufferPool *pool_internal;
- 
-     /**
-      * For a derived context, a reference to the original frames
-      * context it was derived from.
-      */
-     AVBufferRef *source_frames;
-     /**
-      * Flags to apply to the mapping from the source to the derived
-      * frame context when trying to allocate in the derived context.
-      */
-     int source_allocation_map_flags;
--};
-+} FFHWFramesContext;
-+
-+static inline FFHWFramesContext *ffhwframesctx(AVHWFramesContext *ctx)
-+{
-+    return (FFHWFramesContext*)ctx;
-+}
- 
- typedef struct HWMapDescriptor {
-     /**
-      * A reference to the original source of the mapping.
-      */
-     AVFrame *source;
-     /**
-      * A reference to the hardware frames context in which this
-diff --git a/media/ffvpx/libavutil/hwcontext_vaapi.c b/media/ffvpx/libavutil/hwcontext_vaapi.c
---- a/media/ffvpx/libavutil/hwcontext_vaapi.c
-+++ b/media/ffvpx/libavutil/hwcontext_vaapi.c
-@@ -70,22 +70,32 @@ typedef struct VAAPIDevicePriv {
- } VAAPIDevicePriv;
- 
- typedef struct VAAPISurfaceFormat {
-     enum AVPixelFormat pix_fmt;
-     VAImageFormat image_format;
- } VAAPISurfaceFormat;
- 
- typedef struct VAAPIDeviceContext {
-+    /**
-+     * The public AVVAAPIDeviceContext. See hwcontext_vaapi.h for it.
-+     */
-+    AVVAAPIDeviceContext p;
-+
-     // Surface formats which can be used with this device.
-     VAAPISurfaceFormat *formats;
-     int              nb_formats;
- } VAAPIDeviceContext;
- 
- typedef struct VAAPIFramesContext {
-+    /**
-+     * The public AVVAAPIFramesContext. See hwcontext_vaapi.h for it.
-+     */
-+    AVVAAPIFramesContext p;
-+
-     // Surface attributes set at create time.
-     VASurfaceAttrib *attributes;
-     int           nb_attributes;
-     // RT format of the underlying surface (Intel driver ignores this anyway).
-     unsigned int rt_format;
-     // Whether vaDeriveImage works.
-     int derive_works;
-     // Caches whether VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2 is unsupported for
-@@ -202,36 +212,36 @@ static enum AVPixelFormat vaapi_pix_fmt_
-     else
-         return AV_PIX_FMT_NONE;
- }
- 
- static int vaapi_get_image_format(AVHWDeviceContext *hwdev,
-                                   enum AVPixelFormat pix_fmt,
-                                   VAImageFormat **image_format)
- {
--    VAAPIDeviceContext *ctx = hwdev->internal->priv;
-+    VAAPIDeviceContext *ctx = hwdev->hwctx;
-     int i;
- 
-     for (i = 0; i < ctx->nb_formats; i++) {
-         if (ctx->formats[i].pix_fmt == pix_fmt) {
-             if (image_format)
-                 *image_format = &ctx->formats[i].image_format;
-             return 0;
-         }
-     }
-     return AVERROR(ENOSYS);
- }
- 
- static int vaapi_frames_get_constraints(AVHWDeviceContext *hwdev,
-                                         const void *hwconfig,
-                                         AVHWFramesConstraints *constraints)
- {
--    AVVAAPIDeviceContext *hwctx = hwdev->hwctx;
-+    VAAPIDeviceContext *ctx = hwdev->hwctx;
-+    AVVAAPIDeviceContext *hwctx = &ctx->p;
-     const AVVAAPIHWConfig *config = hwconfig;
--    VAAPIDeviceContext *ctx = hwdev->internal->priv;
-     VASurfaceAttrib *attr_list = NULL;
-     VAStatus vas;
-     enum AVPixelFormat pix_fmt;
-     unsigned int fourcc;
-     int err, i, j, attr_count, pix_fmt_count;
- 
-     if (config &&
-         !(hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES)) {
-@@ -379,18 +389,18 @@ static const struct {
-         "VDPAU wrapper",
-         "Splitted-Desktop Systems VDPAU backend for VA-API",
-         AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES,
-     },
- };
- 
- static int vaapi_device_init(AVHWDeviceContext *hwdev)
- {
--    VAAPIDeviceContext *ctx = hwdev->internal->priv;
--    AVVAAPIDeviceContext *hwctx = hwdev->hwctx;
-+    VAAPIDeviceContext *ctx = hwdev->hwctx;
-+    AVVAAPIDeviceContext *hwctx = &ctx->p;
-     VAImageFormat *image_list = NULL;
-     VAStatus vas;
-     const char *vendor_string;
-     int err, i, image_count;
-     enum AVPixelFormat pix_fmt;
-     unsigned int fourcc;
- 
-     image_count = vaMaxNumImageFormats(hwctx->display);
-@@ -469,17 +479,17 @@ static int vaapi_device_init(AVHWDeviceC
- fail:
-     av_freep(&ctx->formats);
-     av_free(image_list);
-     return err;
- }
- 
- static void vaapi_device_uninit(AVHWDeviceContext *hwdev)
- {
--    VAAPIDeviceContext *ctx = hwdev->internal->priv;
-+    VAAPIDeviceContext *ctx = hwdev->hwctx;
- 
-     av_freep(&ctx->formats);
- }
- 
- static void vaapi_buffer_free(void *opaque, uint8_t *data)
- {
-     AVHWFramesContext     *hwfc = opaque;
-     AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
-@@ -493,19 +503,19 @@ static void vaapi_buffer_free(void *opaq
-         av_log(hwfc, AV_LOG_ERROR, "Failed to destroy surface %#x: "
-                "%d (%s).\n", surface_id, vas, vaErrorStr(vas));
-     }
- }
- 
- static AVBufferRef *vaapi_pool_alloc(void *opaque, size_t size)
- {
-     AVHWFramesContext     *hwfc = opaque;
--    VAAPIFramesContext     *ctx = hwfc->internal->priv;
-+    VAAPIFramesContext     *ctx = hwfc->hwctx;
-+    AVVAAPIFramesContext  *avfc = &ctx->p;
-     AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
--    AVVAAPIFramesContext  *avfc = hwfc->hwctx;
-     VASurfaceID surface_id;
-     VAStatus vas;
-     AVBufferRef *ref;
- 
-     if (hwfc->initial_pool_size > 0 &&
-         avfc->nb_surfaces >= hwfc->initial_pool_size)
-         return NULL;
- 
-@@ -536,18 +546,18 @@ static AVBufferRef *vaapi_pool_alloc(voi
-         ++avfc->nb_surfaces;
-     }
- 
-     return ref;
- }
- 
- static int vaapi_frames_init(AVHWFramesContext *hwfc)
- {
--    AVVAAPIFramesContext  *avfc = hwfc->hwctx;
--    VAAPIFramesContext     *ctx = hwfc->internal->priv;
-+    VAAPIFramesContext     *ctx = hwfc->hwctx;
-+    AVVAAPIFramesContext  *avfc = &ctx->p;
-     AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
-     const VAAPIFormatDescriptor *desc;
-     VAImageFormat *expected_format;
-     AVBufferRef *test_surface = NULL;
-     VASurfaceID test_surface_id;
-     VAImage test_image;
-     VAStatus vas;
-     int err, i;
-@@ -618,20 +628,20 @@ static int vaapi_frames_init(AVHWFramesC
-             }
-         } else {
-             // This pool allows dynamic sizing, and will not be usable as a
-             // render target.
-             avfc->nb_surfaces = 0;
-             avfc->surface_ids = NULL;
-         }
- 
--        hwfc->internal->pool_internal =
-+        ffhwframesctx(hwfc)->pool_internal =
-             av_buffer_pool_init2(sizeof(VASurfaceID), hwfc,
-                                  &vaapi_pool_alloc, NULL);
--        if (!hwfc->internal->pool_internal) {
-+        if (!ffhwframesctx(hwfc)->pool_internal) {
-             av_log(hwfc, AV_LOG_ERROR, "Failed to create VAAPI surface pool.\n");
-             err = AVERROR(ENOMEM);
-             goto fail;
-         }
-     }
- 
-     // Allocate a single surface to test whether vaDeriveImage() is going
-     // to work for the specific configuration.
-@@ -639,17 +649,17 @@ static int vaapi_frames_init(AVHWFramesC
-         test_surface = av_buffer_pool_get(hwfc->pool);
-         if (!test_surface) {
-             av_log(hwfc, AV_LOG_ERROR, "Unable to allocate a surface from "
-                    "user-configured buffer pool.\n");
-             err = AVERROR(ENOMEM);
-             goto fail;
-         }
-     } else {
--        test_surface = av_buffer_pool_get(hwfc->internal->pool_internal);
-+        test_surface = av_buffer_pool_get(ffhwframesctx(hwfc)->pool_internal);
-         if (!test_surface) {
-             av_log(hwfc, AV_LOG_ERROR, "Unable to allocate a surface from "
-                    "internal buffer pool.\n");
-             err = AVERROR(ENOMEM);
-             goto fail;
-         }
-     }
-     test_surface_id = (VASurfaceID)(uintptr_t)test_surface->data;
-@@ -688,18 +698,18 @@ fail:
-     av_buffer_unref(&test_surface);
-     av_freep(&avfc->surface_ids);
-     av_freep(&ctx->attributes);
-     return err;
- }
- 
- static void vaapi_frames_uninit(AVHWFramesContext *hwfc)
- {
--    AVVAAPIFramesContext *avfc = hwfc->hwctx;
--    VAAPIFramesContext    *ctx = hwfc->internal->priv;
-+    VAAPIFramesContext    *ctx = hwfc->hwctx;
-+    AVVAAPIFramesContext *avfc = &ctx->p;
- 
-     av_freep(&avfc->surface_ids);
-     av_freep(&ctx->attributes);
- }
- 
- static int vaapi_get_buffer(AVHWFramesContext *hwfc, AVFrame *frame)
- {
-     frame->buf[0] = av_buffer_pool_get(hwfc->pool);
-@@ -713,17 +723,17 @@ static int vaapi_get_buffer(AVHWFramesCo
- 
-     return 0;
- }
- 
- static int vaapi_transfer_get_formats(AVHWFramesContext *hwfc,
-                                       enum AVHWFrameTransferDirection dir,
-                                       enum AVPixelFormat **formats)
- {
--    VAAPIDeviceContext *ctx = hwfc->device_ctx->internal->priv;
-+    VAAPIDeviceContext *ctx = hwfc->device_ctx->hwctx;
-     enum AVPixelFormat *pix_fmts;
-     int i, k, sw_format_available;
- 
-     sw_format_available = 0;
-     for (i = 0; i < ctx->nb_formats; i++) {
-         if (ctx->formats[i].pix_fmt == hwfc->sw_format)
-             sw_format_available = 1;
-     }
-@@ -786,17 +796,17 @@ static void vaapi_unmap_frame(AVHWFrames
- 
-     av_free(map);
- }
- 
- static int vaapi_map_frame(AVHWFramesContext *hwfc,
-                            AVFrame *dst, const AVFrame *src, int flags)
- {
-     AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
--    VAAPIFramesContext *ctx = hwfc->internal->priv;
-+    VAAPIFramesContext *ctx = hwfc->hwctx;
-     VASurfaceID surface_id;
-     const VAAPIFormatDescriptor *desc;
-     VAImageFormat *image_format;
-     VAAPIMapping *map;
-     VAStatus vas;
-     void *address = NULL;
-     int err, i;
- 
-@@ -1065,17 +1075,17 @@ static void vaapi_unmap_from_drm(AVHWFra
- 
-     vaDestroySurfaces(dst_dev->display, &surface_id, 1);
- }
- 
- static int vaapi_map_from_drm(AVHWFramesContext *src_fc, AVFrame *dst,
-                               const AVFrame *src, int flags)
- {
- #if VA_CHECK_VERSION(1, 1, 0)
--    VAAPIFramesContext     *src_vafc = src_fc->internal->priv;
-+    VAAPIFramesContext    *src_vafc = src_fc->hwctx;
-     int use_prime2;
- #else
-     int k;
- #endif
-     AVHWFramesContext      *dst_fc =
-         (AVHWFramesContext*)dst->hw_frames_ctx->data;
-     AVVAAPIDeviceContext  *dst_dev = dst_fc->device_ctx->hwctx;
-     const AVDRMFrameDescriptor *desc;
-@@ -2002,21 +2012,19 @@ static int vaapi_device_derive(AVHWDevic
- #endif
-     return AVERROR(ENOSYS);
- }
- 
- const HWContextType ff_hwcontext_type_vaapi = {
-     .type                   = AV_HWDEVICE_TYPE_VAAPI,
-     .name                   = "VAAPI",
- 
--    .device_hwctx_size      = sizeof(AVVAAPIDeviceContext),
--    .device_priv_size       = sizeof(VAAPIDeviceContext),
-+    .device_hwctx_size      = sizeof(VAAPIDeviceContext),
-     .device_hwconfig_size   = sizeof(AVVAAPIHWConfig),
--    .frames_hwctx_size      = sizeof(AVVAAPIFramesContext),
--    .frames_priv_size       = sizeof(VAAPIFramesContext),
-+    .frames_hwctx_size      = sizeof(VAAPIFramesContext),
- 
-     .device_create          = &vaapi_device_create,
-     .device_derive          = &vaapi_device_derive,
-     .device_init            = &vaapi_device_init,
-     .device_uninit          = &vaapi_device_uninit,
-     .frames_get_constraints = &vaapi_frames_get_constraints,
-     .frames_init            = &vaapi_frames_init,
-     .frames_uninit          = &vaapi_frames_uninit,
-diff --git a/media/ffvpx/libavutil/imgutils.c b/media/ffvpx/libavutil/imgutils.c
---- a/media/ffvpx/libavutil/imgutils.c
-+++ b/media/ffvpx/libavutil/imgutils.c
-@@ -20,20 +20,20 @@
-  * @file
-  * misc image utilities
-  */
- 
- #include "avassert.h"
- #include "common.h"
- #include "imgutils.h"
- #include "imgutils_internal.h"
--#include "internal.h"
- #include "intreadwrite.h"
- #include "log.h"
- #include "mathematics.h"
-+#include "mem.h"
- #include "pixdesc.h"
- #include "rational.h"
- 
- void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4],
-                                 const AVPixFmtDescriptor *pixdesc)
- {
-     int i;
-     memset(max_pixsteps, 0, 4*sizeof(max_pixsteps[0]));
-diff --git a/media/ffvpx/libavutil/imgutils_internal.h b/media/ffvpx/libavutil/imgutils_internal.h
---- a/media/ffvpx/libavutil/imgutils_internal.h
-+++ b/media/ffvpx/libavutil/imgutils_internal.h
-@@ -17,14 +17,18 @@
-  */
- 
- #ifndef AVUTIL_IMGUTILS_INTERNAL_H
- #define AVUTIL_IMGUTILS_INTERNAL_H
- 
- #include <stddef.h>
- #include <stdint.h>
- 
-+#include "pixfmt.h"
-+
-+int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt);
-+
- int ff_image_copy_plane_uc_from_x86(uint8_t       *dst, ptrdiff_t dst_linesize,
-                                     const uint8_t *src, ptrdiff_t src_linesize,
-                                     ptrdiff_t bytewidth, int height);
- 
- 
- #endif /* AVUTIL_IMGUTILS_INTERNAL_H */
-diff --git a/media/ffvpx/libavutil/internal.h b/media/ffvpx/libavutil/internal.h
---- a/media/ffvpx/libavutil/internal.h
-+++ b/media/ffvpx/libavutil/internal.h
-@@ -35,18 +35,18 @@
- 
- #include <limits.h>
- #include <stdint.h>
- #include <stddef.h>
- #include <assert.h>
- #include <stdio.h>
- #include "config.h"
- #include "attributes.h"
-+#include "libm.h"
- #include "macros.h"
--#include "pixfmt.h"
- 
- #ifndef attribute_align_arg
- #if ARCH_X86_32 && AV_GCC_VERSION_AT_LEAST(4,2)
- #    define attribute_align_arg __attribute__((force_align_arg_pointer))
- #else
- #    define attribute_align_arg
- #endif
- #endif
-@@ -69,38 +69,26 @@
- #        define FF_ENABLE_DEPRECATION_WARNINGS  _Pragma("GCC diagnostic pop")
- #    endif
- #else
- #    define FF_DISABLE_DEPRECATION_WARNINGS
- #    define FF_ENABLE_DEPRECATION_WARNINGS
- #endif
- 
- 
--#define FF_MEMORY_POISON 0x2a
--
--/* Check if the hard coded offset of a struct member still matches reality.
-- * Induce a compilation failure if not.
-- */
--#define AV_CHECK_OFFSET(s, m, o) struct check_##o {    \
--        int x_##o[offsetof(s, m) == o? 1: -1];         \
--    }
--
--
- #define FF_ALLOC_TYPED_ARRAY(p, nelem)  (p = av_malloc_array(nelem, sizeof(*p)))
- #define FF_ALLOCZ_TYPED_ARRAY(p, nelem) (p = av_calloc(nelem, sizeof(*p)))
- 
- #define FF_PTR_ADD(ptr, off) ((off) ? (ptr) + (off) : (ptr))
- 
- /**
-  * Access a field in a structure by its offset.
-  */
- #define FF_FIELD_AT(type, off, obj) (*(type *)((char *)&(obj) + (off)))
- 
--#include "libm.h"
--
- /**
-  * Return NULL if CONFIG_SMALL is true, otherwise the argument
-  * without modification. Used to disable the definition of strings.
-  */
- #if CONFIG_SMALL
- #   define NULL_IF_CONFIG_SMALL(x) NULL
- #else
- #   define NULL_IF_CONFIG_SMALL(x) x
-@@ -158,18 +146,16 @@ void avpriv_request_sample(void *avc,
- #ifdef CHECKED
- #define SUINT   int
- #define SUINT32 int32_t
- #else
- #define SUINT   unsigned
- #define SUINT32 uint32_t
- #endif
- 
--int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt);
--
- static av_always_inline av_const int avpriv_mirror(int x, int w)
- {
-     if (!w)
-         return 0;
- 
-     while ((unsigned)x > (unsigned)w) {
-         x = -x;
-         if (x < 0)
-diff --git a/media/ffvpx/libavutil/intreadwrite.h b/media/ffvpx/libavutil/intreadwrite.h
---- a/media/ffvpx/libavutil/intreadwrite.h
-+++ b/media/ffvpx/libavutil/intreadwrite.h
-@@ -578,19 +578,17 @@ union unaligned_16 { uint16_t l; } __att
- #   define AV_COPY128U(d, s)                                    \
-     do {                                                        \
-         AV_COPY64U(d, s);                                       \
-         AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8);     \
-     } while(0)
- #endif
- 
- /* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be
-- * naturally aligned. They may be implemented using MMX,
-- * so emms_c() must be called before using any float code
-- * afterwards.
-+ * naturally aligned.
-  */
- 
- #define AV_COPY(n, d, s) \
-     (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n)
- 
- #ifndef AV_COPY16
- #   define AV_COPY16(d, s) AV_COPY(16, d, s)
- #endif
-diff --git a/media/ffvpx/libavutil/mem.c b/media/ffvpx/libavutil/mem.c
---- a/media/ffvpx/libavutil/mem.c
-+++ b/media/ffvpx/libavutil/mem.c
-@@ -57,24 +57,26 @@
- void *malloc(size_t size);
- void *memalign(size_t align, size_t size);
- int   posix_memalign(void **ptr, size_t align, size_t size);
- void *realloc(void *ptr, size_t size);
- void  free(void *ptr);
- 
- #endif /* MALLOC_PREFIX */
- 
--#define ALIGN (HAVE_AVX512 ? 64 : (HAVE_AVX ? 32 : 16))
-+#define ALIGN (HAVE_SIMD_ALIGN_64 ? 64 : (HAVE_SIMD_ALIGN_32 ? 32 : 16))
-+
-+#define FF_MEMORY_POISON 0x2a
- 
- /* NOTE: if you want to override these functions with your own
-  * implementations (not recommended) you have to link libav* as
-  * dynamic libraries and remove -Wl,-Bsymbolic from the linker flags.
-  * Note that this will cost performance. */
- 
--static atomic_size_t max_alloc_size = ATOMIC_VAR_INIT(INT_MAX);
-+static atomic_size_t max_alloc_size = INT_MAX;
- 
- void av_max_alloc(size_t max){
-     atomic_store_explicit(&max_alloc_size, max, memory_order_relaxed);
- }
- 
- static int size_mult(size_t a, size_t b, size_t *r)
- {
-     size_t t;
-diff --git a/media/ffvpx/libavutil/mem.h b/media/ffvpx/libavutil/mem.h
---- a/media/ffvpx/libavutil/mem.h
-+++ b/media/ffvpx/libavutil/mem.h
-@@ -111,17 +111,17 @@
-  * Allocate a memory block with alignment suitable for all memory accesses
-  * (including vectors if available on the CPU).
-  *
-  * @param size Size in bytes for the memory block to be allocated
-  * @return Pointer to the allocated block, or `NULL` if the block cannot
-  *         be allocated
-  * @see av_mallocz()
-  */
--void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1) __attribute__((visibility("default")));
-+void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
- 
- /**
-  * Allocate a memory block with alignment suitable for all memory accesses
-  * (including vectors if available on the CPU) and zero all the bytes of the
-  * block.
-  *
-  * @param size Size in bytes for the memory block to be allocated
-  * @return Pointer to the allocated block, or `NULL` if it cannot be allocated
-diff --git a/media/ffvpx/libavutil/mem_internal.h b/media/ffvpx/libavutil/mem_internal.h
---- a/media/ffvpx/libavutil/mem_internal.h
-+++ b/media/ffvpx/libavutil/mem_internal.h
-@@ -22,18 +22,16 @@
- #define AVUTIL_MEM_INTERNAL_H
- 
- #include "config.h"
- 
- #include <stdint.h>
- 
- #include "attributes.h"
- #include "macros.h"
--#include "mem.h"
--#include "version.h"
- 
- /**
-  * @def DECLARE_ALIGNED(n,t,v)
-  * Declare a variable that is aligned in memory.
-  *
-  * @code{.c}
-  * DECLARE_ALIGNED(16, uint16_t, aligned_int) = 42;
-  * DECLARE_ALIGNED(32, uint8_t, aligned_array)[128];
-@@ -71,37 +69,60 @@
-  * @endcode
-  *
-  * @param n Minimum alignment in bytes
-  * @param t Type of the variable (or array element)
-  * @param v Name of the variable
-  */
- 
- #if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C)
--    #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned (n))) v
-+    #define DECLARE_ALIGNED_T(n,t,v)    t __attribute__ ((aligned (n))) v
-     #define DECLARE_ASM_ALIGNED(n,t,v)  t __attribute__ ((aligned (n))) v
-     #define DECLARE_ASM_CONST(n,t,v)    const t __attribute__ ((aligned (n))) v
- #elif defined(__DJGPP__)
--    #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned (FFMIN(n, 16)))) v
-+    #define DECLARE_ALIGNED_T(n,t,v)    t __attribute__ ((aligned (FFMIN(n, 16)))) v
-     #define DECLARE_ASM_ALIGNED(n,t,v)  t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v
-     #define DECLARE_ASM_CONST(n,t,v)    static const t av_used __attribute__ ((aligned (FFMIN(n, 16)))) v
- #elif defined(__GNUC__) || defined(__clang__)
--    #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned (n))) v
-+    #define DECLARE_ALIGNED_T(n,t,v)    t __attribute__ ((aligned (n))) v
-     #define DECLARE_ASM_ALIGNED(n,t,v)  t av_used __attribute__ ((aligned (n))) v
-     #define DECLARE_ASM_CONST(n,t,v)    static const t av_used __attribute__ ((aligned (n))) v
- #elif defined(_MSC_VER)
--    #define DECLARE_ALIGNED(n,t,v)      __declspec(align(n)) t v
-+    #define DECLARE_ALIGNED_T(n,t,v)    __declspec(align(n)) t v
-     #define DECLARE_ASM_ALIGNED(n,t,v)  __declspec(align(n)) t v
-     #define DECLARE_ASM_CONST(n,t,v)    __declspec(align(n)) static const t v
- #else
--    #define DECLARE_ALIGNED(n,t,v)      t v
-+    #define DECLARE_ALIGNED_T(n,t,v)    t v
-     #define DECLARE_ASM_ALIGNED(n,t,v)  t v
-     #define DECLARE_ASM_CONST(n,t,v)    static const t v
- #endif
- 
-+#if HAVE_SIMD_ALIGN_64
-+    #define ALIGN_64 64
-+    #define ALIGN_32 32
-+#elif HAVE_SIMD_ALIGN_32
-+    #define ALIGN_64 32
-+    #define ALIGN_32 32
-+#else
-+    #define ALIGN_64 16
-+    #define ALIGN_32 16
-+#endif
-+
-+#define DECLARE_ALIGNED(n,t,v) DECLARE_ALIGNED_V(n,t,v)
-+
-+// Macro needs to be double-wrapped in order to expand
-+// possible other macros being passed for n.
-+#define DECLARE_ALIGNED_V(n,t,v) DECLARE_ALIGNED_##n(t,v)
-+
-+#define DECLARE_ALIGNED_4(t,v)  DECLARE_ALIGNED_T(       4, t, v)
-+#define DECLARE_ALIGNED_8(t,v)  DECLARE_ALIGNED_T(       8, t, v)
-+#define DECLARE_ALIGNED_16(t,v) DECLARE_ALIGNED_T(      16, t, v)
-+#define DECLARE_ALIGNED_32(t,v) DECLARE_ALIGNED_T(ALIGN_32, t, v)
-+#define DECLARE_ALIGNED_64(t,v) DECLARE_ALIGNED_T(ALIGN_64, t, v)
-+
- // Some broken preprocessors need a second expansion
- // to be forced to tokenize __VA_ARGS__
- #define E1(x) x
- 
- #define LOCAL_ALIGNED_A(a, t, v, s, o, ...)             \
-     uint8_t la_##v[sizeof(t s o) + (a)];                \
-     t (*v) o = (void *)FFALIGN((uintptr_t)la_##v, a)
- 
-diff --git a/media/ffvpx/libavutil/moz.build b/media/ffvpx/libavutil/moz.build
---- a/media/ffvpx/libavutil/moz.build
-+++ b/media/ffvpx/libavutil/moz.build
-@@ -30,16 +30,17 @@ SOURCES += [
-     'fifo.c',
-     'fixed_dsp.c',
-     'float_dsp.c',
-     'frame.c',
-     'hwcontext.c',
-     'imgutils.c',
-     'log.c',
-     'log2_tab.c',
-+    'mastering_display_metadata.c',
-     'mathematics.c',
-     'mem.c',
-     'opt.c',
-     'parseutils.c',
-     'pixdesc.c',
-     'rational.c',
-     'reverse.c',
-     'samplefmt.c',
-@@ -51,39 +52,42 @@ SOURCES += [
-     'tx_int32.c',
-     'utils.c'
- ]
- 
- if not CONFIG['MOZ_FFVPX_AUDIOONLY']:
-     SOURCES += [
-         'adler32.c',
-         'base64.c',
--        'color_utils.c',
-         'film_grain_params.c',
-         'hdr_dynamic_metadata.c',
-         'integer.c',
-         'intmath.c',
-         'lls.c',
--        'mastering_display_metadata.c',
-         'pixelutils.c',
-         'threadmessage.c',
-         'timecode.c',
-         'video_enc_params.c'
-     ]
-     if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
-         LOCAL_INCLUDES += ['/media/mozva']
-         SOURCES += [
-             'hwcontext_vaapi.c',
-         ]
-         USE_LIBS += ['mozva']
- 
- EXPORTS.ffvpx = [
-     "tx.h"
- ]
- 
-+c11_flags = ["-std=gnu11"]
-+if CONFIG["CC_TYPE"] == "clang-cl":
-+    c11_flags.insert(0, "-Xclang")
-+CFLAGS += c11_flags
-+
- SYMBOLS_FILE =  'avutil.symbols'
- NoVisibilityFlags()
- 
- OS_LIBS += CONFIG['REALTIME_LIBS']
- if CONFIG['OS_TARGET'] != 'WINNT':
-     OS_LIBS += ['m']
- 
- if CONFIG['MOZ_NEEDS_LIBATOMIC']:
-diff --git a/media/ffvpx/libavutil/opt.c b/media/ffvpx/libavutil/opt.c
---- a/media/ffvpx/libavutil/opt.c
-+++ b/media/ffvpx/libavutil/opt.c
-@@ -24,123 +24,209 @@
-  * AVOptions
-  * @author Michael Niedermayer <michaelni@gmx.at>
-  */
- 
- #include "avutil.h"
- #include "avassert.h"
- #include "avstring.h"
- #include "channel_layout.h"
--#include "common.h"
- #include "dict.h"
- #include "eval.h"
- #include "log.h"
-+#include "mem.h"
- #include "parseutils.h"
- #include "pixdesc.h"
- #include "mathematics.h"
- #include "opt.h"
- #include "samplefmt.h"
- #include "bprint.h"
- #include "version.h"
- 
- #include <float.h>
- 
-+#define TYPE_BASE(type) ((type) & ~AV_OPT_TYPE_FLAG_ARRAY)
-+
- const AVOption *av_opt_next(const void *obj, const AVOption *last)
- {
-     const AVClass *class;
-     if (!obj)
-         return NULL;
-     class = *(const AVClass**)obj;
-     if (!last && class && class->option && class->option[0].name)
-         return class->option;
-     if (last && last[1].name)
-         return ++last;
-     return NULL;
- }
- 
-+static const size_t opt_elem_size[] = {
-+    [AV_OPT_TYPE_FLAGS]         = sizeof(unsigned),
-+    [AV_OPT_TYPE_INT]           = sizeof(int),
-+    [AV_OPT_TYPE_INT64]         = sizeof(int64_t),
-+    [AV_OPT_TYPE_UINT64]        = sizeof(uint64_t),
-+    [AV_OPT_TYPE_DOUBLE]        = sizeof(double),
-+    [AV_OPT_TYPE_FLOAT]         = sizeof(float),
-+    [AV_OPT_TYPE_STRING]        = sizeof(char *),
-+    [AV_OPT_TYPE_RATIONAL]      = sizeof(AVRational),
-+    [AV_OPT_TYPE_BINARY]        = sizeof(uint8_t *),
-+    [AV_OPT_TYPE_DICT]          = sizeof(AVDictionary *),
-+    [AV_OPT_TYPE_IMAGE_SIZE]    = sizeof(int[2]),
-+    [AV_OPT_TYPE_VIDEO_RATE]    = sizeof(AVRational),
-+    [AV_OPT_TYPE_PIXEL_FMT]     = sizeof(int),
-+    [AV_OPT_TYPE_SAMPLE_FMT]    = sizeof(int),
-+    [AV_OPT_TYPE_DURATION]      = sizeof(int64_t),
-+    [AV_OPT_TYPE_COLOR]         = sizeof(uint8_t[4]),
-+    [AV_OPT_TYPE_CHLAYOUT]      = sizeof(AVChannelLayout),
-+    [AV_OPT_TYPE_BOOL]          = sizeof(int),
-+};
-+
-+// option is plain old data
-+static int opt_is_pod(enum AVOptionType type)
-+{
-+    switch (type) {
-+    case AV_OPT_TYPE_FLAGS:
-+    case AV_OPT_TYPE_INT:
-+    case AV_OPT_TYPE_INT64:
-+    case AV_OPT_TYPE_DOUBLE:
-+    case AV_OPT_TYPE_FLOAT:
-+    case AV_OPT_TYPE_RATIONAL:
-+    case AV_OPT_TYPE_UINT64:
-+    case AV_OPT_TYPE_IMAGE_SIZE:
-+    case AV_OPT_TYPE_PIXEL_FMT:
-+    case AV_OPT_TYPE_SAMPLE_FMT:
-+    case AV_OPT_TYPE_VIDEO_RATE:
-+    case AV_OPT_TYPE_DURATION:
-+    case AV_OPT_TYPE_COLOR:
-+    case AV_OPT_TYPE_BOOL:
-+        return 1;
-+    }
-+    return 0;
-+}
-+
-+static uint8_t opt_array_sep(const AVOption *o)
-+{
-+    const AVOptionArrayDef *d = o->default_val.arr;
-+    av_assert1(o->type & AV_OPT_TYPE_FLAG_ARRAY);
-+    return (d && d->sep) ? d->sep : ',';
-+}
-+
-+static void *opt_array_pelem(const AVOption *o, void *array, unsigned idx)
-+{
-+    av_assert1(o->type & AV_OPT_TYPE_FLAG_ARRAY);
-+    return (uint8_t *)array + idx * opt_elem_size[TYPE_BASE(o->type)];
-+}
-+
-+static unsigned *opt_array_pcount(const void *parray)
-+{
-+    return (unsigned *)((const void * const *)parray + 1);
-+}
-+
-+static void opt_free_elem(const AVOption *o, void *ptr)
-+{
-+    switch (TYPE_BASE(o->type)) {
-+    case AV_OPT_TYPE_STRING:
-+    case AV_OPT_TYPE_BINARY:
-+        av_freep(ptr);
-+        break;
-+
-+    case AV_OPT_TYPE_DICT:
-+        av_dict_free((AVDictionary **)ptr);
-+        break;
-+
-+    case AV_OPT_TYPE_CHLAYOUT:
-+        av_channel_layout_uninit((AVChannelLayout *)ptr);
-+        break;
-+
-+    default:
-+        break;
-+    }
-+}
-+
-+static void opt_free_array(const AVOption *o, void *parray, unsigned *count)
-+{
-+    for (unsigned i = 0; i < *count; i++)
-+        opt_free_elem(o, opt_array_pelem(o, *(void **)parray, i));
-+
-+    av_freep(parray);
-+    *count = 0;
-+}
-+
- static int read_number(const AVOption *o, const void *dst, double *num, int *den, int64_t *intnum)
- {
-     switch (o->type) {
-     case AV_OPT_TYPE_FLAGS:
-         *intnum = *(unsigned int*)dst;
-         return 0;
-     case AV_OPT_TYPE_PIXEL_FMT:
-         *intnum = *(enum AVPixelFormat *)dst;
-         return 0;
-     case AV_OPT_TYPE_SAMPLE_FMT:
-         *intnum = *(enum AVSampleFormat *)dst;
-         return 0;
-     case AV_OPT_TYPE_BOOL:
-     case AV_OPT_TYPE_INT:
-         *intnum = *(int *)dst;
-         return 0;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    case AV_OPT_TYPE_CHANNEL_LAYOUT:
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     case AV_OPT_TYPE_DURATION:
-     case AV_OPT_TYPE_INT64:
-     case AV_OPT_TYPE_UINT64:
-         *intnum = *(int64_t *)dst;
-         return 0;
-     case AV_OPT_TYPE_FLOAT:
-         *num = *(float *)dst;
-         return 0;
-     case AV_OPT_TYPE_DOUBLE:
-         *num = *(double *)dst;
-         return 0;
-     case AV_OPT_TYPE_RATIONAL:
-         *intnum = ((AVRational *)dst)->num;
-         *den    = ((AVRational *)dst)->den;
-         return 0;
-     case AV_OPT_TYPE_CONST:
--        *num = o->default_val.dbl;
-+        *intnum = o->default_val.i64;
-         return 0;
-     }
-     return AVERROR(EINVAL);
- }
- 
- static int write_number(void *obj, const AVOption *o, void *dst, double num, int den, int64_t intnum)
- {
--    if (o->type != AV_OPT_TYPE_FLAGS &&
-+    const enum AVOptionType type = TYPE_BASE(o->type);
-+
-+    if (type != AV_OPT_TYPE_FLAGS &&
-         (!den || o->max * den < num * intnum || o->min * den > num * intnum)) {
-         num = den ? num * intnum / den : (num && intnum ? INFINITY : NAN);
-         av_log(obj, AV_LOG_ERROR, "Value %f for parameter '%s' out of range [%g - %g]\n",
-                num, o->name, o->min, o->max);
-         return AVERROR(ERANGE);
-     }
--    if (o->type == AV_OPT_TYPE_FLAGS) {
-+    if (type == AV_OPT_TYPE_FLAGS) {
-         double d = num*intnum/den;
-         if (d < -1.5 || d > 0xFFFFFFFF+0.5 || (llrint(d*256) & 255)) {
-             av_log(obj, AV_LOG_ERROR,
-                    "Value %f for parameter '%s' is not a valid set of 32bit integer flags\n",
-                    num*intnum/den, o->name);
-             return AVERROR(ERANGE);
-         }
-     }
- 
--    switch (o->type) {
-+    switch (type) {
-     case AV_OPT_TYPE_PIXEL_FMT:
-         *(enum AVPixelFormat *)dst = llrint(num / den) * intnum;
-         break;
-     case AV_OPT_TYPE_SAMPLE_FMT:
-         *(enum AVSampleFormat *)dst = llrint(num / den) * intnum;
-         break;
-     case AV_OPT_TYPE_BOOL:
-     case AV_OPT_TYPE_FLAGS:
-     case AV_OPT_TYPE_INT:
-         *(int *)dst = llrint(num / den) * intnum;
-         break;
-     case AV_OPT_TYPE_DURATION:
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    case AV_OPT_TYPE_CHANNEL_LAYOUT:
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     case AV_OPT_TYPE_INT64:{
-         double d = num / den;
-         if (intnum == 1 && d == (double)INT64_MAX) {
-             *(int64_t *)dst = INT64_MAX;
-         } else
-             *(int64_t *)dst = llrint(d) * intnum;
-         break;}
-     case AV_OPT_TYPE_UINT64:{
-@@ -218,50 +304,53 @@ static int set_string_binary(void *obj, 
-     *lendst = len;
- 
-     return 0;
- }
- 
- static int set_string(void *obj, const AVOption *o, const char *val, uint8_t **dst)
- {
-     av_freep(dst);
-+    if (!val)
-+        return 0;
-     *dst = av_strdup(val);
-     return *dst ? 0 : AVERROR(ENOMEM);
- }
- 
- #define DEFAULT_NUMVAL(opt) ((opt->type == AV_OPT_TYPE_INT64 || \
-                               opt->type == AV_OPT_TYPE_UINT64 || \
-                               opt->type == AV_OPT_TYPE_CONST || \
-                               opt->type == AV_OPT_TYPE_FLAGS || \
-                               opt->type == AV_OPT_TYPE_INT)     \
-                              ? opt->default_val.i64             \
-                              : opt->default_val.dbl)
- 
- static int set_string_number(void *obj, void *target_obj, const AVOption *o, const char *val, void *dst)
- {
-+    const enum AVOptionType type = TYPE_BASE(o->type);
-     int ret = 0;
- 
--    if (o->type == AV_OPT_TYPE_RATIONAL || o->type == AV_OPT_TYPE_VIDEO_RATE) {
-+    if (type == AV_OPT_TYPE_RATIONAL || type == AV_OPT_TYPE_VIDEO_RATE) {
-         int num, den;
-         char c;
-         if (sscanf(val, "%d%*1[:/]%d%c", &num, &den, &c) == 2) {
-             if ((ret = write_number(obj, o, dst, 1, den, num)) >= 0)
-                 return ret;
-             ret = 0;
-         }
-     }
- 
-     for (;;) {
-         int i = 0;
-         char buf[256];
-         int cmd = 0;
-         double d;
-         int64_t intnum = 1;
- 
--        if (o->type == AV_OPT_TYPE_FLAGS) {
-+        if (type == AV_OPT_TYPE_FLAGS) {
-             if (*val == '+' || *val == '-')
-                 cmd = *(val++);
-             for (; i < sizeof(buf) - 1 && val[i] && val[i] != '+' && val[i] != '-'; i++)
-                 buf[i] = val[i];
-             buf[i] = 0;
-         }
- 
-         {
-@@ -307,18 +396,18 @@ static int set_string_number(void *obj, 
-                 res = av_expr_parse_and_eval(&d, i ? buf : val, const_names,
-                                             const_values, NULL, NULL, NULL, NULL, NULL, 0, obj);
-                 if (res < 0) {
-                     av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\"\n", val);
-                     return res;
-                 }
-             }
-         }
--        if (o->type == AV_OPT_TYPE_FLAGS) {
--            read_number(o, dst, NULL, NULL, &intnum);
-+        if (type == AV_OPT_TYPE_FLAGS) {
-+            intnum = *(unsigned int*)dst;
-             if (cmd == '+')
-                 d = intnum | (int64_t)d;
-             else if (cmd == '-')
-                 d = intnum &~(int64_t)d;
-         }
- 
-         if ((ret = write_number(obj, o, dst, d, 1, 1)) < 0)
-             return ret;
-@@ -439,26 +528,36 @@ static int set_string_fmt(void *obj, con
-                fmt, o->name, desc, min, max);
-         return AVERROR(ERANGE);
-     }
- 
-     *(int *)dst = fmt;
-     return 0;
- }
- 
-+static int get_pix_fmt(const char *name)
-+{
-+    return av_get_pix_fmt(name);
-+}
-+
- static int set_string_pixel_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst)
- {
-     return set_string_fmt(obj, o, val, dst,
--                          AV_PIX_FMT_NB, av_get_pix_fmt, "pixel format");
-+                          AV_PIX_FMT_NB, get_pix_fmt, "pixel format");
-+}
-+
-+static int get_sample_fmt(const char *name)
-+{
-+    return av_get_sample_fmt(name);
- }
- 
- static int set_string_sample_fmt(void *obj, const AVOption *o, const char *val, uint8_t *dst)
- {
-     return set_string_fmt(obj, o, val, dst,
--                          AV_SAMPLE_FMT_NB, av_get_sample_fmt, "sample format");
-+                          AV_SAMPLE_FMT_NB, 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);
-@@ -479,43 +578,30 @@ static int set_string_channel_layout(voi
- {
-     AVChannelLayout *channel_layout = dst;
-     av_channel_layout_uninit(channel_layout);
-     if (!val)
-         return 0;
-     return av_channel_layout_from_string(channel_layout, val);
- }
- 
--int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
-+static int opt_set_elem(void *obj, void *target_obj, const AVOption *o,
-+                        const char *val, void *dst)
- {
--    int ret = 0;
--    void *dst, *target_obj;
--    const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
--    if (!o || !target_obj)
--        return AVERROR_OPTION_NOT_FOUND;
--FF_DISABLE_DEPRECATION_WARNINGS
--    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_DURATION && o->type != AV_OPT_TYPE_COLOR &&
--#if FF_API_OLD_CHANNEL_LAYOUT
--                 o->type != AV_OPT_TYPE_CHANNEL_LAYOUT &&
--#endif
--                 o->type != AV_OPT_TYPE_BOOL))
--        return AVERROR(EINVAL);
--FF_ENABLE_DEPRECATION_WARNINGS
-+    const enum AVOptionType type = TYPE_BASE(o->type);
-+    int ret;
- 
--    if (o->flags & AV_OPT_FLAG_READONLY)
-+    if (!val && (type != AV_OPT_TYPE_STRING &&
-+                 type != AV_OPT_TYPE_PIXEL_FMT && type != AV_OPT_TYPE_SAMPLE_FMT &&
-+                 type != AV_OPT_TYPE_IMAGE_SIZE &&
-+                 type != AV_OPT_TYPE_DURATION && type != AV_OPT_TYPE_COLOR &&
-+                 type != AV_OPT_TYPE_BOOL))
-         return AVERROR(EINVAL);
- 
--    if (o->flags & AV_OPT_FLAG_DEPRECATED)
--        av_log(obj, AV_LOG_WARNING, "The \"%s\" option is deprecated: %s\n", name, o->help);
--
--    dst = ((uint8_t *)target_obj) + o->offset;
--    switch (o->type) {
-+    switch (type) {
-     case AV_OPT_TYPE_BOOL:
-         return set_string_bool(obj, o, val, dst);
-     case AV_OPT_TYPE_STRING:
-         return set_string(obj, o, val, dst);
-     case AV_OPT_TYPE_BINARY:
-         return set_string_binary(obj, o, val, dst);
-     case AV_OPT_TYPE_FLAGS:
-     case AV_OPT_TYPE_INT:
-@@ -552,48 +638,129 @@ FF_ENABLE_DEPRECATION_WARNINGS
-                        usecs / 1000000.0, o->name, o->min / 1000000.0, o->max / 1000000.0);
-                 return AVERROR(ERANGE);
-             }
-             *(int64_t *)dst = usecs;
-             return 0;
-         }
-     case AV_OPT_TYPE_COLOR:
-         return set_string_color(obj, o, val, dst);
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    case AV_OPT_TYPE_CHANNEL_LAYOUT:
--        if (!val || !strcmp(val, "none")) {
--            *(int64_t *)dst = 0;
--        } else {
--            int64_t cl = av_get_channel_layout(val);
--            if (!cl) {
--                av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as channel layout\n", val);
--                ret = AVERROR(EINVAL);
--            }
--            *(int64_t *)dst = cl;
--            return ret;
--        }
--        break;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     case AV_OPT_TYPE_CHLAYOUT:
-         ret = set_string_channel_layout(obj, o, val, dst);
-         if (ret < 0) {
-             av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as channel layout\n", val);
-             ret = AVERROR(EINVAL);
-         }
-         return ret;
-     case AV_OPT_TYPE_DICT:
-         return set_string_dict(obj, o, val, dst);
-     }
- 
-     av_log(obj, AV_LOG_ERROR, "Invalid option type.\n");
-     return AVERROR(EINVAL);
- }
- 
-+static int opt_set_array(void *obj, void *target_obj, const AVOption *o,
-+                         const char *val, void *dst)
-+{
-+    const AVOptionArrayDef *arr = o->default_val.arr;
-+    const size_t      elem_size = opt_elem_size[TYPE_BASE(o->type)];
-+    const uint8_t           sep = opt_array_sep(o);
-+    uint8_t                *str = NULL;
-+
-+    void       *elems = NULL;
-+    unsigned nb_elems = 0;
-+    int ret;
-+
-+    if (val && *val) {
-+        str = av_malloc(strlen(val) + 1);
-+        if (!str)
-+            return AVERROR(ENOMEM);
-+    }
-+
-+    // split and unescape the string
-+    while (val && *val) {
-+        uint8_t *p = str;
-+        void *tmp;
-+
-+        if (arr && arr->size_max && nb_elems >= arr->size_max) {
-+            av_log(obj, AV_LOG_ERROR,
-+                   "Cannot assign more than %u elements to array option %s\n",
-+                   arr->size_max, o->name);
-+            ret = AVERROR(EINVAL);
-+            goto fail;
-+        }
-+
-+        for (; *val; val++, p++) {
-+            if (*val == '\\' && val[1])
-+                val++;
-+            else if (*val == sep) {
-+                val++;
-+                break;
-+            }
-+            *p = *val;
-+        }
-+        *p = 0;
-+
-+        tmp = av_realloc_array(elems, nb_elems + 1, elem_size);
-+        if (!tmp) {
-+            ret = AVERROR(ENOMEM);
-+            goto fail;
-+        }
-+        elems = tmp;
-+
-+        tmp = opt_array_pelem(o, elems, nb_elems);
-+        memset(tmp, 0, elem_size);
-+
-+        ret = opt_set_elem(obj, target_obj, o, str, tmp);
-+        if (ret < 0)
-+            goto fail;
-+        nb_elems++;
-+    }
-+    av_freep(&str);
-+
-+    opt_free_array(o, dst, opt_array_pcount(dst));
-+
-+    if (arr && nb_elems < arr->size_min) {
-+        av_log(obj, AV_LOG_ERROR,
-+               "Cannot assign fewer than %u elements to array option %s\n",
-+               arr->size_min, o->name);
-+        ret = AVERROR(EINVAL);
-+        goto fail;
-+    }
-+
-+    *((void **)dst)        = elems;
-+    *opt_array_pcount(dst) = nb_elems;
-+
-+    return 0;
-+fail:
-+    av_freep(&str);
-+    opt_free_array(o, &elems, &nb_elems);
-+    return ret;
-+}
-+
-+int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
-+{
-+    void *dst, *target_obj;
-+    const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
-+    if (!o || !target_obj)
-+        return AVERROR_OPTION_NOT_FOUND;
-+
-+    if (o->flags & AV_OPT_FLAG_READONLY)
-+        return AVERROR(EINVAL);
-+
-+    if (o->flags & AV_OPT_FLAG_DEPRECATED)
-+        av_log(obj, AV_LOG_WARNING, "The \"%s\" option is deprecated: %s\n", name, o->help);
-+
-+    dst = ((uint8_t *)target_obj) + o->offset;
-+
-+    return ((o->type & AV_OPT_TYPE_FLAG_ARRAY) ?
-+            opt_set_array : opt_set_elem)(obj, target_obj, o, val, dst);
-+}
-+
- #define OPT_EVAL_NUMBER(name, opttype, vartype)                         \
- int av_opt_eval_ ## name(void *obj, const AVOption *o,                  \
-                          const char *val, vartype *name ## _out)        \
- {                                                                       \
-     if (!o || o->type != opttype || o->flags & AV_OPT_FLAG_READONLY)    \
-         return AVERROR(EINVAL);                                         \
-     return set_string_number(obj, obj, o, val, name ## _out);           \
- }
-@@ -609,17 +776,17 @@ static int set_number(void *obj, const c
-                       int search_flags)
- {
-     void *dst, *target_obj;
-     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
- 
-     if (!o || !target_obj)
-         return AVERROR_OPTION_NOT_FOUND;
- 
--    if (o->flags & AV_OPT_FLAG_READONLY)
-+    if ((o->flags & AV_OPT_FLAG_READONLY) || (o->type & AV_OPT_TYPE_FLAG_ARRAY))
-         return AVERROR(EINVAL);
- 
-     dst = ((uint8_t *)target_obj) + o->offset;
-     return write_number(obj, o, dst, num, den, intnum);
- }
- 
- int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
- {
-@@ -692,17 +859,18 @@ int av_opt_set_video_rate(void *obj, con
- {
-     void *target_obj;
-     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
- 
-     if (!o || !target_obj)
-         return AVERROR_OPTION_NOT_FOUND;
-     if (o->type != AV_OPT_TYPE_VIDEO_RATE) {
-         av_log(obj, AV_LOG_ERROR,
--               "The value set by option '%s' is not a video rate.\n", o->name);
-+               "The value set by option '%s' is not a video rate.\n",
-+               o->name);
-         return AVERROR(EINVAL);
-     }
-     if (val.num <= 0 || val.den <= 0)
-         return AVERROR(EINVAL);
-     return set_number(obj, name, val.num, val.den, 1, search_flags);
- }
- 
- static int set_format(void *obj, const char *name, int fmt, int search_flags,
-@@ -739,36 +907,16 @@ int av_opt_set_pixel_fmt(void *obj, cons
-     return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_PIXEL_FMT, "pixel", AV_PIX_FMT_NB);
- }
- 
- int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags)
- {
-     return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_SAMPLE_FMT, "sample", AV_SAMPLE_FMT_NB);
- }
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--int av_opt_set_channel_layout(void *obj, const char *name, int64_t cl, int search_flags)
--{
--    void *target_obj;
--    const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
--
--    if (!o || !target_obj)
--        return AVERROR_OPTION_NOT_FOUND;
--    if (o->type != AV_OPT_TYPE_CHANNEL_LAYOUT) {
--        av_log(obj, AV_LOG_ERROR,
--               "The value set by option '%s' is not a channel layout.\n", o->name);
--        return AVERROR(EINVAL);
--    }
--    *(int64_t *)(((uint8_t *)target_obj) + o->offset) = cl;
--    return 0;
--}
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
- int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val,
-                         int search_flags)
- {
-     void *target_obj;
-     AVDictionary **dst;
-     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
- 
-     if (!o || !target_obj)
-@@ -829,191 +977,270 @@ static void format_duration(char *buf, s
-                  (int)(d % 1000000));
-     e = buf + strlen(buf);
-     while (e > buf && e[-1] == '0')
-         *(--e) = 0;
-     if (e > buf && e[-1] == '.')
-         *(--e) = 0;
- }
- 
-+static int opt_get_elem(const AVOption *o, uint8_t **pbuf, size_t buf_len,
-+                        void *dst, int search_flags)
-+{
-+    int ret;
-+
-+    switch (TYPE_BASE(o->type)) {
-+    case AV_OPT_TYPE_BOOL:
-+        ret = snprintf(*pbuf, buf_len, "%s", get_bool_name(*(int *)dst));
-+        break;
-+    case AV_OPT_TYPE_FLAGS:
-+        ret = snprintf(*pbuf, buf_len, "0x%08X", *(int *)dst);
-+        break;
-+    case AV_OPT_TYPE_INT:
-+        ret = snprintf(*pbuf, buf_len, "%d", *(int *)dst);
-+        break;
-+    case AV_OPT_TYPE_INT64:
-+        ret = snprintf(*pbuf, buf_len, "%"PRId64, *(int64_t *)dst);
-+        break;
-+    case AV_OPT_TYPE_UINT64:
-+        ret = snprintf(*pbuf, buf_len, "%"PRIu64, *(uint64_t *)dst);
-+        break;
-+    case AV_OPT_TYPE_FLOAT:
-+        ret = snprintf(*pbuf, buf_len, "%f", *(float *)dst);
-+        break;
-+    case AV_OPT_TYPE_DOUBLE:
-+        ret = snprintf(*pbuf, buf_len, "%f", *(double *)dst);
-+        break;
-+    case AV_OPT_TYPE_VIDEO_RATE:
-+    case AV_OPT_TYPE_RATIONAL:
-+        ret = snprintf(*pbuf, buf_len, "%d/%d", ((AVRational *)dst)->num, ((AVRational *)dst)->den);
-+        break;
-+    case AV_OPT_TYPE_CONST:
-+        ret = snprintf(*pbuf, buf_len, "%"PRId64, o->default_val.i64);
-+        break;
-+    case AV_OPT_TYPE_STRING:
-+        if (*(uint8_t **)dst) {
-+            *pbuf = av_strdup(*(uint8_t **)dst);
-+        } else if (search_flags & AV_OPT_ALLOW_NULL) {
-+            *pbuf = NULL;
-+            return 0;
-+        } else {
-+            *pbuf = av_strdup("");
-+        }
-+        return *pbuf ? 0 : AVERROR(ENOMEM);
-+    case AV_OPT_TYPE_BINARY: {
-+        const uint8_t *bin;
-+        int len;
-+
-+        if (!*(uint8_t **)dst && (search_flags & AV_OPT_ALLOW_NULL)) {
-+            *pbuf = NULL;
-+            return 0;
-+        }
-+        len = *(int *)(((uint8_t *)dst) + sizeof(uint8_t *));
-+        if ((uint64_t)len * 2 + 1 > INT_MAX)
-+            return AVERROR(EINVAL);
-+        if (!(*pbuf = av_malloc(len * 2 + 1)))
-+            return AVERROR(ENOMEM);
-+        if (!len) {
-+            *pbuf[0] = '\0';
-+            return 0;
-+        }
-+        bin = *(uint8_t **)dst;
-+        for (int i = 0; i < len; i++)
-+            snprintf(*pbuf + i * 2, 3, "%02X", bin[i]);
-+        return 0;
-+    }
-+    case AV_OPT_TYPE_IMAGE_SIZE:
-+        ret = snprintf(*pbuf, buf_len, "%dx%d", ((int *)dst)[0], ((int *)dst)[1]);
-+        break;
-+    case AV_OPT_TYPE_PIXEL_FMT:
-+        ret = snprintf(*pbuf, buf_len, "%s", (char *)av_x_if_null(av_get_pix_fmt_name(*(enum AVPixelFormat *)dst), "none"));
-+        break;
-+    case AV_OPT_TYPE_SAMPLE_FMT:
-+        ret = snprintf(*pbuf, buf_len, "%s", (char *)av_x_if_null(av_get_sample_fmt_name(*(enum AVSampleFormat *)dst), "none"));
-+        break;
-+    case AV_OPT_TYPE_DURATION: {
-+        int64_t i64 = *(int64_t *)dst;
-+        format_duration(*pbuf, buf_len, i64);
-+        ret = strlen(*pbuf); // no overflow possible, checked by an assert
-+        break;
-+    }
-+    case AV_OPT_TYPE_COLOR:
-+        ret = snprintf(*pbuf, buf_len, "0x%02x%02x%02x%02x",
-+                       (int)((uint8_t *)dst)[0], (int)((uint8_t *)dst)[1],
-+                       (int)((uint8_t *)dst)[2], (int)((uint8_t *)dst)[3]);
-+        break;
-+    case AV_OPT_TYPE_CHLAYOUT:
-+        ret = av_channel_layout_describe(dst, *pbuf, buf_len);
-+        break;
-+    case AV_OPT_TYPE_DICT:
-+        if (!*(AVDictionary **)dst && (search_flags & AV_OPT_ALLOW_NULL)) {
-+            *pbuf = NULL;
-+            return 0;
-+        }
-+        return av_dict_get_string(*(AVDictionary **)dst, (char **)pbuf, '=', ':');
-+    default:
-+        return AVERROR(EINVAL);
-+    }
-+
-+    return ret;
-+}
-+
-+static int opt_get_array(const AVOption *o, void *dst, uint8_t **out_val)
-+{
-+    const unsigned count = *opt_array_pcount(dst);
-+    const uint8_t    sep = opt_array_sep(o);
-+
-+    uint8_t *str     = NULL;
-+    size_t   str_len = 0;
-+    int ret;
-+
-+    *out_val = NULL;
-+
-+    for (unsigned i = 0; i < count; i++) {
-+        uint8_t buf[128], *out = buf;
-+        size_t out_len;
-+
-+        ret = opt_get_elem(o, &out, sizeof(buf),
-+                           opt_array_pelem(o, *(void **)dst, i), 0);
-+        if (ret < 0)
-+            goto fail;
-+
-+        out_len = strlen(out);
-+        if (out_len > SIZE_MAX / 2 - !!i ||
-+            !!i + out_len * 2 > SIZE_MAX - str_len - 1) {
-+            ret = AVERROR(ERANGE);
-+            goto fail;
-+        }
-+
-+        //                         terminator     escaping  separator
-+        //                                ↓             ↓     ↓
-+        ret = av_reallocp(&str, str_len + 1 + out_len * 2 + !!i);
-+        if (ret < 0)
-+            goto fail;
-+
-+        // add separator if needed
-+        if (i)
-+            str[str_len++] = sep;
-+
-+        // escape the element
-+        for (unsigned j = 0; j < out_len; j++) {
-+            uint8_t val = out[j];
-+            if (val == sep || val == '\\')
-+                str[str_len++] = '\\';
-+            str[str_len++] = val;
-+        }
-+        str[str_len] = 0;
-+
-+fail:
-+        if (out != buf)
-+            av_freep(&out);
-+        if (ret < 0) {
-+            av_freep(&str);
-+            return ret;
-+        }
-+    }
-+
-+    *out_val = str;
-+
-+    return 0;
-+}
-+
- int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
- {
-     void *dst, *target_obj;
-     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
--    uint8_t *bin, buf[128];
--    int len, i, ret;
--    int64_t i64;
-+    uint8_t *out, buf[128];
-+    int ret;
- 
-     if (!o || !target_obj || (o->offset<=0 && o->type != AV_OPT_TYPE_CONST))
-         return AVERROR_OPTION_NOT_FOUND;
- 
-     if (o->flags & AV_OPT_FLAG_DEPRECATED)
-         av_log(obj, AV_LOG_WARNING, "The \"%s\" option is deprecated: %s\n", name, o->help);
- 
-     dst = (uint8_t *)target_obj + o->offset;
- 
--    buf[0] = 0;
--    switch (o->type) {
--    case AV_OPT_TYPE_BOOL:
--        ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(get_bool_name(*(int *)dst), "invalid"));
--        break;
--    case AV_OPT_TYPE_FLAGS:
--        ret = snprintf(buf, sizeof(buf), "0x%08X", *(int *)dst);
--        break;
--    case AV_OPT_TYPE_INT:
--        ret = snprintf(buf, sizeof(buf), "%d", *(int *)dst);
--        break;
--    case AV_OPT_TYPE_INT64:
--        ret = snprintf(buf, sizeof(buf), "%"PRId64, *(int64_t *)dst);
--        break;
--    case AV_OPT_TYPE_UINT64:
--        ret = snprintf(buf, sizeof(buf), "%"PRIu64, *(uint64_t *)dst);
--        break;
--    case AV_OPT_TYPE_FLOAT:
--        ret = snprintf(buf, sizeof(buf), "%f", *(float *)dst);
--        break;
--    case AV_OPT_TYPE_DOUBLE:
--        ret = snprintf(buf, sizeof(buf), "%f", *(double *)dst);
--        break;
--    case AV_OPT_TYPE_VIDEO_RATE:
--    case AV_OPT_TYPE_RATIONAL:
--        ret = snprintf(buf, sizeof(buf), "%d/%d", ((AVRational *)dst)->num, ((AVRational *)dst)->den);
--        break;
--    case AV_OPT_TYPE_CONST:
--        ret = snprintf(buf, sizeof(buf), "%f", o->default_val.dbl);
--        break;
--    case AV_OPT_TYPE_STRING:
--        if (*(uint8_t **)dst) {
--            *out_val = av_strdup(*(uint8_t **)dst);
--        } else if (search_flags & AV_OPT_ALLOW_NULL) {
--            *out_val = NULL;
--            return 0;
--        } else {
-+    if (o->type & AV_OPT_TYPE_FLAG_ARRAY) {
-+        ret = opt_get_array(o, dst, out_val);
-+        if (ret < 0)
-+            return ret;
-+        if (!*out_val && !(search_flags & AV_OPT_ALLOW_NULL)) {
-             *out_val = av_strdup("");
--        }
--        return *out_val ? 0 : AVERROR(ENOMEM);
--    case AV_OPT_TYPE_BINARY:
--        if (!*(uint8_t **)dst && (search_flags & AV_OPT_ALLOW_NULL)) {
--            *out_val = NULL;
--            return 0;
-+            if (!*out_val)
-+               return AVERROR(ENOMEM);
-         }
--        len = *(int *)(((uint8_t *)dst) + sizeof(uint8_t *));
--        if ((uint64_t)len * 2 + 1 > INT_MAX)
--            return AVERROR(EINVAL);
--        if (!(*out_val = av_malloc(len * 2 + 1)))
--            return AVERROR(ENOMEM);
--        if (!len) {
--            *out_val[0] = '\0';
--            return 0;
--        }
--        bin = *(uint8_t **)dst;
--        for (i = 0; i < len; i++)
--            snprintf(*out_val + i * 2, 3, "%02X", bin[i]);
-         return 0;
--    case AV_OPT_TYPE_IMAGE_SIZE:
--        ret = snprintf(buf, sizeof(buf), "%dx%d", ((int *)dst)[0], ((int *)dst)[1]);
--        break;
--    case AV_OPT_TYPE_PIXEL_FMT:
--        ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(av_get_pix_fmt_name(*(enum AVPixelFormat *)dst), "none"));
--        break;
--    case AV_OPT_TYPE_SAMPLE_FMT:
--        ret = snprintf(buf, sizeof(buf), "%s", (char *)av_x_if_null(av_get_sample_fmt_name(*(enum AVSampleFormat *)dst), "none"));
--        break;
--    case AV_OPT_TYPE_DURATION:
--        i64 = *(int64_t *)dst;
--        format_duration(buf, sizeof(buf), i64);
--        ret = strlen(buf); // no overflow possible, checked by an assert
--        break;
--    case AV_OPT_TYPE_COLOR:
--        ret = snprintf(buf, sizeof(buf), "0x%02x%02x%02x%02x",
--                       (int)((uint8_t *)dst)[0], (int)((uint8_t *)dst)[1],
--                       (int)((uint8_t *)dst)[2], (int)((uint8_t *)dst)[3]);
--        break;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    case AV_OPT_TYPE_CHANNEL_LAYOUT:
-+    }
- 
--        i64 = *(int64_t *)dst;
--        ret = snprintf(buf, sizeof(buf), "0x%"PRIx64, i64);
--        break;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--    case AV_OPT_TYPE_CHLAYOUT:
--        ret = av_channel_layout_describe(dst, buf, sizeof(buf));
--        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);
-+    buf[0] = 0;
-+    out = buf;
-+    ret = opt_get_elem(o, &out, sizeof(buf), dst, search_flags);
-+    if (ret < 0)
-+        return ret;
-+    if (out != buf) {
-+        *out_val = out;
-+        return 0;
-     }
- 
-     if (ret >= sizeof(buf))
-         return AVERROR(EINVAL);
--    *out_val = av_strdup(buf);
-+    *out_val = av_strdup(out);
-     return *out_val ? 0 : AVERROR(ENOMEM);
- }
- 
--static int get_number(void *obj, const char *name, const AVOption **o_out, double *num, int *den, int64_t *intnum,
-+static int get_number(void *obj, const char *name, double *num, int *den, int64_t *intnum,
-                       int search_flags)
- {
-     void *dst, *target_obj;
-     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
-     if (!o || !target_obj)
--        goto error;
-+        return AVERROR_OPTION_NOT_FOUND;
-+    if (o->type & AV_OPT_TYPE_FLAG_ARRAY)
-+        return AVERROR(EINVAL);
- 
-     dst = ((uint8_t *)target_obj) + o->offset;
- 
--    if (o_out) *o_out= o;
--
-     return read_number(o, dst, num, den, intnum);
--
--error:
--    *den    =
--    *intnum = 0;
--    return -1;
- }
- 
- int av_opt_get_int(void *obj, const char *name, int search_flags, int64_t *out_val)
- {
-     int64_t intnum = 1;
-     double num = 1;
-     int ret, den = 1;
- 
--    if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
-+    if ((ret = get_number(obj, name, &num, &den, &intnum, search_flags)) < 0)
-         return ret;
-     if (num == den)
-         *out_val = intnum;
-     else
-         *out_val = num * intnum / den;
-     return 0;
- }
- 
- int av_opt_get_double(void *obj, const char *name, int search_flags, double *out_val)
- {
-     int64_t intnum = 1;
-     double num = 1;
-     int ret, den = 1;
- 
--    if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
-+    if ((ret = get_number(obj, name, &num, &den, &intnum, search_flags)) < 0)
-         return ret;
-     *out_val = num * intnum / den;
-     return 0;
- }
- 
- int av_opt_get_q(void *obj, const char *name, int search_flags, AVRational *out_val)
- {
-     int64_t intnum = 1;
-     double num = 1;
-     int ret, den = 1;
- 
--    if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
-+    if ((ret = get_number(obj, name, &num, &den, &intnum, search_flags)) < 0)
-         return ret;
- 
-     if (num == 1.0 && (int)intnum == intnum)
-         *out_val = (AVRational){intnum, den};
-     else
-         *out_val = av_d2q(num*intnum/den, 1<<24);
-     return 0;
- }
-@@ -1021,33 +1248,33 @@ int av_opt_get_q(void *obj, const char *
- int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out)
- {
-     void *dst, *target_obj;
-     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
-     if (!o || !target_obj)
-         return AVERROR_OPTION_NOT_FOUND;
-     if (o->type != AV_OPT_TYPE_IMAGE_SIZE) {
-         av_log(obj, AV_LOG_ERROR,
--               "The value for option '%s' is not an image size.\n", name);
-+               "The value for option '%s' is not a image size.\n", name);
-         return AVERROR(EINVAL);
-     }
- 
-     dst = ((uint8_t*)target_obj) + o->offset;
-     if (w_out) *w_out = *(int *)dst;
-     if (h_out) *h_out = *((int *)dst+1);
-     return 0;
- }
- 
- int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val)
- {
-     int64_t intnum = 1;
-     double     num = 1;
-     int   ret, den = 1;
- 
--    if ((ret = get_number(obj, name, NULL, &num, &den, &intnum, search_flags)) < 0)
-+    if ((ret = get_number(obj, name, &num, &den, &intnum, search_flags)) < 0)
-         return ret;
- 
-     if (num == 1.0 && (int)intnum == intnum)
-         *out_val = (AVRational) { intnum, den };
-     else
-         *out_val = av_d2q(num * intnum / den, 1 << 24);
-     return 0;
- }
-@@ -1075,37 +1302,16 @@ int av_opt_get_pixel_fmt(void *obj, cons
-     return get_format(obj, name, search_flags, out_fmt, AV_OPT_TYPE_PIXEL_FMT, "pixel");
- }
- 
- int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt)
- {
-     return get_format(obj, name, search_flags, out_fmt, AV_OPT_TYPE_SAMPLE_FMT, "sample");
- }
- 
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *cl)
--{
--    void *dst, *target_obj;
--    const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
--    if (!o || !target_obj)
--        return AVERROR_OPTION_NOT_FOUND;
--    if (o->type != AV_OPT_TYPE_CHANNEL_LAYOUT) {
--        av_log(obj, AV_LOG_ERROR,
--               "The value for option '%s' is not a channel layout.\n", name);
--        return AVERROR(EINVAL);
--    }
--
--    dst = ((uint8_t*)target_obj) + o->offset;
--    *cl = *(int64_t *)dst;
--    return 0;
--}
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--
- int av_opt_get_chlayout(void *obj, const char *name, int search_flags, AVChannelLayout *cl)
- {
-     void *dst, *target_obj;
-     const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj);
-     if (!o || !target_obj)
-         return AVERROR_OPTION_NOT_FOUND;
-     if (o->type != AV_OPT_TYPE_CHLAYOUT) {
-         av_log(obj, AV_LOG_ERROR,
-@@ -1226,16 +1432,130 @@ static char *get_opt_flags_string(void *
-             av_strlcatf(flags, sizeof(flags), "%s", opt->name);
-         }
-     }
-     if (flags[0])
-         return av_strdup(flags);
-     return NULL;
- }
- 
-+static void log_type(void *av_log_obj, const AVOption *o,
-+                     enum AVOptionType parent_type)
-+{
-+    const char *desc[] = {
-+        [AV_OPT_TYPE_FLAGS]         = "<flags>",
-+        [AV_OPT_TYPE_INT]           = "<int>",
-+        [AV_OPT_TYPE_INT64]         = "<int64>",
-+        [AV_OPT_TYPE_UINT64]        = "<uint64>",
-+        [AV_OPT_TYPE_DOUBLE]        = "<double>",
-+        [AV_OPT_TYPE_FLOAT]         = "<float>",
-+        [AV_OPT_TYPE_STRING]        = "<string>",
-+        [AV_OPT_TYPE_RATIONAL]      = "<rational>",
-+        [AV_OPT_TYPE_BINARY]        = "<binary>",
-+        [AV_OPT_TYPE_DICT]          = "<dictionary>",
-+        [AV_OPT_TYPE_IMAGE_SIZE]    = "<image_size>",
-+        [AV_OPT_TYPE_VIDEO_RATE]    = "<video_rate>",
-+        [AV_OPT_TYPE_PIXEL_FMT]     = "<pix_fmt>",
-+        [AV_OPT_TYPE_SAMPLE_FMT]    = "<sample_fmt>",
-+        [AV_OPT_TYPE_DURATION]      = "<duration>",
-+        [AV_OPT_TYPE_COLOR]         = "<color>",
-+        [AV_OPT_TYPE_CHLAYOUT]      = "<channel_layout>",
-+        [AV_OPT_TYPE_BOOL]          = "<boolean>",
-+    };
-+    const enum AVOptionType type = TYPE_BASE(o->type);
-+
-+    if (o->type == AV_OPT_TYPE_CONST && TYPE_BASE(parent_type) == AV_OPT_TYPE_INT)
-+        av_log(av_log_obj, AV_LOG_INFO, "%-12"PRId64" ", o->default_val.i64);
-+    else if (type < FF_ARRAY_ELEMS(desc) && desc[type]) {
-+        if (o->type & AV_OPT_TYPE_FLAG_ARRAY)
-+            av_log(av_log_obj, AV_LOG_INFO, "[%-10s]", desc[type]);
-+        else
-+            av_log(av_log_obj, AV_LOG_INFO, "%-12s ", desc[type]);
-+    }
-+    else
-+        av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "");
-+}
-+
-+static void log_default(void *obj, void *av_log_obj, const AVOption *opt)
-+{
-+    if (opt->type == AV_OPT_TYPE_CONST || opt->type == AV_OPT_TYPE_BINARY)
-+        return;
-+    if ((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_CHLAYOUT   ||
-+         opt->type == AV_OPT_TYPE_VIDEO_RATE) &&
-+        !opt->default_val.str)
-+        return;
-+
-+    if (opt->type & AV_OPT_TYPE_FLAG_ARRAY) {
-+        const AVOptionArrayDef *arr = opt->default_val.arr;
-+        if (arr && arr->def)
-+            av_log(av_log_obj, AV_LOG_INFO, " (default %s)", arr->def);
-+        return;
-+    }
-+
-+    av_log(av_log_obj, AV_LOG_INFO, " (default ");
-+    switch (opt->type) {
-+    case AV_OPT_TYPE_BOOL:
-+        av_log(av_log_obj, AV_LOG_INFO, "%s", get_bool_name(opt->default_val.i64));
-+        break;
-+    case AV_OPT_TYPE_FLAGS: {
-+        char *def_flags = get_opt_flags_string(obj, opt->unit, opt->default_val.i64);
-+        if (def_flags) {
-+            av_log(av_log_obj, AV_LOG_INFO, "%s", def_flags);
-+            av_freep(&def_flags);
-+        } else {
-+            av_log(av_log_obj, AV_LOG_INFO, "%"PRIX64, opt->default_val.i64);
-+        }
-+        break;
-+    }
-+    case AV_OPT_TYPE_DURATION: {
-+        char buf[25];
-+        format_duration(buf, sizeof(buf), opt->default_val.i64);
-+        av_log(av_log_obj, AV_LOG_INFO, "%s", buf);
-+        break;
-+    }
-+    case AV_OPT_TYPE_INT:
-+    case AV_OPT_TYPE_UINT64:
-+    case AV_OPT_TYPE_INT64: {
-+        const char *def_const = get_opt_const_name(obj, opt->unit, opt->default_val.i64);
-+        if (def_const)
-+            av_log(av_log_obj, AV_LOG_INFO, "%s", def_const);
-+        else
-+            log_int_value(av_log_obj, AV_LOG_INFO, opt->default_val.i64);
-+        break;
-+    }
-+    case AV_OPT_TYPE_DOUBLE:
-+    case AV_OPT_TYPE_FLOAT:
-+        log_value(av_log_obj, AV_LOG_INFO, opt->default_val.dbl);
-+        break;
-+    case AV_OPT_TYPE_RATIONAL: {
-+        AVRational q = av_d2q(opt->default_val.dbl, INT_MAX);
-+        av_log(av_log_obj, AV_LOG_INFO, "%d/%d", q.num, q.den); }
-+        break;
-+    case AV_OPT_TYPE_PIXEL_FMT:
-+        av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(av_get_pix_fmt_name(opt->default_val.i64), "none"));
-+        break;
-+    case AV_OPT_TYPE_SAMPLE_FMT:
-+        av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(av_get_sample_fmt_name(opt->default_val.i64), "none"));
-+        break;
-+    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:
-+    case AV_OPT_TYPE_CHLAYOUT:
-+        av_log(av_log_obj, AV_LOG_INFO, "\"%s\"", opt->default_val.str);
-+        break;
-+    }
-+    av_log(av_log_obj, AV_LOG_INFO, ")");
-+}
-+
- static void opt_list(void *obj, void *av_log_obj, const char *unit,
-                      int req_flags, int rej_flags, enum AVOptionType parent_type)
- {
-     const AVOption *opt = NULL;
-     AVOptionRanges *r;
-     int i;
- 
-     while ((opt = av_opt_next(obj, opt))) {
-@@ -1254,86 +1574,18 @@ static void opt_list(void *obj, void *av
-             continue;
-         else if (unit && opt->type == AV_OPT_TYPE_CONST)
-             av_log(av_log_obj, AV_LOG_INFO, "     %-15s ", opt->name);
-         else
-             av_log(av_log_obj, AV_LOG_INFO, "  %s%-17s ",
-                    (opt->flags & AV_OPT_FLAG_FILTERING_PARAM) ? " " : "-",
-                    opt->name);
- 
--        switch (opt->type) {
--            case AV_OPT_TYPE_FLAGS:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<flags>");
--                break;
--            case AV_OPT_TYPE_INT:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<int>");
--                break;
--            case AV_OPT_TYPE_INT64:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<int64>");
--                break;
--            case AV_OPT_TYPE_UINT64:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<uint64>");
--                break;
--            case AV_OPT_TYPE_DOUBLE:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<double>");
--                break;
--            case AV_OPT_TYPE_FLOAT:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<float>");
--                break;
--            case AV_OPT_TYPE_STRING:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<string>");
--                break;
--            case AV_OPT_TYPE_RATIONAL:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<rational>");
--                break;
--            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;
--            case AV_OPT_TYPE_VIDEO_RATE:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<video_rate>");
--                break;
--            case AV_OPT_TYPE_PIXEL_FMT:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<pix_fmt>");
--                break;
--            case AV_OPT_TYPE_SAMPLE_FMT:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<sample_fmt>");
--                break;
--            case AV_OPT_TYPE_DURATION:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<duration>");
--                break;
--            case AV_OPT_TYPE_COLOR:
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<color>");
--                break;
--            case AV_OPT_TYPE_CHLAYOUT:
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--            case AV_OPT_TYPE_CHANNEL_LAYOUT:
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<channel_layout>");
--                break;
--            case AV_OPT_TYPE_BOOL:
--                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;
--        }
-+        log_type(av_log_obj, opt, parent_type);
-+
-         av_log(av_log_obj, AV_LOG_INFO, "%c%c%c%c%c%c%c%c%c%c%c",
-                (opt->flags & AV_OPT_FLAG_ENCODING_PARAM)  ? 'E' : '.',
-                (opt->flags & AV_OPT_FLAG_DECODING_PARAM)  ? 'D' : '.',
-                (opt->flags & AV_OPT_FLAG_FILTERING_PARAM) ? 'F' : '.',
-                (opt->flags & AV_OPT_FLAG_VIDEO_PARAM)     ? 'V' : '.',
-                (opt->flags & AV_OPT_FLAG_AUDIO_PARAM)     ? 'A' : '.',
-                (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM)  ? 'S' : '.',
-                (opt->flags & AV_OPT_FLAG_EXPORT)          ? 'X' : '.',
-@@ -1360,88 +1612,17 @@ FF_ENABLE_DEPRECATION_WARNINGS
-                     log_value(av_log_obj, AV_LOG_INFO, r->range[i]->value_max);
-                     av_log(av_log_obj, AV_LOG_INFO, ")");
-                 }
-                 break;
-             }
-             av_opt_freep_ranges(&r);
-         }
- 
--        if (opt->type != AV_OPT_TYPE_CONST  &&
--            opt->type != AV_OPT_TYPE_BINARY &&
--                !((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_CHLAYOUT   ||
--                   opt->type == AV_OPT_TYPE_VIDEO_RATE) &&
--                  !opt->default_val.str)) {
--            av_log(av_log_obj, AV_LOG_INFO, " (default ");
--            switch (opt->type) {
--            case AV_OPT_TYPE_BOOL:
--                av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(get_bool_name(opt->default_val.i64), "invalid"));
--                break;
--            case AV_OPT_TYPE_FLAGS: {
--                char *def_flags = get_opt_flags_string(obj, opt->unit, opt->default_val.i64);
--                if (def_flags) {
--                    av_log(av_log_obj, AV_LOG_INFO, "%s", def_flags);
--                    av_freep(&def_flags);
--                } else {
--                    av_log(av_log_obj, AV_LOG_INFO, "%"PRIX64, opt->default_val.i64);
--                }
--                break;
--            }
--            case AV_OPT_TYPE_DURATION: {
--                char buf[25];
--                format_duration(buf, sizeof(buf), opt->default_val.i64);
--                av_log(av_log_obj, AV_LOG_INFO, "%s", buf);
--                break;
--            }
--            case AV_OPT_TYPE_INT:
--            case AV_OPT_TYPE_UINT64:
--            case AV_OPT_TYPE_INT64: {
--                const char *def_const = get_opt_const_name(obj, opt->unit, opt->default_val.i64);
--                if (def_const)
--                    av_log(av_log_obj, AV_LOG_INFO, "%s", def_const);
--                else
--                    log_int_value(av_log_obj, AV_LOG_INFO, opt->default_val.i64);
--                break;
--            }
--            case AV_OPT_TYPE_DOUBLE:
--            case AV_OPT_TYPE_FLOAT:
--                log_value(av_log_obj, AV_LOG_INFO, opt->default_val.dbl);
--                break;
--            case AV_OPT_TYPE_RATIONAL: {
--                AVRational q = av_d2q(opt->default_val.dbl, INT_MAX);
--                av_log(av_log_obj, AV_LOG_INFO, "%d/%d", q.num, q.den); }
--                break;
--            case AV_OPT_TYPE_PIXEL_FMT:
--                av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(av_get_pix_fmt_name(opt->default_val.i64), "none"));
--                break;
--            case AV_OPT_TYPE_SAMPLE_FMT:
--                av_log(av_log_obj, AV_LOG_INFO, "%s", (char *)av_x_if_null(av_get_sample_fmt_name(opt->default_val.i64), "none"));
--                break;
--            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:
--            case AV_OPT_TYPE_CHLAYOUT:
--                av_log(av_log_obj, AV_LOG_INFO, "\"%s\"", opt->default_val.str);
--                break;
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--            case AV_OPT_TYPE_CHANNEL_LAYOUT:
--                av_log(av_log_obj, AV_LOG_INFO, "0x%"PRIx64, opt->default_val.i64);
--                break;
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--            }
--            av_log(av_log_obj, AV_LOG_INFO, ")");
--        }
-+        log_default(obj, av_log_obj, opt);
- 
-         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->type);
-     }
- }
- 
- int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags)
-@@ -1468,31 +1649,41 @@ void av_opt_set_defaults2(void *s, int m
-         void *dst = ((uint8_t*)s) + opt->offset;
- 
-         if ((opt->flags & mask) != flags)
-             continue;
- 
-         if (opt->flags & AV_OPT_FLAG_READONLY)
-             continue;
- 
-+        if (opt->type & AV_OPT_TYPE_FLAG_ARRAY) {
-+            const AVOptionArrayDef *arr = opt->default_val.arr;
-+            const char              sep = opt_array_sep(opt);
-+
-+            av_assert0(sep && sep != '\\' &&
-+                       (sep < 'a' || sep > 'z') &&
-+                       (sep < 'A' || sep > 'Z') &&
-+                       (sep < '0' || sep > '9'));
-+
-+            if (arr && arr->def)
-+                opt_set_array(s, s, opt, arr->def, dst);
-+
-+            continue;
-+        }
-+
-         switch (opt->type) {
-             case AV_OPT_TYPE_CONST:
-                 /* Nothing to be done here */
-                 break;
-             case AV_OPT_TYPE_BOOL:
-             case AV_OPT_TYPE_FLAGS:
-             case AV_OPT_TYPE_INT:
-             case AV_OPT_TYPE_INT64:
-             case AV_OPT_TYPE_UINT64:
-             case AV_OPT_TYPE_DURATION:
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--            case AV_OPT_TYPE_CHANNEL_LAYOUT:
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-             case AV_OPT_TYPE_PIXEL_FMT:
-             case AV_OPT_TYPE_SAMPLE_FMT:
-                 write_number(s, opt, dst, 1, 1, opt->default_val.i64);
-                 break;
-             case AV_OPT_TYPE_DOUBLE:
-             case AV_OPT_TYPE_FLOAT: {
-                 double val;
-                 val = opt->default_val.dbl;
-@@ -1665,25 +1856,25 @@ int av_opt_get_key_value(const char **ro
- }
- 
- int av_opt_set_from_string(void *ctx, const char *opts,
-                            const char *const *shorthand,
-                            const char *key_val_sep, const char *pairs_sep)
- {
-     int ret, count = 0;
-     const char *dummy_shorthand = NULL;
--    char *av_uninit(parsed_key), *av_uninit(value);
-     const char *key;
- 
-     if (!opts)
-         return 0;
-     if (!shorthand)
-         shorthand = &dummy_shorthand;
- 
-     while (*opts) {
-+        char *parsed_key, *value;
-         ret = av_opt_get_key_value(&opts, key_val_sep, pairs_sep,
-                                    *shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
-                                    &parsed_key, &value);
-         if (ret < 0) {
-             if (ret == AVERROR(EINVAL))
-                 av_log(ctx, AV_LOG_ERROR, "No option name near '%s'\n", opts);
-             else
-                 av_log(ctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", opts,
-@@ -1715,33 +1906,22 @@ int av_opt_set_from_string(void *ctx, co
-     }
-     return count;
- }
- 
- void av_opt_free(void *obj)
- {
-     const AVOption *o = NULL;
-     while ((o = av_opt_next(obj, o))) {
--        switch (o->type) {
--        case AV_OPT_TYPE_STRING:
--        case AV_OPT_TYPE_BINARY:
--            av_freep((uint8_t *)obj + o->offset);
--            break;
-+        void *pitem = (uint8_t *)obj + o->offset;
- 
--        case AV_OPT_TYPE_DICT:
--            av_dict_free((AVDictionary **)(((uint8_t *)obj) + o->offset));
--            break;
--
--        case AV_OPT_TYPE_CHLAYOUT:
--            av_channel_layout_uninit((AVChannelLayout *)(((uint8_t *)obj) + o->offset));
--            break;
--
--        default:
--            break;
--        }
-+        if (o->type & AV_OPT_TYPE_FLAG_ARRAY)
-+            opt_free_array(o, pitem, opt_array_pcount(pitem));
-+        else
-+            opt_free_elem(o, pitem);
-     }
- }
- 
- int av_opt_set_dict2(void *obj, AVDictionary **options, int search_flags)
- {
-     const AVDictionaryEntry *t = NULL;
-     AVDictionary    *tmp = NULL;
-     int ret;
-@@ -1833,58 +2013,103 @@ const AVClass *av_opt_child_class_iterat
-     if (parent->child_class_iterate)
-         return parent->child_class_iterate(iter);
-     return NULL;
- }
- 
- void *av_opt_ptr(const AVClass *class, void *obj, const char *name)
- {
-     const AVOption *opt= av_opt_find2(&class, name, NULL, 0, AV_OPT_SEARCH_FAKE_OBJ, NULL);
--    if(!opt)
-+
-+    // no direct access to array-type options
-+    if (!opt || (opt->type & AV_OPT_TYPE_FLAG_ARRAY))
-         return NULL;
-     return (uint8_t*)obj + opt->offset;
- }
- 
--static int opt_size(enum AVOptionType type)
-+static int opt_copy_elem(void *logctx, enum AVOptionType type,
-+                         void *dst, const void *src)
- {
--    switch(type) {
--    case AV_OPT_TYPE_BOOL:
--    case AV_OPT_TYPE_INT:
--    case AV_OPT_TYPE_FLAGS:
--        return sizeof(int);
--    case AV_OPT_TYPE_DURATION:
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    case AV_OPT_TYPE_CHANNEL_LAYOUT:
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
--    case AV_OPT_TYPE_INT64:
--    case AV_OPT_TYPE_UINT64:
--        return sizeof(int64_t);
--    case AV_OPT_TYPE_DOUBLE:
--        return sizeof(double);
--    case AV_OPT_TYPE_FLOAT:
--        return sizeof(float);
--    case AV_OPT_TYPE_STRING:
--        return sizeof(uint8_t*);
--    case AV_OPT_TYPE_VIDEO_RATE:
--    case AV_OPT_TYPE_RATIONAL:
--        return sizeof(AVRational);
--    case AV_OPT_TYPE_BINARY:
--        return sizeof(uint8_t*) + sizeof(int);
--    case AV_OPT_TYPE_IMAGE_SIZE:
--        return sizeof(int[2]);
--    case AV_OPT_TYPE_PIXEL_FMT:
--        return sizeof(enum AVPixelFormat);
--    case AV_OPT_TYPE_SAMPLE_FMT:
--        return sizeof(enum AVSampleFormat);
--    case AV_OPT_TYPE_COLOR:
--        return 4;
-+    if (type == AV_OPT_TYPE_STRING) {
-+        const char *src_str = *(const char *const *)src;
-+        char         **dstp =  (char **)dst;
-+        if (*dstp != src_str)
-+            av_freep(dstp);
-+        if (src_str) {
-+            *dstp = av_strdup(src_str);
-+            if (!*dstp)
-+                return AVERROR(ENOMEM);
-+        }
-+    } else if (type == AV_OPT_TYPE_BINARY) {
-+        const uint8_t *const *src8 = (const uint8_t *const *)src;
-+        uint8_t             **dst8 = (uint8_t **)dst;
-+        int len = *(const int *)(src8 + 1);
-+        if (*dst8 != *src8)
-+            av_freep(dst8);
-+        *dst8 = av_memdup(*src8, len);
-+        if (len && !*dst8) {
-+            *(int *)(dst8 + 1) = 0;
-+            return AVERROR(ENOMEM);
-+        }
-+        *(int *)(dst8 + 1) = len;
-+    } else if (type == AV_OPT_TYPE_CONST) {
-+        // do nothing
-+    } else if (type == AV_OPT_TYPE_DICT) {
-+        const AVDictionary *sdict = *(const AVDictionary * const *)src;
-+        AVDictionary     **ddictp = (AVDictionary **)dst;
-+        if (sdict != *ddictp)
-+            av_dict_free(ddictp);
-+        *ddictp = NULL;
-+        return av_dict_copy(ddictp, sdict, 0);
-+    } else if (type == AV_OPT_TYPE_CHLAYOUT) {
-+        if (dst != src)
-+            return av_channel_layout_copy(dst, src);
-+    } else if (opt_is_pod(type)) {
-+        size_t size = opt_elem_size[type];
-+        memcpy(dst, src, size);
-+    } else {
-+        av_log(logctx, AV_LOG_ERROR, "Unhandled option type: %d\n", type);
-+        return AVERROR(EINVAL);
-     }
--    return AVERROR(EINVAL);
-+
-+    return 0;
-+}
-+
-+static int opt_copy_array(void *logctx, const AVOption *o,
-+                          void **pdst, const void * const *psrc)
-+{
-+    unsigned nb_elems = *opt_array_pcount(psrc);
-+    void         *dst = NULL;
-+    int ret;
-+
-+    if (*pdst == *psrc) {
-+        *pdst                   = NULL;
-+        *opt_array_pcount(pdst) = 0;
-+    }
-+
-+    opt_free_array(o, pdst, opt_array_pcount(pdst));
-+
-+    dst = av_calloc(nb_elems, opt_elem_size[TYPE_BASE(o->type)]);
-+    if (!dst)
-+        return AVERROR(ENOMEM);
-+
-+    for (unsigned i = 0; i < nb_elems; i++) {
-+        ret = opt_copy_elem(logctx, TYPE_BASE(o->type),
-+                            opt_array_pelem(o, dst, i),
-+                            opt_array_pelem(o, *(void**)psrc, i));
-+        if (ret < 0) {
-+            opt_free_array(o, &dst, &nb_elems);
-+            return ret;
-+        }
-+    }
-+
-+    *pdst                   = dst;
-+    *opt_array_pcount(pdst) = nb_elems;
-+
-+    return 0;
- }
- 
- int av_opt_copy(void *dst, const void *src)
- {
-     const AVOption *o = NULL;
-     const AVClass *c;
-     int ret = 0;
- 
-@@ -1893,57 +2118,22 @@ int av_opt_copy(void *dst, const void *s
- 
-     c = *(AVClass **)src;
-     if (!c || c != *(AVClass **)dst)
-         return AVERROR(EINVAL);
- 
-     while ((o = av_opt_next(src, o))) {
-         void *field_dst = (uint8_t *)dst + o->offset;
-         void *field_src = (uint8_t *)src + o->offset;
--        uint8_t **field_dst8 = (uint8_t **)field_dst;
--        uint8_t **field_src8 = (uint8_t **)field_src;
- 
--        if (o->type == AV_OPT_TYPE_STRING) {
--            if (*field_dst8 != *field_src8)
--                av_freep(field_dst8);
--            *field_dst8 = av_strdup(*field_src8);
--            if (*field_src8 && !*field_dst8)
--                ret = AVERROR(ENOMEM);
--        } else if (o->type == AV_OPT_TYPE_BINARY) {
--            int len = *(int *)(field_src8 + 1);
--            if (*field_dst8 != *field_src8)
--                av_freep(field_dst8);
--            *field_dst8 = av_memdup(*field_src8, len);
--            if (len && !*field_dst8) {
--                ret = AVERROR(ENOMEM);
--                len = 0;
--            }
--            *(int *)(field_dst8 + 1) = len;
--        } else if (o->type == AV_OPT_TYPE_CONST) {
--            // do nothing
--        } else if (o->type == AV_OPT_TYPE_DICT) {
--            AVDictionary **sdict = (AVDictionary **) field_src;
--            AVDictionary **ddict = (AVDictionary **) field_dst;
--            int ret2;
--            if (*sdict != *ddict)
--                av_dict_free(ddict);
--            *ddict = NULL;
--            ret2 = av_dict_copy(ddict, *sdict, 0);
--            if (ret2 < 0)
--                ret = ret2;
--        } else if (o->type == AV_OPT_TYPE_CHLAYOUT) {
--            if (field_dst != field_src)
--                ret = av_channel_layout_copy(field_dst, field_src);
--        } else {
--            int size = opt_size(o->type);
--            if (size < 0)
--                ret = size;
--            else
--                memcpy(field_dst, field_src, size);
--        }
-+        int err = (o->type & AV_OPT_TYPE_FLAG_ARRAY)                 ?
-+                  opt_copy_array(dst, o,       field_dst, field_src) :
-+                  opt_copy_elem (dst, o->type, field_dst, field_src);
-+        if (err < 0)
-+            ret = err;
-     }
-     return ret;
- }
- 
- int av_opt_query_ranges(AVOptionRanges **ranges_arg, void *obj, const char *key, int flags)
- {
-     int ret;
-     const AVClass *c = *(AVClass**)obj;
-@@ -1990,21 +2180,16 @@ int av_opt_query_ranges_default(AVOption
-     case AV_OPT_TYPE_INT64:
-     case AV_OPT_TYPE_UINT64:
-     case AV_OPT_TYPE_PIXEL_FMT:
-     case AV_OPT_TYPE_SAMPLE_FMT:
-     case AV_OPT_TYPE_FLOAT:
-     case AV_OPT_TYPE_DOUBLE:
-     case AV_OPT_TYPE_DURATION:
-     case AV_OPT_TYPE_COLOR:
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    case AV_OPT_TYPE_CHANNEL_LAYOUT:
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-         break;
-     case AV_OPT_TYPE_STRING:
-         range->component_min = 0;
-         range->component_max = 0x10FFFF; // max unicode value
-         range->value_min = -1;
-         range->value_max = INT_MAX;
-         break;
-     case AV_OPT_TYPE_RATIONAL:
-@@ -2054,41 +2239,53 @@ void av_opt_freep_ranges(AVOptionRanges 
-     }
-     av_freep(&ranges->range);
-     av_freep(rangesp);
- }
- 
- int av_opt_is_set_to_default(void *obj, const AVOption *o)
- {
-     int64_t i64;
--    double d, d2;
--    float f;
-+    double d;
-     AVRational q;
-     int ret, w, h;
-     char *str;
-     void *dst;
- 
-     if (!o || !obj)
-         return AVERROR(EINVAL);
- 
-     dst = ((uint8_t*)obj) + o->offset;
- 
-+    if (o->type & AV_OPT_TYPE_FLAG_ARRAY) {
-+        const char *def = o->default_val.arr ? o->default_val.arr->def : NULL;
-+        uint8_t *val;
-+
-+        ret = opt_get_array(o, dst, &val);
-+        if (ret < 0)
-+            return ret;
-+
-+        if (!!val != !!def)
-+            ret = 0;
-+        else if (val)
-+            ret = !strcmp(val, def);
-+
-+        av_freep(&val);
-+
-+        return ret;
-+    }
-+
-     switch (o->type) {
-     case AV_OPT_TYPE_CONST:
-         return 1;
-     case AV_OPT_TYPE_BOOL:
-     case AV_OPT_TYPE_FLAGS:
-     case AV_OPT_TYPE_PIXEL_FMT:
-     case AV_OPT_TYPE_SAMPLE_FMT:
-     case AV_OPT_TYPE_INT:
--#if FF_API_OLD_CHANNEL_LAYOUT
--FF_DISABLE_DEPRECATION_WARNINGS
--    case AV_OPT_TYPE_CHANNEL_LAYOUT:
--FF_ENABLE_DEPRECATION_WARNINGS
--#endif
-     case AV_OPT_TYPE_DURATION:
-     case AV_OPT_TYPE_INT64:
-     case AV_OPT_TYPE_UINT64:
-         read_number(o, dst, NULL, NULL, &i64);
-         return o->default_val.i64 == i64;
-     case AV_OPT_TYPE_CHLAYOUT: {
-         AVChannelLayout ch_layout = { 0 };
-         if (o->default_val.str) {
-@@ -2100,23 +2297,21 @@ FF_ENABLE_DEPRECATION_WARNINGS
-     case AV_OPT_TYPE_STRING:
-         str = *(char **)dst;
-         if (str == o->default_val.str) //2 NULLs
-             return 1;
-         if (!str || !o->default_val.str) //1 NULL
-             return 0;
-         return !strcmp(str, o->default_val.str);
-     case AV_OPT_TYPE_DOUBLE:
--        read_number(o, dst, &d, NULL, NULL);
-+        d = *(double *)dst;
-         return o->default_val.dbl == d;
-     case AV_OPT_TYPE_FLOAT:
--        read_number(o, dst, &d, NULL, NULL);
--        f = o->default_val.dbl;
--        d2 = f;
--        return d2 == d;
-+        d = *(float *)dst;
-+        return (float)o->default_val.dbl == d;
-     case AV_OPT_TYPE_RATIONAL:
-         q = av_d2q(o->default_val.dbl, INT_MAX);
-         return !av_cmp_q(*(AVRational*)dst, q);
-     case AV_OPT_TYPE_BINARY: {
-         struct {
-             uint8_t *data;
-             int size;
-         } tmp = {0};
-diff --git a/media/ffvpx/libavutil/opt.h b/media/ffvpx/libavutil/opt.h
---- a/media/ffvpx/libavutil/opt.h
-+++ b/media/ffvpx/libavutil/opt.h
-@@ -38,16 +38,26 @@
- /**
-  * @defgroup avoptions AVOptions
-  * @ingroup lavu_data
-  * @{
-  * AVOptions provide a generic system to declare options on arbitrary structs
-  * ("objects"). An option can have a help text, a type and a range of possible
-  * values. Options may then be enumerated, read and written to.
-  *
-+ * There are two modes of access to members of AVOption and its child structs.
-+ * One is called 'native access', and refers to access from the code that
-+ * declares the AVOption in question.  The other is 'foreign access', and refers
-+ * to access from other code.
-+ *
-+ * Certain struct members in this header are documented as 'native access only'
-+ * or similar - it means that only the code that declared the AVOption in
-+ * question is allowed to access the field. This allows us to extend the
-+ * semantics of those fields without breaking API compatibility.
-+ *
-  * @section avoptions_implement Implementing AVOptions
-  * This section describes how to add AVOptions capabilities to a struct.
-  *
-  * All AVOptions-related information is stored in an AVClass. Therefore
-  * the first member of the struct should be a pointer to an AVClass describing it.
-  * The option field of the AVClass must be set to a NULL-terminated static array
-  * of AVOptions. Each AVOption must have a non-empty name, a type, a default
-  * value and for number-type AVOptions also a range of allowed values. It must
-@@ -216,93 +226,172 @@
-  * AVDictionary and call av_opt_set_dict() on it. A specific case of this
-  * are the format/codec open functions in lavf/lavc which take a dictionary
-  * filled with option as a parameter. This makes it possible to set some options
-  * that cannot be set otherwise, since e.g. the input file format is not known
-  * before the file is actually opened.
-  */
- 
- enum AVOptionType{
--    AV_OPT_TYPE_FLAGS,
-+    AV_OPT_TYPE_FLAGS = 1,
-     AV_OPT_TYPE_INT,
-     AV_OPT_TYPE_INT64,
-     AV_OPT_TYPE_DOUBLE,
-     AV_OPT_TYPE_FLOAT,
-     AV_OPT_TYPE_STRING,
-     AV_OPT_TYPE_RATIONAL,
-     AV_OPT_TYPE_BINARY,  ///< offset must point to a pointer immediately followed by an int for the length
-     AV_OPT_TYPE_DICT,
-     AV_OPT_TYPE_UINT64,
-     AV_OPT_TYPE_CONST,
-     AV_OPT_TYPE_IMAGE_SIZE, ///< offset must point to two consecutive integers
-     AV_OPT_TYPE_PIXEL_FMT,
-     AV_OPT_TYPE_SAMPLE_FMT,
-     AV_OPT_TYPE_VIDEO_RATE, ///< offset must point to AVRational
-     AV_OPT_TYPE_DURATION,
-     AV_OPT_TYPE_COLOR,
--#if FF_API_OLD_CHANNEL_LAYOUT
--    AV_OPT_TYPE_CHANNEL_LAYOUT,
--#endif
-     AV_OPT_TYPE_BOOL,
-     AV_OPT_TYPE_CHLAYOUT,
-+
-+    /**
-+     * May be combined with another regular option type to declare an array
-+     * option.
-+     *
-+     * For array options, @ref AVOption.offset should refer to a pointer
-+     * corresponding to the option type. The pointer should be immediately
-+     * followed by an unsigned int that will store the number of elements in the
-+     * array.
-+     */
-+    AV_OPT_TYPE_FLAG_ARRAY = (1 << 16),
- };
- 
- /**
-+ * A generic parameter which can be set by the user for muxing or encoding.
-+ */
-+#define AV_OPT_FLAG_ENCODING_PARAM  (1 << 0)
-+/**
-+ * A generic parameter which can be set by the user for demuxing or decoding.
-+ */
-+#define AV_OPT_FLAG_DECODING_PARAM  (1 << 1)
-+#define AV_OPT_FLAG_AUDIO_PARAM     (1 << 3)
-+#define AV_OPT_FLAG_VIDEO_PARAM     (1 << 4)
-+#define AV_OPT_FLAG_SUBTITLE_PARAM  (1 << 5)
-+/**
-+ * The option is intended for exporting values to the caller.
-+ */
-+#define AV_OPT_FLAG_EXPORT          (1 << 6)
-+/**
-+ * The option may not be set through the AVOptions API, only read.
-+ * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set.
-+ */
-+#define AV_OPT_FLAG_READONLY        (1 << 7)
-+/**
-+ * A generic parameter which can be set by the user for bit stream filtering.
-+ */
-+#define AV_OPT_FLAG_BSF_PARAM       (1 << 8)
-+
-+/**
-+ * A generic parameter which can be set by the user at runtime.
-+ */
-+#define AV_OPT_FLAG_RUNTIME_PARAM   (1 << 15)
-+/**
-+ * A generic parameter which can be set by the user for filtering.
-+ */
-+#define AV_OPT_FLAG_FILTERING_PARAM (1 << 16)
-+/**
-+ * Set if option is deprecated, users should refer to AVOption.help text for
-+ * more information.
-+ */
-+#define AV_OPT_FLAG_DEPRECATED      (1 << 17)
-+/**
-+ * Set if option constants can also reside in child objects.
-+ */
-+#define AV_OPT_FLAG_CHILD_CONSTS    (1 << 18)
-+
-+/**
-+ * May be set as default_val for AV_OPT_TYPE_FLAG_ARRAY options.
-+ */
-+typedef struct AVOptionArrayDef {
-+    /**
-+     * Native access only.
-+     *
-+     * Default value of the option, as would be serialized by av_opt_get() (i.e.
-+     * using the value of sep as the separator).
-+     */
-+    const char         *def;
-+
-+    /**
-+     * Minimum number of elements in the array. When this field is non-zero, def
-+     * must be non-NULL and contain at least this number of elements.
-+     */
-+    unsigned            size_min;
-+    /**
-+     * Maximum number of elements in the array, 0 when unlimited.
-+     */
-+    unsigned            size_max;
-+
-+    /**
-+     * Separator between array elements in string representations of this
-+     * option, used by av_opt_set() and av_opt_get(). It must be a printable
-+     * ASCII character, excluding alphanumeric and the backslash. A comma is
-+     * used when sep=0.
-+     *
-+     * The separator and the backslash must be backslash-escaped in order to
-+     * appear in string representations of the option value.
-+     */
-+    char                sep;
-+} AVOptionArrayDef;
-+
-+/**
-  * AVOption
-  */
- typedef struct AVOption {
-     const char *name;
- 
-     /**
-      * short English help text
-      * @todo What about other languages?
-      */
-     const char *help;
- 
-     /**
-+     * Native access only.
-+     *
-      * The offset relative to the context structure where the option
-      * value is stored. It should be 0 for named constants.
-      */
-     int offset;
-     enum AVOptionType type;
- 
-     /**
-+     * Native access only, except when documented otherwise.
-      * the default value for scalar options
-      */
-     union {
-         int64_t i64;
-         double dbl;
-         const char *str;
-         /* TODO those are unused now */
-         AVRational q;
-+
-+        /**
-+         * Used for AV_OPT_TYPE_FLAG_ARRAY options. May be NULL.
-+         *
-+         * Foreign access to some members allowed, as noted in AVOptionArrayDef
-+         * documentation.
-+         */
-+        const AVOptionArrayDef *arr;
-     } default_val;
-     double min;                 ///< minimum valid value for the option
-     double max;                 ///< maximum valid value for the option
- 
-+    /**
-+     * A combination of AV_OPT_FLAG_*.
-+     */
-     int flags;
--#define AV_OPT_FLAG_ENCODING_PARAM  1   ///< a generic parameter which can be set by the user for muxing or encoding
--#define AV_OPT_FLAG_DECODING_PARAM  2   ///< a generic parameter which can be set by the user for demuxing or decoding
--#define AV_OPT_FLAG_AUDIO_PARAM     8
--#define AV_OPT_FLAG_VIDEO_PARAM     16
--#define AV_OPT_FLAG_SUBTITLE_PARAM  32
--/**
-- * The option is intended for exporting values to the caller.
-- */
--#define AV_OPT_FLAG_EXPORT          64
--/**
-- * The option may not be set through the AVOptions API, only read.
-- * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set.
-- */
--#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
--#define AV_OPT_FLAG_CHILD_CONSTS    (1<<18) ///< set if option constants can also reside in child objects
--//FIXME think about enc-audio, ... style flags
- 
-     /**
-      * The logical unit to which the option belongs. Non-constant
-      * options and corresponding named constants share the same
-      * unit. May be NULL.
-      */
-     const char *unit;
- } AVOption;
-@@ -371,25 +460,19 @@ typedef struct AVOptionRanges {
-     int nb_ranges;
-     /**
-      * Number of componentes.
-      */
-     int nb_components;
- } AVOptionRanges;
- 
- /**
-- * Show the obj options.
-- *
-- * @param req_flags requested flags for the options to show. Show only the
-- * options for which it is opt->flags & req_flags.
-- * @param rej_flags rejected flags for the options to show. Show only the
-- * options for which it is !(opt->flags & req_flags).
-- * @param av_log_obj log context to use for showing the options
-+ * @defgroup opt_mng AVOption (un)initialization and inspection.
-+ * @{
-  */
--int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags);
- 
- /**
-  * Set the values of all AVOption fields to their default values.
-  *
-  * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass)
-  */
- void av_opt_set_defaults(void *s);
- 
-@@ -400,170 +483,46 @@ void av_opt_set_defaults(void *s);
-  *
-  * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass)
-  * @param mask combination of AV_OPT_FLAG_*
-  * @param flags combination of AV_OPT_FLAG_*
-  */
- void av_opt_set_defaults2(void *s, int mask, int flags);
- 
- /**
-- * Parse the key/value pairs list in opts. For each key/value pair
-- * found, stores the value in the field in ctx that is named like the
-- * key. ctx must be an AVClass context, storing is done using
-- * AVOptions.
-- *
-- * @param opts options string to parse, may be NULL
-- * @param key_val_sep a 0-terminated list of characters used to
-- * separate key from value
-- * @param pairs_sep a 0-terminated list of characters used to separate
-- * two pairs from each other
-- * @return the number of successfully set key/value pairs, or a negative
-- * value corresponding to an AVERROR code in case of error:
-- * AVERROR(EINVAL) if opts cannot be parsed,
-- * the error code issued by av_opt_set() if a key/value pair
-- * cannot be set
-- */
--int av_set_options_string(void *ctx, const char *opts,
--                          const char *key_val_sep, const char *pairs_sep);
--
--/**
-- * Parse the key-value pairs list in opts. For each key=value pair found,
-- * set the value of the corresponding option in ctx.
-- *
-- * @param ctx          the AVClass object to set options on
-- * @param opts         the options string, key-value pairs separated by a
-- *                     delimiter
-- * @param shorthand    a NULL-terminated array of options names for shorthand
-- *                     notation: if the first field in opts has no key part,
-- *                     the key is taken from the first element of shorthand;
-- *                     then again for the second, etc., until either opts is
-- *                     finished, shorthand is finished or a named option is
-- *                     found; after that, all options must be named
-- * @param key_val_sep  a 0-terminated list of characters used to separate
-- *                     key from value, for example '='
-- * @param pairs_sep    a 0-terminated list of characters used to separate
-- *                     two pairs from each other, for example ':' or ','
-- * @return  the number of successfully set key=value pairs, or a negative
-- *          value corresponding to an AVERROR code in case of error:
-- *          AVERROR(EINVAL) if opts cannot be parsed,
-- *          the error code issued by av_set_string3() if a key/value pair
-- *          cannot be set
-- *
-- * Options names must use only the following characters: a-z A-Z 0-9 - . / _
-- * Separators must use characters distinct from option names and from each
-- * other.
-- */
--int av_opt_set_from_string(void *ctx, const char *opts,
--                           const char *const *shorthand,
--                           const char *key_val_sep, const char *pairs_sep);
--/**
-  * Free all allocated objects in obj.
-  */
- void av_opt_free(void *obj);
- 
- /**
-- * Check whether a particular flag is set in a flags field.
-- *
-- * @param field_name the name of the flag field option
-- * @param flag_name the name of the flag to check
-- * @return non-zero if the flag is set, zero if the flag isn't set,
-- *         isn't of the right type, or the flags field doesn't exist.
-- */
--int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name);
--
--/**
-- * Set all the options from a given dictionary on an object.
-- *
-- * @param obj a struct whose first element is a pointer to AVClass
-- * @param options options to process. This dictionary will be freed and replaced
-- *                by a new one containing all options not found in obj.
-- *                Of course this new dictionary needs to be freed by caller
-- *                with av_dict_free().
-- *
-- * @return 0 on success, a negative AVERROR if some option was found in obj,
-- *         but could not be set.
-+ * Iterate over all AVOptions belonging to obj.
-  *
-- * @see av_dict_copy()
-+ * @param obj an AVOptions-enabled struct or a double pointer to an
-+ *            AVClass describing it.
-+ * @param prev result of the previous call to av_opt_next() on this object
-+ *             or NULL
-+ * @return next AVOption or NULL
-  */
--int av_opt_set_dict(void *obj, struct AVDictionary **options);
--
--
--/**
-- * Set all the options from a given dictionary on an object.
-- *
-- * @param obj a struct whose first element is a pointer to AVClass
-- * @param options options to process. This dictionary will be freed and replaced
-- *                by a new one containing all options not found in obj.
-- *                Of course this new dictionary needs to be freed by caller
-- *                with av_dict_free().
-- * @param search_flags A combination of AV_OPT_SEARCH_*.
-- *
-- * @return 0 on success, a negative AVERROR if some option was found in obj,
-- *         but could not be set.
-- *
-- * @see av_dict_copy()
-- */
--int av_opt_set_dict2(void *obj, struct AVDictionary **options, int search_flags);
-+const AVOption *av_opt_next(const void *obj, const AVOption *prev);
- 
- /**
-- * Extract a key-value pair from the beginning of a string.
-- *
-- * @param ropts        pointer to the options string, will be updated to
-- *                     point to the rest of the string (one of the pairs_sep
-- *                     or the final NUL)
-- * @param key_val_sep  a 0-terminated list of characters used to separate
-- *                     key from value, for example '='
-- * @param pairs_sep    a 0-terminated list of characters used to separate
-- *                     two pairs from each other, for example ':' or ','
-- * @param flags        flags; see the AV_OPT_FLAG_* values below
-- * @param rkey         parsed key; must be freed using av_free()
-- * @param rval         parsed value; must be freed using av_free()
-+ * Iterate over AVOptions-enabled children of obj.
-  *
-- * @return  >=0 for success, or a negative value corresponding to an
-- *          AVERROR code in case of error; in particular:
-- *          AVERROR(EINVAL) if no key is present
-- *
-+ * @param prev result of a previous call to this function or NULL
-+ * @return next AVOptions-enabled child or NULL
-  */
--int av_opt_get_key_value(const char **ropts,
--                         const char *key_val_sep, const char *pairs_sep,
--                         unsigned flags,
--                         char **rkey, char **rval);
--
--enum {
--
--    /**
--     * Accept to parse a value without a key; the key will then be returned
--     * as NULL.
--     */
--    AV_OPT_FLAG_IMPLICIT_KEY = 1,
--};
-+void *av_opt_child_next(void *obj, void *prev);
- 
- /**
-- * @defgroup opt_eval_funcs Evaluating option strings
-- * @{
-- * This group of functions can be used to evaluate option strings
-- * and get numbers out of them. They do the same thing as av_opt_set(),
-- * except the result is written into the caller-supplied pointer.
-- *
-- * @param obj a struct whose first element is a pointer to AVClass.
-- * @param o an option for which the string is to be evaluated.
-- * @param val string to be evaluated.
-- * @param *_out value of the string will be written here.
-+ * Iterate over potential AVOptions-enabled children of parent.
-  *
-- * @return 0 on success, a negative number on failure.
-+ * @param iter a pointer where iteration state is stored.
-+ * @return AVClass corresponding to next potential child or NULL
-  */
--int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int        *flags_out);
--int av_opt_eval_int   (void *obj, const AVOption *o, const char *val, int        *int_out);
--int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t    *int64_out);
--int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float      *float_out);
--int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double     *double_out);
--int av_opt_eval_q     (void *obj, const AVOption *o, const char *val, AVRational *q_out);
--/**
-- * @}
-- */
-+const AVClass *av_opt_child_class_iterate(const AVClass *parent, void **iter);
- 
- #define AV_OPT_SEARCH_CHILDREN   (1 << 0) /**< Search in possible children of the
-                                                given object first. */
- /**
-  *  The obj passed to av_opt_find() is fake -- only a double pointer to AVClass
-  *  instead of a required pointer to a struct containing AVClass. This is
-  *  useful for searching for options without needing to allocate the corresponding
-  *  object.
-@@ -628,41 +587,171 @@ const AVOption *av_opt_find(void *obj, c
-  *
-  * @return A pointer to the option found, or NULL if no option
-  *         was found.
-  */
- const AVOption *av_opt_find2(void *obj, const char *name, const char *unit,
-                              int opt_flags, int search_flags, void **target_obj);
- 
- /**
-- * Iterate over all AVOptions belonging to obj.
-+ * Show the obj options.
-+ *
-+ * @param req_flags requested flags for the options to show. Show only the
-+ * options for which it is opt->flags & req_flags.
-+ * @param rej_flags rejected flags for the options to show. Show only the
-+ * options for which it is !(opt->flags & req_flags).
-+ * @param av_log_obj log context to use for showing the options
-+ */
-+int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags);
-+
-+/**
-+ * Extract a key-value pair from the beginning of a string.
-+ *
-+ * @param ropts        pointer to the options string, will be updated to
-+ *                     point to the rest of the string (one of the pairs_sep
-+ *                     or the final NUL)
-+ * @param key_val_sep  a 0-terminated list of characters used to separate
-+ *                     key from value, for example '='
-+ * @param pairs_sep    a 0-terminated list of characters used to separate
-+ *                     two pairs from each other, for example ':' or ','
-+ * @param flags        flags; see the AV_OPT_FLAG_* values below
-+ * @param rkey         parsed key; must be freed using av_free()
-+ * @param rval         parsed value; must be freed using av_free()
-+ *
-+ * @return  >=0 for success, or a negative value corresponding to an
-+ *          AVERROR code in case of error; in particular:
-+ *          AVERROR(EINVAL) if no key is present
-  *
-- * @param obj an AVOptions-enabled struct or a double pointer to an
-- *            AVClass describing it.
-- * @param prev result of the previous call to av_opt_next() on this object
-- *             or NULL
-- * @return next AVOption or NULL
-+ */
-+int av_opt_get_key_value(const char **ropts,
-+                         const char *key_val_sep, const char *pairs_sep,
-+                         unsigned flags,
-+                         char **rkey, char **rval);
-+
-+enum {
-+
-+    /**
-+     * Accept to parse a value without a key; the key will then be returned
-+     * as NULL.
-+     */
-+    AV_OPT_FLAG_IMPLICIT_KEY = 1,
-+};
-+
-+/**
-+ * @}
-  */
--const AVOption *av_opt_next(const void *obj, const AVOption *prev);
-+
-+/**
-+ * @defgroup opt_write Setting and modifying option values
-+ * @{
-+ */
-+
-+/**
-+ * Parse the key/value pairs list in opts. For each key/value pair
-+ * found, stores the value in the field in ctx that is named like the
-+ * key. ctx must be an AVClass context, storing is done using
-+ * AVOptions.
-+ *
-+ * @param opts options string to parse, may be NULL
-+ * @param key_val_sep a 0-terminated list of characters used to
-+ * separate key from value
-+ * @param pairs_sep a 0-terminated list of characters used to separate
-+ * two pairs from each other
-+ * @return the number of successfully set key/value pairs, or a negative
-+ * value corresponding to an AVERROR code in case of error:
-+ * AVERROR(EINVAL) if opts cannot be parsed,
-+ * the error code issued by av_opt_set() if a key/value pair
-+ * cannot be set
-+ */
-+int av_set_options_string(void *ctx, const char *opts,
-+                          const char *key_val_sep, const char *pairs_sep);
- 
- /**
-- * Iterate over AVOptions-enabled children of obj.
-+ * Parse the key-value pairs list in opts. For each key=value pair found,
-+ * set the value of the corresponding option in ctx.
-  *
-- * @param prev result of a previous call to this function or NULL
-- * @return next AVOptions-enabled child or NULL
-+ * @param ctx          the AVClass object to set options on
-+ * @param opts         the options string, key-value pairs separated by a
-+ *                     delimiter
-+ * @param shorthand    a NULL-terminated array of options names for shorthand
-+ *                     notation: if the first field in opts has no key part,
-+ *                     the key is taken from the first element of shorthand;
-+ *                     then again for the second, etc., until either opts is
-+ *                     finished, shorthand is finished or a named option is
-+ *                     found; after that, all options must be named
-+ * @param key_val_sep  a 0-terminated list of characters used to separate
-+ *                     key from value, for example '='
-+ * @param pairs_sep    a 0-terminated list of characters used to separate
-+ *                     two pairs from each other, for example ':' or ','
-+ * @return  the number of successfully set key=value pairs, or a negative
-+ *          value corresponding to an AVERROR code in case of error:
-+ *          AVERROR(EINVAL) if opts cannot be parsed,
-+ *          the error code issued by av_set_string3() if a key/value pair
-+ *          cannot be set
-+ *
-+ * Options names must use only the following characters: a-z A-Z 0-9 - . / _
-+ * Separators must use characters distinct from option names and from each
-+ * other.
-  */
--void *av_opt_child_next(void *obj, void *prev);
-+int av_opt_set_from_string(void *ctx, const char *opts,
-+                           const char *const *shorthand,
-+                           const char *key_val_sep, const char *pairs_sep);
- 
- /**
-- * Iterate over potential AVOptions-enabled children of parent.
-+ * Set all the options from a given dictionary on an object.
-+ *
-+ * @param obj a struct whose first element is a pointer to AVClass
-+ * @param options options to process. This dictionary will be freed and replaced
-+ *                by a new one containing all options not found in obj.
-+ *                Of course this new dictionary needs to be freed by caller
-+ *                with av_dict_free().
-+ *
-+ * @return 0 on success, a negative AVERROR if some option was found in obj,
-+ *         but could not be set.
-+ *
-+ * @see av_dict_copy()
-+ */
-+int av_opt_set_dict(void *obj, struct AVDictionary **options);
-+
-+
-+/**
-+ * Set all the options from a given dictionary on an object.
-+ *
-+ * @param obj a struct whose first element is a pointer to AVClass
-+ * @param options options to process. This dictionary will be freed and replaced
-+ *                by a new one containing all options not found in obj.
-+ *                Of course this new dictionary needs to be freed by caller
-+ *                with av_dict_free().
-+ * @param search_flags A combination of AV_OPT_SEARCH_*.
-  *
-- * @param iter a pointer where iteration state is stored.
-- * @return AVClass corresponding to next potential child or NULL
-+ * @return 0 on success, a negative AVERROR if some option was found in obj,
-+ *         but could not be set.
-+ *
-+ * @see av_dict_copy()
-  */
--const AVClass *av_opt_child_class_iterate(const AVClass *parent, void **iter);
-+int av_opt_set_dict2(void *obj, struct AVDictionary **options, int search_flags);
-+
-+/**
-+ * Copy options from src object into dest object.
-+ *
-+ * The underlying AVClass of both src and dest must coincide. The guarantee
-+ * below does not apply if this is not fulfilled.
-+ *
-+ * Options that require memory allocation (e.g. string or binary) are malloc'ed in dest object.
-+ * Original memory allocated for such options is freed unless both src and dest options points to the same memory.
-+ *
-+ * Even on error it is guaranteed that allocated options from src and dest
-+ * no longer alias each other afterwards; in particular calling av_opt_free()
-+ * on both src and dest is safe afterwards if dest has been memdup'ed from src.
-+ *
-+ * @param dest Object to copy from
-+ * @param src  Object to copy into
-+ * @return 0 on success, negative on error
-+ */
-+int av_opt_copy(void *dest, const void *src);
- 
- /**
-  * @defgroup opt_set_funcs Option setting functions
-  * @{
-  * Those functions set the field of obj with the given name to value.
-  *
-  * @param[in] obj A struct whose first element is a pointer to an AVClass.
-  * @param[in] name the name of the field to set
-@@ -692,20 +781,16 @@ int av_opt_set         (void *obj, const
- int av_opt_set_int     (void *obj, const char *name, int64_t     val, int search_flags);
- int av_opt_set_double  (void *obj, const char *name, double      val, int search_flags);
- int av_opt_set_q       (void *obj, const char *name, AVRational  val, int search_flags);
- int av_opt_set_bin     (void *obj, const char *name, const uint8_t *val, int size, int search_flags);
- int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags);
- int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags);
- int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags);
- int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags);
--#if FF_API_OLD_CHANNEL_LAYOUT
--attribute_deprecated
--int av_opt_set_channel_layout(void *obj, const char *name, int64_t ch_layout, int search_flags);
--#endif
- int av_opt_set_chlayout(void *obj, const char *name, const AVChannelLayout *layout, int search_flags);
- /**
-  * @note Any old dictionary present is discarded and replaced with a copy of the new one. The
-  * caller still owns val is and responsible for freeing it.
-  */
- int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags);
- 
- /**
-@@ -721,16 +806,22 @@ int av_opt_set_dict_val(void *obj, const
- #define av_opt_set_int_list(obj, name, val, term, flags) \
-     (av_int_list_length(val, term) > INT_MAX / sizeof(*(val)) ? \
-      AVERROR(EINVAL) : \
-      av_opt_set_bin(obj, name, (const uint8_t *)(val), \
-                     av_int_list_length(val, term) * sizeof(*(val)), flags))
- 
- /**
-  * @}
-+ * @}
-+ */
-+
-+/**
-+ * @defgroup opt_read Reading option values
-+ * @{
-  */
- 
- /**
-  * @defgroup opt_get_funcs Option getting functions
-  * @{
-  * Those functions get a value of the option with the given name from an object.
-  *
-  * @param[in] obj a struct whose first element is a pointer to an AVClass.
-@@ -751,95 +842,61 @@ int av_opt_set_dict_val(void *obj, const
- 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);
- int av_opt_get_double  (void *obj, const char *name, int search_flags, double     *out_val);
- int av_opt_get_q       (void *obj, const char *name, int search_flags, AVRational *out_val);
- int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out);
- int av_opt_get_pixel_fmt (void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt);
- int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt);
- int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val);
--#if FF_API_OLD_CHANNEL_LAYOUT
--attribute_deprecated
--int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int64_t *ch_layout);
--#endif
- int av_opt_get_chlayout(void *obj, const char *name, int search_flags, AVChannelLayout *layout);
- /**
-  * @param[out] out_val The returned dictionary is a copy of the actual value and must
-  * be freed with av_dict_free() by the caller
-  */
- int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val);
- /**
-  * @}
-  */
-+
-+/**
-+ * @defgroup opt_eval_funcs Evaluating option strings
-+ * @{
-+ * This group of functions can be used to evaluate option strings
-+ * and get numbers out of them. They do the same thing as av_opt_set(),
-+ * except the result is written into the caller-supplied pointer.
-+ *
-+ * @param obj a struct whose first element is a pointer to AVClass.
-+ * @param o an option for which the string is to be evaluated.
-+ * @param val string to be evaluated.
-+ * @param *_out value of the string will be written here.
-+ *
-+ * @return 0 on success, a negative number on failure.
-+ */
-+int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int        *flags_out);
-+int av_opt_eval_int   (void *obj, const AVOption *o, const char *val, int        *int_out);
-+int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t    *int64_out);
-+int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float      *float_out);
-+int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double     *double_out);
-+int av_opt_eval_q     (void *obj, const AVOption *o, const char *val, AVRational *q_out);
-+/**
-+ * @}
-+ */
-+
- /**
-  * Gets a pointer to the requested field in a struct.
-  * This function allows accessing a struct even when its fields are moved or
-  * renamed since the application making the access has been compiled,
-  *
-  * @returns a pointer to the field, it can be cast to the correct type and read
-  *          or written to.
-  */
- void *av_opt_ptr(const AVClass *avclass, void *obj, const char *name);
- 
- /**
-- * Free an AVOptionRanges struct and set it to NULL.
-- */
--void av_opt_freep_ranges(AVOptionRanges **ranges);
--
--/**
-- * Get a list of allowed ranges for the given option.
-- *
-- * The returned list may depend on other fields in obj like for example profile.
-- *
-- * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored
-- *              AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance
-- *              AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges
-- *
-- * The result must be freed with av_opt_freep_ranges.
-- *
-- * @return number of compontents returned on success, a negative errro code otherwise
-- */
--int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags);
--
--/**
-- * Copy options from src object into dest object.
-- *
-- * The underlying AVClass of both src and dest must coincide. The guarantee
-- * below does not apply if this is not fulfilled.
-- *
-- * Options that require memory allocation (e.g. string or binary) are malloc'ed in dest object.
-- * Original memory allocated for such options is freed unless both src and dest options points to the same memory.
-- *
-- * Even on error it is guaranteed that allocated options from src and dest
-- * no longer alias each other afterwards; in particular calling av_opt_free()
-- * on both src and dest is safe afterwards if dest has been memdup'ed from src.
-- *
-- * @param dest Object to copy from
-- * @param src  Object to copy into
-- * @return 0 on success, negative on error
-- */
--int av_opt_copy(void *dest, const void *src);
--
--/**
-- * Get a default list of allowed ranges for the given option.
-- *
-- * This list is constructed without using the AVClass.query_ranges() callback
-- * and can be used as fallback from within the callback.
-- *
-- * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored
-- *              AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance
-- *              AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges
-- *
-- * The result must be freed with av_opt_free_ranges.
-- *
-- * @return number of compontents returned on success, a negative errro code otherwise
-- */
--int av_opt_query_ranges_default(AVOptionRanges **, void *obj, const char *key, int flags);
--
--/**
-  * Check if given option is set to its default value.
-  *
-  * Options o must belong to the obj. This function must not be called to check child's options state.
-  * @see av_opt_is_set_to_default_by_name().
-  *
-  * @param obj  AVClass object to check option on
-  * @param o    option to be checked
-  * @return     >0 when option is set to its default,
-@@ -855,16 +912,25 @@ int av_opt_is_set_to_default(void *obj, 
-  * @param name         option name
-  * @param search_flags combination of AV_OPT_SEARCH_*
-  * @return             >0 when option is set to its default,
-  *                     0 when option is not set its default,
-  *                     <0 on error
-  */
- int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags);
- 
-+/**
-+ * Check whether a particular flag is set in a flags field.
-+ *
-+ * @param field_name the name of the flag field option
-+ * @param flag_name the name of the flag to check
-+ * @return non-zero if the flag is set, zero if the flag isn't set,
-+ *         isn't of the right type, or the flags field doesn't exist.
-+ */
-+int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name);
- 
- #define AV_OPT_SERIALIZE_SKIP_DEFAULTS              0x00000001  ///< Serialize options that are not set to default values only.
- #define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT            0x00000002  ///< Serialize options that exactly match opt_flags only.
- 
- /**
-  * Serialize object's options.
-  *
-  * Create a string containing object's serialized options.
-@@ -879,13 +945,54 @@ int av_opt_is_set_to_default_by_name(voi
-  *                           Buffer must be freed by the caller when is no longer needed.
-  * @param[in]  key_val_sep   character used to separate key from value
-  * @param[in]  pairs_sep     character used to separate two pairs from each other
-  * @return                   >= 0 on success, negative on error
-  * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same.
-  */
- int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
-                      const char key_val_sep, const char pairs_sep);
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * Free an AVOptionRanges struct and set it to NULL.
-+ */
-+void av_opt_freep_ranges(AVOptionRanges **ranges);
-+
-+/**
-+ * Get a list of allowed ranges for the given option.
-+ *
-+ * The returned list may depend on other fields in obj like for example profile.
-+ *
-+ * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored
-+ *              AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance
-+ *              AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges
-+ *
-+ * The result must be freed with av_opt_freep_ranges.
-+ *
-+ * @return number of compontents returned on success, a negative errro code otherwise
-+ */
-+int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags);
-+
-+/**
-+ * Get a default list of allowed ranges for the given option.
-+ *
-+ * This list is constructed without using the AVClass.query_ranges() callback
-+ * and can be used as fallback from within the callback.
-+ *
-+ * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored
-+ *              AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance
-+ *              AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges
-+ *
-+ * The result must be freed with av_opt_free_ranges.
-+ *
-+ * @return number of compontents returned on success, a negative errro code otherwise
-+ */
-+int av_opt_query_ranges_default(AVOptionRanges **, void *obj, const char *key, int flags);
-+
- /**
-  * @}
-  */
- 
- #endif /* AVUTIL_OPT_H */
-diff --git a/media/ffvpx/libavutil/pixdesc.c b/media/ffvpx/libavutil/pixdesc.c
---- a/media/ffvpx/libavutil/pixdesc.c
-+++ b/media/ffvpx/libavutil/pixdesc.c
-@@ -455,22 +455,16 @@ static const AVPixFmtDescriptor av_pix_f
-         .log2_chroma_h = 0,
-         .comp = {
-             { 0, 1, 0, 0, 8 },        /* Y */
-             { 1, 1, 0, 0, 8 },        /* U */
-             { 2, 1, 0, 0, 8 },        /* V */
-         },
-         .flags = AV_PIX_FMT_FLAG_PLANAR,
-     },
--#if FF_API_XVMC
--    [AV_PIX_FMT_XVMC] = {
--        .name = "xvmc",
--        .flags = AV_PIX_FMT_FLAG_HWACCEL,
--    },
--#endif
-     [AV_PIX_FMT_UYVY422] = {
-         .name = "uyvy422",
-         .nb_components = 3,
-         .log2_chroma_w = 1,
-         .log2_chroma_h = 0,
-         .comp = {
-             { 0, 2, 1, 0, 8 },        /* Y */
-             { 0, 4, 0, 0, 8 },        /* U */
-@@ -2855,16 +2849,19 @@ static const char * const color_space_na
-     [AVCOL_SPC_SMPTE240M] = "smpte240m",
-     [AVCOL_SPC_YCGCO] = "ycgco",
-     [AVCOL_SPC_BT2020_NCL] = "bt2020nc",
-     [AVCOL_SPC_BT2020_CL] = "bt2020c",
-     [AVCOL_SPC_SMPTE2085] = "smpte2085",
-     [AVCOL_SPC_CHROMA_DERIVED_NCL] = "chroma-derived-nc",
-     [AVCOL_SPC_CHROMA_DERIVED_CL] = "chroma-derived-c",
-     [AVCOL_SPC_ICTCP] = "ictcp",
-+    [AVCOL_SPC_IPT_C2] = "ipt-c2",
-+    [AVCOL_SPC_YCGCO_RE] = "ycgco-re",
-+    [AVCOL_SPC_YCGCO_RO] = "ycgco-ro",
- };
- 
- static const char * const chroma_location_names[] = {
-     [AVCHROMA_LOC_UNSPECIFIED] = "unspecified",
-     [AVCHROMA_LOC_LEFT] = "left",
-     [AVCHROMA_LOC_CENTER] = "center",
-     [AVCHROMA_LOC_TOPLEFT] = "topleft",
-     [AVCHROMA_LOC_TOP] = "top",
-diff --git a/media/ffvpx/libavutil/pixfmt.h b/media/ffvpx/libavutil/pixfmt.h
---- a/media/ffvpx/libavutil/pixfmt.h
-+++ b/media/ffvpx/libavutil/pixfmt.h
-@@ -28,16 +28,23 @@
- 
- #include "libavutil/avconfig.h"
- #include "version.h"
- 
- #define AVPALETTE_SIZE 1024
- #define AVPALETTE_COUNT 256
- 
- /**
-+ * Maximum number of planes in any pixel format.
-+ * This should be used when a maximum is needed, but code should not
-+ * be written to require a maximum for no good reason.
-+ */
-+#define AV_VIDEO_MAX_PLANES 4
-+
-+/**
-  * Pixel format.
-  *
-  * @note
-  * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA
-  * color is put together as:
-  *  (A << 24) | (R << 16) | (G << 8) | B
-  * This is stored as BGRA on little-endian CPU architectures and ARGB on
-  * big-endian CPUs.
-@@ -283,20 +290,16 @@ enum AVPixelFormat {
-     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
- 
--#if FF_API_XVMC
--    AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing
--#endif
--
-     AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
-     AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
-     AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
-     AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
-     AV_PIX_FMT_AYUV64LE,    ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
-     AV_PIX_FMT_AYUV64BE,    ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
- 
-     AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox
-@@ -615,16 +618,19 @@ enum AVColorSpace {
-     AVCOL_SPC_YCGCO       = 8,  ///< used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
-     AVCOL_SPC_YCOCG       = AVCOL_SPC_YCGCO,
-     AVCOL_SPC_BT2020_NCL  = 9,  ///< ITU-R BT2020 non-constant luminance system
-     AVCOL_SPC_BT2020_CL   = 10, ///< ITU-R BT2020 constant luminance system
-     AVCOL_SPC_SMPTE2085   = 11, ///< SMPTE 2085, Y'D'zD'x
-     AVCOL_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system
-     AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system
-     AVCOL_SPC_ICTCP       = 14, ///< ITU-R BT.2100-0, ICtCp
-+    AVCOL_SPC_IPT_C2      = 15, ///< SMPTE ST 2128, IPT-C2
-+    AVCOL_SPC_YCGCO_RE    = 16, ///< YCgCo-R, even addition of bits
-+    AVCOL_SPC_YCGCO_RO    = 17, ///< YCgCo-R, odd addition of bits
-     AVCOL_SPC_NB                ///< Not part of ABI
- };
- 
- /**
-  * Visual content value range.
-  *
-  * These values are based on definitions that can be found in multiple
-  * specifications, such as ITU-T BT.709 (3.4 - Quantization of RGB, luminance
-diff --git a/media/ffvpx/libavutil/rational.c b/media/ffvpx/libavutil/rational.c
---- a/media/ffvpx/libavutil/rational.c
-+++ b/media/ffvpx/libavutil/rational.c
-@@ -109,17 +109,17 @@ AVRational av_d2q(double d, int max)
-     int exponent;
-     int64_t den;
-     if (isnan(d))
-         return (AVRational) { 0,0 };
-     if (fabs(d) > INT_MAX + 3LL)
-         return (AVRational) { d < 0 ? -1 : 1, 0 };
-     frexp(d, &exponent);
-     exponent = FFMAX(exponent-1, 0);
--    den = 1LL << (61 - exponent);
-+    den = 1LL << (62 - exponent);
-     // (int64_t)rint() and llrint() do not work with gcc on ia64 and sparc64,
-     // see Ticket2713 for affected gcc/glibc versions
-     av_reduce(&a.num, &a.den, floor(d * den + 0.5), den, max);
-     if ((!a.num || !a.den) && d && max>0 && max<INT_MAX)
-         av_reduce(&a.num, &a.den, floor(d * den + 0.5), den, INT_MAX);
- 
-     return a;
- }
-diff --git a/media/ffvpx/libavutil/rational.h b/media/ffvpx/libavutil/rational.h
---- a/media/ffvpx/libavutil/rational.h
-+++ b/media/ffvpx/libavutil/rational.h
-@@ -163,16 +163,20 @@ static av_always_inline AVRational av_in
- }
- 
- /**
-  * Convert a double precision floating point number to a rational.
-  *
-  * In case of infinity, the returned value is expressed as `{1, 0}` or
-  * `{-1, 0}` depending on the sign.
-  *
-+ * In general rational numbers with |num| <= 1<<26 && |den| <= 1<<26
-+ * can be recovered exactly from their double representation.
-+ * (no exceptions were found within 1B random ones)
-+ *
-  * @param d   `double` to convert
-  * @param max Maximum allowed numerator and denominator
-  * @return `d` in AVRational form
-  * @see av_q2d()
-  */
- AVRational av_d2q(double d, int max) av_const;
- 
- /**
-diff --git a/media/ffvpx/libavutil/thread.h b/media/ffvpx/libavutil/thread.h
---- a/media/ffvpx/libavutil/thread.h
-+++ b/media/ffvpx/libavutil/thread.h
-@@ -21,16 +21,18 @@
- 
- #ifndef AVUTIL_THREAD_H
- #define AVUTIL_THREAD_H
- 
- #include "config.h"
- 
- #if HAVE_PRCTL
- #include <sys/prctl.h>
-+#elif (HAVE_PTHREAD_SETNAME_NP || HAVE_PTHREAD_SET_NAME_NP) && HAVE_PTHREAD_NP_H
-+#include <pthread_np.h>
- #endif
- 
- #include "error.h"
- 
- #if HAVE_PTHREADS || HAVE_W32THREADS || HAVE_OS2THREADS
- 
- #if HAVE_PTHREADS
- #include <pthread.h>
-@@ -208,16 +210,30 @@ static inline int ff_thread_once(char *c
-     }
-     return 0;
- }
- 
- #endif
- 
- static inline int ff_thread_setname(const char *name)
- {
-+    int ret = 0;
-+
- #if HAVE_PRCTL
--    return AVERROR(prctl(PR_SET_NAME, name));
-+    ret = AVERROR(prctl(PR_SET_NAME, name));
-+#elif HAVE_PTHREAD_SETNAME_NP
-+#if defined(__APPLE__)
-+    ret = AVERROR(pthread_setname_np(name));
-+#elif defined(__NetBSD__)
-+    ret = AVERROR(pthread_setname_np(pthread_self(), "%s", name));
-+#else
-+    ret = AVERROR(pthread_setname_np(pthread_self(), name));
-+#endif
-+#elif HAVE_PTHREAD_SET_NAME_NP
-+    pthread_set_name_np(pthread_self(), name);
-+#else
-+    ret = AVERROR(ENOSYS);
- #endif
- 
--    return AVERROR(ENOSYS);
-+    return ret;
- }
- 
- #endif /* AVUTIL_THREAD_H */
-diff --git a/media/ffvpx/libavutil/timecode.c b/media/ffvpx/libavutil/timecode.c
---- a/media/ffvpx/libavutil/timecode.c
-+++ b/media/ffvpx/libavutil/timecode.c
-@@ -205,17 +205,17 @@ static int check_timecode(void *log_ctx,
-     }
-     return 0;
- }
- 
- static int fps_from_frame_rate(AVRational rate)
- {
-     if (!rate.den || !rate.num)
-         return -1;
--    return (rate.num + rate.den/2) / rate.den;
-+    return (rate.num + rate.den/2LL) / rate.den;
- }
- 
- int av_timecode_check_frame_rate(AVRational rate)
- {
-     return check_fps(fps_from_frame_rate(rate));
- }
- 
- int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx)
-diff --git a/media/ffvpx/libavutil/timestamp.h b/media/ffvpx/libavutil/timestamp.h
---- a/media/ffvpx/libavutil/timestamp.h
-+++ b/media/ffvpx/libavutil/timestamp.h
-@@ -57,21 +57,28 @@ static inline char *av_ts_make_string(ch
-  * Fill the provided buffer with a string containing a timestamp time
-  * representation.
-  *
-  * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE
-  * @param ts the timestamp to represent
-  * @param tb the timebase of the timestamp
-  * @return the buffer in input
-  */
--static inline char *av_ts_make_time_string(char *buf, int64_t ts, AVRational *tb)
-+char *av_ts_make_time_string2(char *buf, int64_t ts, AVRational tb);
-+
-+/**
-+ * Fill the provided buffer with a string containing a timestamp
-+ * representation.
-+ *
-+ * @see av_ts_make_time_string2
-+ */
-+static inline char *av_ts_make_time_string(char *buf, int64_t ts,
-+                                           const AVRational *tb)
- {
--    if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS");
--    else                      snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.6g", av_q2d(*tb) * ts);
--    return buf;
-+    return av_ts_make_time_string2(buf, ts, *tb);
- }
- 
- /**
-  * Convenience macro, the return value should be used only directly in
-  * function arguments but never stand-alone.
-  */
- #define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb)
- 
-diff --git a/media/ffvpx/libavutil/tx.c b/media/ffvpx/libavutil/tx.c
---- a/media/ffvpx/libavutil/tx.c
-+++ b/media/ffvpx/libavutil/tx.c
-@@ -14,16 +14,17 @@
-  * 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 "avassert.h"
- #include "intmath.h"
- #include "cpu.h"
-+#include "mem.h"
- #include "qsort.h"
- #include "bprint.h"
- 
- #include "tx_priv.h"
- 
- #define TYPE_IS(type, x)               \
-     (((x) == AV_TX_FLOAT_ ## type)  || \
-      ((x) == AV_TX_DOUBLE_ ## type) || \
-@@ -588,17 +589,18 @@ static void print_type(AVBPrint *bp, enu
-                type == AV_TX_INT32_FFT   ? "fft_int32"   :
-                type == AV_TX_INT32_MDCT  ? "mdct_int32"  :
-                type == AV_TX_INT32_RDFT  ? "rdft_int32"  :
-                type == AV_TX_INT32_DCT_I ? "dctI_int32" :
-                type == AV_TX_INT32_DST_I ? "dstI_int32" :
-                "unknown");
- }
- 
--static void print_cd_info(const FFTXCodelet *cd, int prio, int len, int print_prio)
-+static void print_cd_info(const FFTXCodelet *cd, int prio, int len, int print_prio,
-+                          int log_level)
- {
-     AVBPrint bp;
-     av_bprint_init(&bp, 0, AV_BPRINT_SIZE_AUTOMATIC);
- 
-     av_bprintf(&bp, "%s - type: ", cd->name);
- 
-     print_type(&bp, cd->type);
- 
-@@ -638,27 +640,27 @@ static void print_cd_info(const FFTXCode
-         av_bprintf(&bp, "%s, factor: %i, ",
-                    !len && cd->min_len != cd->max_len ? "]" : "", cd->factors[0]);
-     }
-     print_flags(&bp, cd->flags);
- 
-     if (print_prio)
-         av_bprintf(&bp, ", prio: %i", prio);
- 
--    av_log(NULL, AV_LOG_DEBUG, "%s\n", bp.str);
-+    av_log(NULL, log_level, "%s\n", bp.str);
- }
- 
- static void print_tx_structure(AVTXContext *s, int depth)
- {
-     const FFTXCodelet *cd = s->cd_self;
- 
-     for (int i = 0; i <= depth; i++)
-         av_log(NULL, AV_LOG_DEBUG, "    ");
- 
--    print_cd_info(cd, cd->prio, s->len, 0);
-+    print_cd_info(cd, cd->prio, s->len, 0, AV_LOG_DEBUG);
- 
-     for (int i = 0; i < s->nb_sub; i++)
-         print_tx_structure(&s->sub[i], depth + 1);
- }
- #endif /* CONFIG_SMALL */
- 
- typedef struct TXCodeletMatch {
-     const FFTXCodelet *cd;
-@@ -811,21 +813,21 @@ av_cold int ff_tx_init_subtx(AVTXContext
-     /* No matches found */
-     if (!nb_cd_matches)
-         return AVERROR(ENOSYS);
- 
-     /* Sort the list */
-     AV_QSORT(cd_matches, nb_cd_matches, TXCodeletMatch, cmp_matches);
- 
- #if !CONFIG_SMALL
--    av_log(NULL, AV_LOG_DEBUG, "%s\n", bp.str);
-+    av_log(NULL, AV_LOG_TRACE, "%s\n", bp.str);
- 
-     for (int i = 0; i < nb_cd_matches; i++) {
--        av_log(NULL, AV_LOG_DEBUG, "    %i: ", i + 1);
--        print_cd_info(cd_matches[i].cd, cd_matches[i].prio, 0, 1);
-+        av_log(NULL, AV_LOG_TRACE, "    %i: ", i + 1);
-+        print_cd_info(cd_matches[i].cd, cd_matches[i].prio, 0, 1, AV_LOG_TRACE);
-     }
- #endif
- 
-     if (!s->sub) {
-         s->sub = sub = av_mallocz(TX_MAX_SUB*sizeof(*sub));
-         if (!sub) {
-             ret = AVERROR(ENOMEM);
-             goto end;
-@@ -909,20 +911,22 @@ av_cold int av_tx_init(AVTXContext **ctx
-     if (!len || type >= AV_TX_NB || !ctx || !tx)
-         return AVERROR(EINVAL);
- 
-     if (!(flags & AV_TX_UNALIGNED))
-         flags |= FF_TX_ALIGNED;
-     if (!(flags & AV_TX_INPLACE))
-         flags |= FF_TX_OUT_OF_PLACE;
- 
--    if (!scale && ((type == AV_TX_FLOAT_MDCT) || (type == AV_TX_INT32_MDCT)))
-+    if (!scale && ((type == AV_TX_DOUBLE_MDCT) || (type == AV_TX_DOUBLE_DCT) ||
-+                   (type == AV_TX_DOUBLE_DCT_I) || (type == AV_TX_DOUBLE_DST_I) ||
-+                   (type == AV_TX_DOUBLE_RDFT)))
-+        scale = &default_scale_d;
-+    else if (!scale && !TYPE_IS(FFT, type))
-         scale = &default_scale_f;
--    else if (!scale && (type == AV_TX_DOUBLE_MDCT))
--        scale = &default_scale_d;
- 
-     ret = ff_tx_init_subtx(&tmp, type, flags, NULL, len, inv, scale);
-     if (ret < 0)
-         return ret;
- 
-     *ctx = &tmp.sub[0];
-     *tx  = tmp.fn[0];
- 
-diff --git a/media/ffvpx/libavutil/tx_template.c b/media/ffvpx/libavutil/tx_template.c
---- a/media/ffvpx/libavutil/tx_template.c
-+++ b/media/ffvpx/libavutil/tx_template.c
-@@ -19,16 +19,18 @@
-  * 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 "mem.h"
-+
- #define TABLE_DEF(name, size) \
-     DECLARE_ALIGNED(32, TXSample, TX_TAB(ff_tx_tab_ ##name))[size]
- 
- #define SR_POW2_TABLES \
-     SR_TABLE(8)        \
-     SR_TABLE(16)       \
-     SR_TABLE(32)       \
-     SR_TABLE(64)       \
-diff --git a/media/ffvpx/libavutil/version.h b/media/ffvpx/libavutil/version.h
---- a/media/ffvpx/libavutil/version.h
-+++ b/media/ffvpx/libavutil/version.h
-@@ -73,19 +73,19 @@
-  * @defgroup lavu_ver Version and Build diagnostics
-  *
-  * Macros and function useful to check at compiletime and at runtime
-  * which version of libavutil is in use.
-  *
-  * @{
-  */
- 
--#define LIBAVUTIL_VERSION_MAJOR  58
--#define LIBAVUTIL_VERSION_MINOR  36
--#define LIBAVUTIL_VERSION_MICRO 101
-+#define LIBAVUTIL_VERSION_MAJOR  59
-+#define LIBAVUTIL_VERSION_MINOR  13
-+#define LIBAVUTIL_VERSION_MICRO 100
- 
- #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
-                                                LIBAVUTIL_VERSION_MINOR, \
-                                                LIBAVUTIL_VERSION_MICRO)
- #define LIBAVUTIL_VERSION       AV_VERSION(LIBAVUTIL_VERSION_MAJOR,     \
-                                            LIBAVUTIL_VERSION_MINOR,     \
-                                            LIBAVUTIL_VERSION_MICRO)
- #define LIBAVUTIL_BUILD         LIBAVUTIL_VERSION_INT
-@@ -100,29 +100,22 @@
-  *
-  * @note, when bumping the major version it is recommended to manually
-  * disable each FF_API_* in its own commit instead of disabling them all
-  * at once through the bump. This improves the git bisect-ability of the change.
-  *
-  * @{
-  */
- 
--#define FF_API_FIFO_PEEK2               (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_FIFO_OLD_API             (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_XVMC                     (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_OLD_CHANNEL_LAYOUT       (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_AV_FOPEN_UTF8            (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_PKT_DURATION             (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_REORDERED_OPAQUE         (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_FRAME_PICTURE_NUMBER     (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_HDR_VIVID_THREE_SPLINE   (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_FRAME_PKT                (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_INTERLACED_FRAME         (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_FRAME_KEY                (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_PALETTE_HAS_CHANGED      (LIBAVUTIL_VERSION_MAJOR < 59)
--#define FF_API_VULKAN_CONTIGUOUS_MEMORY (LIBAVUTIL_VERSION_MAJOR < 59)
-+#define FF_API_HDR_VIVID_THREE_SPLINE   (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_FRAME_PKT                (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_INTERLACED_FRAME         (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_FRAME_KEY                (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_PALETTE_HAS_CHANGED      (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_VULKAN_CONTIGUOUS_MEMORY (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_H274_FILM_GRAIN_VCS      (LIBAVUTIL_VERSION_MAJOR < 60)
- 
- /**
-  * @}
-  * @}
-  */
- 
- #endif /* AVUTIL_VERSION_H */
-diff --git a/media/ffvpx/libavutil/x86/emms.h b/media/ffvpx/libavutil/x86/emms.h
-deleted file mode 100644
---- a/media/ffvpx/libavutil/x86/emms.h
-+++ /dev/null
-@@ -1,58 +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
-- */
--
--#ifndef AVUTIL_X86_EMMS_H
--#define AVUTIL_X86_EMMS_H
--
--#include "config.h"
--#include "libavutil/attributes.h"
--
--void avpriv_emms_asm(void);
--
--#if HAVE_MMX_INLINE
--#ifndef __MMX__
--#include "libavutil/cpu.h"
--#endif
--
--#   define emms_c emms_c
--/**
-- * Empty mmx state.
-- * this must be called between any dsp function and float/double code.
-- * for example sin(); dsp->idct_put(); emms_c(); cos()
-- * Note, *alloc() and *free() also use float code in some libc implementations
-- * thus this also applies to them or any function using them.
-- */
--static av_always_inline void emms_c(void)
--{
--/* Some inlined functions may also use mmx instructions regardless of
-- * runtime cpuflags. With that in mind, we unconditionally empty the
-- * mmx state if the target cpu chosen at configure time supports it.
-- */
--#if !defined(__MMX__)
--    if(av_get_cpu_flags() & AV_CPU_FLAG_MMX)
--#endif
--        __asm__ volatile ("emms" ::: "memory");
--}
--#elif HAVE_MMX && HAVE_MM_EMPTY
--#   include <mmintrin.h>
--#   define emms_c _mm_empty
--#elif HAVE_MMX_EXTERNAL
--#   define emms_c avpriv_emms_asm
--#endif /* HAVE_MMX_INLINE */
--
--#endif /* AVUTIL_X86_EMMS_H */
-diff --git a/media/ffvpx/libavutil/x86/fixed_dsp_init.c b/media/ffvpx/libavutil/x86/fixed_dsp_init.c
---- a/media/ffvpx/libavutil/x86/fixed_dsp_init.c
-+++ b/media/ffvpx/libavutil/x86/fixed_dsp_init.c
-@@ -11,24 +11,22 @@
-  * 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/fixed_dsp.h"
- #include "cpu.h"
- 
--void ff_butterflies_fixed_sse2(int *av_restrict src0, int *av_restrict src1, int len);
-+void ff_butterflies_fixed_sse2(int *restrict src0, int *restrict src1, int len);
- 
- av_cold void ff_fixed_dsp_init_x86(AVFixedDSPContext *fdsp)
- {
-     int cpu_flags = av_get_cpu_flags();
- 
-     if (EXTERNAL_SSE2(cpu_flags)) {
-         fdsp->butterflies_fixed = ff_butterflies_fixed_sse2;
-     }
-diff --git a/media/ffvpx/libavutil/x86/float_dsp_init.c b/media/ffvpx/libavutil/x86/float_dsp_init.c
---- a/media/ffvpx/libavutil/x86/float_dsp_init.c
-+++ b/media/ffvpx/libavutil/x86/float_dsp_init.c
-@@ -11,23 +11,20 @@
-  * 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/float_dsp.h"
- #include "cpu.h"
--#include "asm.h"
- 
- void ff_vector_fmul_sse(float *dst, const float *src0, const float *src1,
-                         int len);
- void ff_vector_fmul_avx(float *dst, const float *src0, const float *src1,
-                         int len);
- 
- void ff_vector_dmul_sse2(double *dst, const double *src0, const double *src1,
-                          int len);
-@@ -71,17 +68,17 @@ void ff_vector_fmul_reverse_sse(float *d
- void ff_vector_fmul_reverse_avx(float *dst, const float *src0,
-                                 const float *src1, int len);
- void ff_vector_fmul_reverse_avx2(float *dst, const float *src0,
-                                  const float *src1, int len);
- 
- float ff_scalarproduct_float_sse(const float *v1, const float *v2, int order);
- float ff_scalarproduct_float_fma3(const float *v1, const float *v2, int order);
- 
--void ff_butterflies_float_sse(float *av_restrict src0, float *av_restrict src1, int len);
-+void ff_butterflies_float_sse(float *restrict src0, float *restrict src1, int len);
- 
- av_cold void ff_float_dsp_init_x86(AVFloatDSPContext *fdsp)
- {
-     int cpu_flags = av_get_cpu_flags();
- 
-     if (EXTERNAL_SSE(cpu_flags)) {
-         fdsp->vector_fmul = ff_vector_fmul_sse;
-         fdsp->vector_fmac_scalar = ff_vector_fmac_scalar_sse;
-diff --git a/media/ffvpx/libavutil/x86/intreadwrite.h b/media/ffvpx/libavutil/x86/intreadwrite.h
---- a/media/ffvpx/libavutil/x86/intreadwrite.h
-+++ b/media/ffvpx/libavutil/x86/intreadwrite.h
-@@ -22,52 +22,16 @@
- #define AVUTIL_X86_INTREADWRITE_H
- 
- #include <stdint.h>
- #include "config.h"
- #include "libavutil/attributes.h"
- 
- #if HAVE_MMX
- 
--#if !HAVE_FAST_64BIT && defined(__MMX__)
--
--#define FF_COPY_SWAP_ZERO_USES_MMX
--
--#define AV_COPY64 AV_COPY64
--static av_always_inline void AV_COPY64(void *d, const void *s)
--{
--    __asm__("movq   %1, %%mm0  \n\t"
--            "movq   %%mm0, %0  \n\t"
--            : "=m"(*(uint64_t*)d)
--            : "m" (*(const uint64_t*)s)
--            : "mm0");
--}
--
--#define AV_SWAP64 AV_SWAP64
--static av_always_inline void AV_SWAP64(void *a, void *b)
--{
--    __asm__("movq   %1, %%mm0  \n\t"
--            "movq   %0, %%mm1  \n\t"
--            "movq   %%mm0, %0  \n\t"
--            "movq   %%mm1, %1  \n\t"
--            : "+m"(*(uint64_t*)a), "+m"(*(uint64_t*)b)
--            ::"mm0", "mm1");
--}
--
--#define AV_ZERO64 AV_ZERO64
--static av_always_inline void AV_ZERO64(void *d)
--{
--    __asm__("pxor %%mm0, %%mm0  \n\t"
--            "movq %%mm0, %0     \n\t"
--            : "=m"(*(uint64_t*)d)
--            :: "mm0");
--}
--
--#endif /* !HAVE_FAST_64BIT && defined(__MMX__) */
--
- #ifdef __SSE__
- 
- #define AV_COPY128 AV_COPY128
- static av_always_inline void AV_COPY128(void *d, const void *s)
- {
-     struct v {uint64_t v[2];};
- 
-     __asm__("movaps   %1, %%xmm0  \n\t"
-diff --git a/media/ffvpx/libavutil/x86/moz.build b/media/ffvpx/libavutil/x86/moz.build
---- a/media/ffvpx/libavutil/x86/moz.build
-+++ b/media/ffvpx/libavutil/x86/moz.build
-@@ -11,15 +11,17 @@ SOURCES += [
-     'fixed_dsp.asm',
-     'fixed_dsp_init.c',
-     'float_dsp.asm',
-     'float_dsp_init.c',
-     'imgutils.asm',
-     'imgutils_init.c',
-     'lls.asm',
-     'lls_init.c',
-+    'pixelutils.asm',
-+    'pixelutils_init.c',
-     'tx_float.asm',
-     'tx_float_init.c',
- ]
- 
- FINAL_LIBRARY = 'mozavutil'
- 
- include('/media/ffvpx/ffvpxcommon.mozbuild')
-diff --git a/media/ffvpx/libavutil/x86/tx_float.asm b/media/ffvpx/libavutil/x86/tx_float.asm
---- a/media/ffvpx/libavutil/x86/tx_float.asm
-+++ b/media/ffvpx/libavutil/x86/tx_float.asm
-@@ -41,17 +41,17 @@
- 
- %if ARCH_X86_64
- %define ptr resq
- %else
- %define ptr resd
- %endif
- 
- %assign i 16
--%rep 14
-+%rep 18
- cextern tab_ %+ i %+ _float ; ff_tab_i_float...
- %assign i (i << 1)
- %endrep
- 
- cextern tab_53_float
- 
- struc AVTXContext
-     .len:          resd 1 ; Length
-@@ -1380,17 +1380,21 @@ ALIGN 16
- 
- ; 2048 to 131072-point transforms ==============================================
- FFT_SPLIT_RADIX_DEF 2048,  .4096pt
- FFT_SPLIT_RADIX_DEF 4096,  .8192pt
- FFT_SPLIT_RADIX_DEF 8192,  .16384pt
- FFT_SPLIT_RADIX_DEF 16384, .32768pt
- FFT_SPLIT_RADIX_DEF 32768, .65536pt
- FFT_SPLIT_RADIX_DEF 65536, .131072pt
--FFT_SPLIT_RADIX_DEF 131072
-+FFT_SPLIT_RADIX_DEF 131072, .262144pt
-+FFT_SPLIT_RADIX_DEF 262144, .524288pt
-+FFT_SPLIT_RADIX_DEF 524288, .1048576pt
-+FFT_SPLIT_RADIX_DEF 1048576, .2097152pt
-+FFT_SPLIT_RADIX_DEF 2097152
- 
- ;===============================================================================
- ; Final synthesis + deinterleaving code
- ;===============================================================================
- .deinterleave:
- %if %2
-     PUSH strideq
- %endif
-diff --git a/media/ffvpx/libavutil/x86/tx_float_init.c b/media/ffvpx/libavutil/x86/tx_float_init.c
---- a/media/ffvpx/libavutil/x86/tx_float_init.c
-+++ b/media/ffvpx/libavutil/x86/tx_float_init.c
-@@ -14,16 +14,17 @@
-  * 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
-  */
- 
- #define TX_FLOAT
- #include "libavutil/tx_priv.h"
- #include "libavutil/attributes.h"
-+#include "libavutil/mem.h"
- #include "libavutil/x86/cpu.h"
- 
- #include "config.h"
- 
- TX_DECL_FN(fft2,      sse3)
- TX_DECL_FN(fft4_fwd,  sse2)
- TX_DECL_FN(fft4_inv,  sse2)
- TX_DECL_FN(fft8,      sse3)
-@@ -265,38 +266,38 @@ const FFTXCodelet * const ff_tx_codelet_
-            AV_TX_INPLACE | FF_TX_PRESHUFFLE | FF_TX_ASM_CALL, AV_CPU_FLAG_AVXSLOW),
-     TX_DEF(fft32_ns, FFT, 32, 32, 2, 0, 320, b8_i2, avx,  AVX,  AV_TX_INPLACE | FF_TX_PRESHUFFLE,
-            AV_CPU_FLAG_AVXSLOW),
-     TX_DEF(fft32,    FFT, 32, 32, 2, 0, 288, b8_i2, fma3, FMA3, AV_TX_INPLACE, AV_CPU_FLAG_AVXSLOW),
-     TX_DEF(fft32_asm, FFT, 32, 32, 2, 0, 352, b8_i2, fma3, FMA3,
-            AV_TX_INPLACE | FF_TX_PRESHUFFLE | FF_TX_ASM_CALL, AV_CPU_FLAG_AVXSLOW),
-     TX_DEF(fft32_ns, FFT, 32, 32, 2, 0, 352, b8_i2, fma3, FMA3, AV_TX_INPLACE | FF_TX_PRESHUFFLE,
-            AV_CPU_FLAG_AVXSLOW),
--    TX_DEF(fft_sr,    FFT, 64, 131072, 2, 0, 256, b8_i2, avx, AVX,  0, AV_CPU_FLAG_AVXSLOW),
--    TX_DEF(fft_sr_asm, FFT, 64, 131072, 2, 0, 320, b8_i2, avx, AVX,
-+    TX_DEF(fft_sr,    FFT, 64, 2097152, 2, 0, 256, b8_i2, avx, AVX,  0, AV_CPU_FLAG_AVXSLOW),
-+    TX_DEF(fft_sr_asm, FFT, 64, 2097152, 2, 0, 320, b8_i2, avx, AVX,
-            AV_TX_INPLACE | FF_TX_PRESHUFFLE | FF_TX_ASM_CALL, AV_CPU_FLAG_AVXSLOW),
--    TX_DEF(fft_sr_ns, FFT, 64, 131072, 2, 0, 320, b8_i2, avx, AVX,  AV_TX_INPLACE | FF_TX_PRESHUFFLE,
-+    TX_DEF(fft_sr_ns, FFT, 64, 2097152, 2, 0, 320, b8_i2, avx, AVX,  AV_TX_INPLACE | FF_TX_PRESHUFFLE,
-            AV_CPU_FLAG_AVXSLOW),
--    TX_DEF(fft_sr,    FFT, 64, 131072, 2, 0, 288, b8_i2, fma3,  FMA3,  0, AV_CPU_FLAG_AVXSLOW),
--    TX_DEF(fft_sr_asm, FFT, 64, 131072, 2, 0, 352, b8_i2, fma3,  FMA3,
-+    TX_DEF(fft_sr,    FFT, 64, 2097152, 2, 0, 288, b8_i2, fma3,  FMA3,  0, AV_CPU_FLAG_AVXSLOW),
-+    TX_DEF(fft_sr_asm, FFT, 64, 2097152, 2, 0, 352, b8_i2, fma3,  FMA3,
-            AV_TX_INPLACE | FF_TX_PRESHUFFLE | FF_TX_ASM_CALL, AV_CPU_FLAG_AVXSLOW),
--    TX_DEF(fft_sr_ns, FFT, 64, 131072, 2, 0, 352, b8_i2, fma3,  FMA3,  AV_TX_INPLACE | FF_TX_PRESHUFFLE,
-+    TX_DEF(fft_sr_ns, FFT, 64, 2097152, 2, 0, 352, b8_i2, fma3,  FMA3,  AV_TX_INPLACE | FF_TX_PRESHUFFLE,
-            AV_CPU_FLAG_AVXSLOW),
- 
- #if HAVE_AVX2_EXTERNAL
-     TX_DEF(fft15, FFT, 15, 15, 15, 0, 320, factor_init, avx2, AVX2,
-            AV_TX_INPLACE, AV_CPU_FLAG_AVXSLOW),
-     TX_DEF(fft15_ns, FFT, 15, 15, 15, 0, 384, factor_init, avx2, AVX2,
-            AV_TX_INPLACE | FF_TX_PRESHUFFLE, AV_CPU_FLAG_AVXSLOW),
- 
--    TX_DEF(fft_sr,    FFT, 64, 131072, 2, 0, 320, b8_i2, avx2, AVX2, 0,
-+    TX_DEF(fft_sr,    FFT, 64, 2097152, 2, 0, 320, b8_i2, avx2, AVX2, 0,
-            AV_CPU_FLAG_AVXSLOW | AV_CPU_FLAG_SLOW_GATHER),
--    TX_DEF(fft_sr_asm, FFT, 64, 131072, 2, 0, 384, b8_i2, avx2, AVX2,
-+    TX_DEF(fft_sr_asm, FFT, 64, 2097152, 2, 0, 384, b8_i2, avx2, AVX2,
-            AV_TX_INPLACE | FF_TX_PRESHUFFLE | FF_TX_ASM_CALL, AV_CPU_FLAG_AVXSLOW | AV_CPU_FLAG_SLOW_GATHER),
--    TX_DEF(fft_sr_ns, FFT, 64, 131072, 2, 0, 384, b8_i2, avx2, AVX2, AV_TX_INPLACE | FF_TX_PRESHUFFLE,
-+    TX_DEF(fft_sr_ns, FFT, 64, 2097152, 2, 0, 384, b8_i2, avx2, AVX2, AV_TX_INPLACE | FF_TX_PRESHUFFLE,
-            AV_CPU_FLAG_AVXSLOW | AV_CPU_FLAG_SLOW_GATHER),
- 
-     TX_DEF(fft_pfa_15xM, FFT, 60, TX_LEN_UNLIMITED, 15, 2, 320, fft_pfa_init, avx2, AVX2,
-            AV_TX_INPLACE, AV_CPU_FLAG_AVXSLOW | AV_CPU_FLAG_SLOW_GATHER),
-     TX_DEF(fft_pfa_15xM_asm, FFT, 60, TX_LEN_UNLIMITED, 15, 2, 384, fft_pfa_init, avx2, AVX2,
-            AV_TX_INPLACE | FF_TX_PRESHUFFLE | FF_TX_ASM_CALL, AV_CPU_FLAG_AVXSLOW | AV_CPU_FLAG_SLOW_GATHER),
-     TX_DEF(fft_pfa_15xM_ns, FFT, 60, TX_LEN_UNLIMITED, 15, 2, 384, fft_pfa_init, avx2, AVX2,
-            AV_TX_INPLACE | FF_TX_PRESHUFFLE, AV_CPU_FLAG_AVXSLOW | AV_CPU_FLAG_SLOW_GATHER),
-diff --git a/media/ffvpx/libavutil/x86/x86inc.asm b/media/ffvpx/libavutil/x86/x86inc.asm
---- a/media/ffvpx/libavutil/x86/x86inc.asm
-+++ b/media/ffvpx/libavutil/x86/x86inc.asm
-@@ -1,12 +1,12 @@
- ;*****************************************************************************
--;* x86inc.asm: x264asm abstraction layer
-+;* x86inc.asm: x86 abstraction layer
- ;*****************************************************************************
--;* Copyright (C) 2005-2018 x264 project
-+;* Copyright (C) 2005-2024 x264 project
- ;*
- ;* Authors: Loren Merritt <lorenm@u.washington.edu>
- ;*          Henrik Gramner <henrik@gramner.com>
- ;*          Anton Mitrofanov <BugMaster@narod.ru>
- ;*          Fiona Glaser <fiona@x264.com>
- ;*
- ;* Permission to use, copy, modify, and/or distribute this software for any
- ;* purpose with or without fee is hereby granted, provided that the above
-@@ -16,31 +16,24 @@
- ;* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- ;* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- ;* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- ;* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ;* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- ;* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- ;*****************************************************************************
- 
--; This is a header file for the x264ASM assembly language, which uses
-+; This is a header file for the x86inc.asm assembly language, which uses
- ; NASM/YASM syntax combined with a large number of macros to provide easy
- ; abstraction between different calling conventions (x86_32, win64, linux64).
- ; It also has various other useful features to simplify writing the kind of
--; DSP functions that are most often used in x264.
--
--; Unlike the rest of x264, this file is available under an ISC license, as it
--; has significant usefulness outside of x264 and we want it to be available
--; to the largest audience possible.  Of course, if you modify it for your own
--; purposes to add a new feature, we strongly encourage contributing a patch
--; as this feature might be useful for others as well.  Send patches or ideas
--; to x264-devel@videolan.org .
-+; DSP functions that are most often used.
- 
- %ifndef private_prefix
--    %define private_prefix x264
-+    %error private_prefix not defined
- %endif
- 
- %ifndef public_prefix
-     %define public_prefix private_prefix
- %endif
- 
- %if HAVE_ALIGNED_STACK
-     %define STACK_ALIGNMENT 16
-@@ -63,30 +56,42 @@
-     %elifidn __OUTPUT_FORMAT__,x64
-         %define WIN64  1
-     %else
-         %define UNIX64 1
-     %endif
- %endif
- 
- %define FORMAT_ELF 0
-+%define FORMAT_MACHO 0
- %ifidn __OUTPUT_FORMAT__,elf
-     %define FORMAT_ELF 1
- %elifidn __OUTPUT_FORMAT__,elf32
-     %define FORMAT_ELF 1
- %elifidn __OUTPUT_FORMAT__,elf64
-     %define FORMAT_ELF 1
-+%elifidn __OUTPUT_FORMAT__,macho
-+    %define FORMAT_MACHO 1
-+%elifidn __OUTPUT_FORMAT__,macho32
-+    %define FORMAT_MACHO 1
-+%elifidn __OUTPUT_FORMAT__,macho64
-+    %define FORMAT_MACHO 1
- %endif
- 
- %ifdef PREFIX
-     %define mangle(x) _ %+ x
- %else
-     %define mangle(x) x
- %endif
- 
-+; Use VEX-encoding even in non-AVX functions
-+%ifndef FORCE_VEX_ENCODING
-+    %define FORCE_VEX_ENCODING 0
-+%endif
-+
- ; aout does not support align=
- ; NOTE: This section is out of sync with x264, in order to
- ; keep supporting OS/2.
- %macro SECTION_RODATA 0-1 16
-     %ifidn __OUTPUT_FORMAT__,aout
-         SECTION .text
-     %elifidn __OUTPUT_FORMAT__,coff
-         SECTION .text
-@@ -94,38 +99,37 @@
-         SECTION .rdata align=%1
-     %elif WIN64
-         SECTION .rdata align=%1
-     %else
-         SECTION .rodata align=%1
-     %endif
- %endmacro
- 
--%if WIN64
--    %define PIC
--%elif ARCH_X86_64 == 0
--; x86_32 doesn't require PIC.
--; Some distros prefer shared objects to be PIC, but nothing breaks if
--; the code contains a few textrels, so we'll skip that complexity.
--    %undef PIC
--%endif
--%ifdef PIC
-+%if ARCH_X86_64
-+    %define PIC 1 ; always use PIC on x86-64
-     default rel
-+%elifidn __OUTPUT_FORMAT__,win32
-+    %define PIC 0 ; PIC isn't used on 32-bit Windows
-+%elifndef PIC
-+    %define PIC 0
- %endif
- 
--%macro CPUNOP 1
--    %if HAVE_CPUNOP
--        CPU %1
-+%define HAVE_PRIVATE_EXTERN 1
-+%ifdef __NASM_VERSION_ID__
-+    %use smartalign
-+    %if __NASM_VERSION_ID__ < 0x020e0000 ; 2.14
-+        %define HAVE_PRIVATE_EXTERN 0
-     %endif
--%endmacro
-+%endif
- 
- ; Macros to eliminate most code duplication between x86_32 and x86_64:
- ; Currently this works only for leaf functions which load all their arguments
- ; into registers at the start, and make no other use of the stack. Luckily that
--; covers most of x264's asm.
-+; covers most use cases.
- 
- ; PROLOGUE:
- ; %1 = number of arguments. loads them from stack if needed.
- ; %2 = number of registers used. pushes callee-saved regs if needed.
- ; %3 = number of xmm registers used. pushes callee-saved xmm regs if needed.
- ; %4 = (optional) stack size to be allocated. The stack will be aligned before
- ;      allocating the specified stack size. If the required stack alignment is
- ;      larger than the known stack alignment the stack will be manually aligned
-@@ -227,16 +231,28 @@ DECLARE_REG_SIZE bp, bpl, null
- DECLARE_REG_TMP_SIZE 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14
- 
- %if ARCH_X86_64
-     %define gprsize 8
- %else
-     %define gprsize 4
- %endif
- 
-+%macro LEA 2
-+%if ARCH_X86_64
-+    lea %1, [%2]
-+%elif PIC
-+    call $+5 ; special-cased to not affect the RSB on most CPU:s
-+    pop %1
-+    add %1, (%2)-$+1
-+%else
-+    mov %1, %2
-+%endif
-+%endmacro
-+
- ; Repeats an instruction/operation for multiple arguments.
- ; Example usage: "REPX {psrlw x, 8}, m0, m1, m2, m3"
- %macro REPX 2-* ; operation, args
-     %xdefine %%f(x) %1
-     %rep %0 - 1
-         %rotate 1
-         %%f(%1)
-     %endrep
-@@ -298,16 +314,20 @@ DECLARE_REG_TMP_SIZE 0,1,2,3,4,5,6,7,8,9
- %endmacro
- 
- %macro movifnidn 2
-     %ifnidn %1, %2
-         mov %1, %2
-     %endif
- %endmacro
- 
-+%if ARCH_X86_64 == 0
-+    %define movsxd movifnidn
-+%endif
-+
- %macro movsxdifnidn 2
-     %ifnidn %1, %2
-         movsxd %1, %2
-     %endif
- %endmacro
- 
- %macro ASSERT 1
-     %if (%1) == 0
-@@ -349,62 +369,100 @@ DECLARE_REG_TMP_SIZE 0,1,2,3,4,5,6,7,8,9
-     %xdefine stack_offset %%stack_offset
-     %assign n_arg_names %0
- %endmacro
- 
- %define required_stack_alignment ((mmsize + 15) & ~15)
- %define vzeroupper_required (mmsize > 16 && (ARCH_X86_64 == 0 || xmm_regs_used > 16 || notcpuflag(avx512)))
- %define high_mm_regs (16*cpuflag(avx512))
- 
--%macro ALLOC_STACK 1-2 0 ; stack_size, n_xmm_regs (for win64 only)
-+; Large stack allocations on Windows need to use stack probing in order
-+; to guarantee that all stack memory is committed before accessing it.
-+; This is done by ensuring that the guard page(s) at the end of the
-+; currently committed pages are touched prior to any pages beyond that.
-+%if WIN64
-+    %assign STACK_PROBE_SIZE 8192
-+%elifidn __OUTPUT_FORMAT__, win32
-+    %assign STACK_PROBE_SIZE 4096
-+%else
-+    %assign STACK_PROBE_SIZE 0
-+%endif
-+
-+%macro PROBE_STACK 1 ; stack_size
-+    %if STACK_PROBE_SIZE
-+        %assign %%i STACK_PROBE_SIZE
-+        %rep %1 / STACK_PROBE_SIZE
-+            mov eax, [rsp-%%i]
-+            %assign %%i %%i+STACK_PROBE_SIZE
-+        %endrep
-+    %endif
-+%endmacro
-+
-+%macro RESET_STACK_STATE 0
-+    %ifidn rstk, rsp
-+        %assign stack_offset stack_offset - stack_size_padded
-+    %else
-+        %xdefine rstk rsp
-+    %endif
-+    %assign stack_size 0
-+    %assign stack_size_padded 0
-+    %assign xmm_regs_used 0
-+%endmacro
-+
-+%macro ALLOC_STACK 0-2 0, 0 ; stack_size, n_xmm_regs
-+    RESET_STACK_STATE
-+    %ifnum %2
-+        %if mmsize != 8
-+            %assign xmm_regs_used %2
-+        %endif
-+    %endif
-     %ifnum %1
-         %if %1 != 0
-             %assign %%pad 0
-             %assign stack_size %1
-             %if stack_size < 0
-                 %assign stack_size -stack_size
-             %endif
-             %if WIN64
-                 %assign %%pad %%pad + 32 ; shadow space
--                %if mmsize != 8
--                    %assign xmm_regs_used %2
--                    %if xmm_regs_used > 8
--                        %assign %%pad %%pad + (xmm_regs_used-8)*16 ; callee-saved xmm registers
--                    %endif
-+                %if xmm_regs_used > 8
-+                    %assign %%pad %%pad + (xmm_regs_used-8)*16 ; callee-saved xmm registers
-                 %endif
-             %endif
-             %if required_stack_alignment <= STACK_ALIGNMENT
-                 ; maintain the current stack alignment
-                 %assign stack_size_padded stack_size + %%pad + ((-%%pad-stack_offset-gprsize) & (STACK_ALIGNMENT-1))
-+                PROBE_STACK stack_size_padded
-                 SUB rsp, stack_size_padded
-             %else
-                 %assign %%reg_num (regs_used - 1)
-                 %xdefine rstk r %+ %%reg_num
-                 ; align stack, and save original stack location directly above
-                 ; it, i.e. in [rsp+stack_size_padded], so we can restore the
-                 ; stack in a single instruction (i.e. mov rsp, rstk or mov
-                 ; rsp, [rsp+stack_size_padded])
-                 %if %1 < 0 ; need to store rsp on stack
-                     %xdefine rstkm [rsp + stack_size + %%pad]
-                     %assign %%pad %%pad + gprsize
-                 %else ; can keep rsp in rstk during whole function
-                     %xdefine rstkm rstk
-                 %endif
-                 %assign stack_size_padded stack_size + ((%%pad + required_stack_alignment-1) & ~(required_stack_alignment-1))
-+                PROBE_STACK stack_size_padded
-                 mov rstk, rsp
-                 and rsp, ~(required_stack_alignment-1)
-                 sub rsp, stack_size_padded
-                 movifnidn rstkm, rstk
-             %endif
-             WIN64_PUSH_XMM
-         %endif
-     %endif
- %endmacro
- 
--%macro SETUP_STACK_POINTER 1
-+%macro SETUP_STACK_POINTER 0-1 0
-     %ifnum %1
-         %if %1 != 0 && required_stack_alignment > STACK_ALIGNMENT
-             %if %1 > 0
-                 ; Reserve an additional register for storing the original stack pointer, but avoid using
-                 ; eax/rax for this purpose since it can potentially get overwritten as a return value.
-                 %assign regs_used (regs_used + 1)
-                 %if ARCH_X86_64 && regs_used == 7
-                     %assign regs_used 8
-@@ -457,45 +515,72 @@ DECLARE_REG 14, R13, 120
-         %else
-             DEFINE_ARGS %4, %5
-         %endif
-     %elifnnum %4
-         DEFINE_ARGS %4
-     %endif
- %endmacro
- 
--%macro WIN64_PUSH_XMM 0
--    ; Use the shadow space to store XMM6 and XMM7, the rest needs stack space allocated.
--    %if xmm_regs_used > 6 + high_mm_regs
--        movaps [rstk + stack_offset +  8], xmm6
--    %endif
--    %if xmm_regs_used > 7 + high_mm_regs
--        movaps [rstk + stack_offset + 24], xmm7
--    %endif
--    %assign %%xmm_regs_on_stack xmm_regs_used - high_mm_regs - 8
--    %if %%xmm_regs_on_stack > 0
--        %assign %%i 8
--        %rep %%xmm_regs_on_stack
--            movaps [rsp + (%%i-8)*16 + stack_size + 32], xmm %+ %%i
--            %assign %%i %%i+1
--        %endrep
-+; Push XMM registers to the stack. If no argument is specified all used register
-+; will be pushed, otherwise only push previously unpushed registers.
-+%macro WIN64_PUSH_XMM 0-2 ; new_xmm_regs_used, xmm_regs_pushed
-+    %if mmsize != 8
-+        %if %0 == 2
-+            %assign %%pushed %2
-+            %assign xmm_regs_used %1
-+        %elif %0 == 1
-+            %assign %%pushed xmm_regs_used
-+            %assign xmm_regs_used %1
-+        %else
-+            %assign %%pushed 0
-+        %endif
-+        ; Use the shadow space to store XMM6 and XMM7, the rest needs stack space allocated.
-+        %if %%pushed <= 6 + high_mm_regs && xmm_regs_used > 6 + high_mm_regs
-+            movaps [rstk + stack_offset +  8], xmm6
-+        %endif
-+        %if %%pushed <= 7 + high_mm_regs && xmm_regs_used > 7 + high_mm_regs
-+            movaps [rstk + stack_offset + 24], xmm7
-+        %endif
-+        %assign %%pushed %%pushed - high_mm_regs - 8
-+        %if %%pushed < 0
-+            %assign %%pushed 0
-+        %endif
-+        %assign %%regs_to_push xmm_regs_used - %%pushed - high_mm_regs - 8
-+        %if %%regs_to_push > 0
-+            ASSERT (%%regs_to_push + %%pushed) * 16 <= stack_size_padded - stack_size - 32
-+            %assign %%i %%pushed + 8
-+            %rep %%regs_to_push
-+                movaps [rsp + (%%i-8)*16 + stack_size + 32], xmm %+ %%i
-+                %assign %%i %%i+1
-+            %endrep
-+        %endif
-     %endif
- %endmacro
- 
--%macro WIN64_SPILL_XMM 1
--    %assign xmm_regs_used %1
--    ASSERT xmm_regs_used <= 16 + high_mm_regs
--    %assign %%xmm_regs_on_stack xmm_regs_used - high_mm_regs - 8
--    %if %%xmm_regs_on_stack > 0
--        ; Allocate stack space for callee-saved xmm registers plus shadow space and align the stack.
--        %assign %%pad %%xmm_regs_on_stack*16 + 32
--        %assign stack_size_padded %%pad + ((-%%pad-stack_offset-gprsize) & (STACK_ALIGNMENT-1))
--        SUB rsp, stack_size_padded
-+; Allocated stack space for XMM registers and push all, or a subset, of those
-+%macro WIN64_SPILL_XMM 1-2 ; xmm_regs_used, xmm_regs_reserved
-+    RESET_STACK_STATE
-+    %if mmsize != 8
-+        %assign xmm_regs_used %1
-+        ASSERT xmm_regs_used <= 16 + high_mm_regs
-+        %if %0 == 2
-+            ASSERT %2 >= %1
-+            %assign %%xmm_regs_on_stack %2 - high_mm_regs - 8
-+        %else
-+            %assign %%xmm_regs_on_stack %1 - high_mm_regs - 8
-+        %endif
-+        %if %%xmm_regs_on_stack > 0
-+            ; Allocate stack space for callee-saved xmm registers plus shadow space and align the stack.
-+            %assign %%pad %%xmm_regs_on_stack*16 + 32
-+            %assign stack_size_padded %%pad + ((-%%pad-stack_offset-gprsize) & (STACK_ALIGNMENT-1))
-+            SUB rsp, stack_size_padded
-+        %endif
-+        WIN64_PUSH_XMM
-     %endif
--    WIN64_PUSH_XMM
- %endmacro
- 
- %macro WIN64_RESTORE_XMM_INTERNAL 0
-     %assign %%pad_size 0
-     %assign %%xmm_regs_on_stack xmm_regs_used - high_mm_regs - 8
-     %if %%xmm_regs_on_stack > 0
-         %assign %%i xmm_regs_used - high_mm_regs
-         %rep %%xmm_regs_on_stack
-@@ -516,19 +601,17 @@ DECLARE_REG 14, R13, 120
-     %endif
-     %if xmm_regs_used > 6 + high_mm_regs
-         movaps xmm6, [rsp + stack_offset - %%pad_size +  8]
-     %endif
- %endmacro
- 
- %macro WIN64_RESTORE_XMM 0
-     WIN64_RESTORE_XMM_INTERNAL
--    %assign stack_offset (stack_offset-stack_size_padded)
--    %assign stack_size_padded 0
--    %assign xmm_regs_used 0
-+    RESET_STACK_STATE
- %endmacro
- 
- %define has_epilogue regs_used > 7 || stack_size > 0 || vzeroupper_required || xmm_regs_used > 6+high_mm_regs
- 
- %macro RET 0
-     WIN64_RESTORE_XMM_INTERNAL
-     POP_IF_USED 14, 13, 12, 11, 10, 9, 8, 7
-     %if vzeroupper_required
-@@ -553,22 +636,21 @@ DECLARE_REG 10, rbp, 40
- DECLARE_REG 11, R14, 48
- DECLARE_REG 12, R15, 56
- DECLARE_REG 13, R12, 64
- DECLARE_REG 14, R13, 72
- 
- %macro PROLOGUE 2-5+ 0, 0 ; #args, #regs, #xmm_regs, [stack_size,] arg_names...
-     %assign num_args %1
-     %assign regs_used %2
--    %assign xmm_regs_used %3
-     ASSERT regs_used >= num_args
-     SETUP_STACK_POINTER %4
-     ASSERT regs_used <= 15
-     PUSH_IF_USED 9, 10, 11, 12, 13, 14
--    ALLOC_STACK %4
-+    ALLOC_STACK %4, %3
-     LOAD_IF_USED 6, 7, 8, 9, 10, 11, 12, 13, 14
-     %if %0 > 4
-         %ifnum %4
-             DEFINE_ARGS %5
-         %else
-             DEFINE_ARGS %4, %5
-         %endif
-     %elifnnum %4
-@@ -622,17 +704,17 @@ DECLARE_ARG 7, 8, 9, 10, 11, 12, 13, 14
-         %assign num_args 7
-     %endif
-     %if regs_used > 7
-         %assign regs_used 7
-     %endif
-     SETUP_STACK_POINTER %4
-     ASSERT regs_used <= 7
-     PUSH_IF_USED 3, 4, 5, 6
--    ALLOC_STACK %4
-+    ALLOC_STACK %4, %3
-     LOAD_IF_USED 0, 1, 2, 3, 4, 5, 6
-     %if %0 > 4
-         %ifnum %4
-             DEFINE_ARGS %5
-         %else
-             DEFINE_ARGS %4, %5
-         %endif
-     %elifnnum %4
-@@ -655,21 +737,29 @@ DECLARE_ARG 7, 8, 9, 10, 11, 12, 13, 14
-         vzeroupper
-     %endif
-     AUTO_REP_RET
- %endmacro
- 
- %endif ;======================================================================
- 
- %if WIN64 == 0
--    %macro WIN64_SPILL_XMM 1
-+    %macro WIN64_SPILL_XMM 1-2
-+        RESET_STACK_STATE
-+        %if mmsize != 8
-+            %assign xmm_regs_used %1
-+        %endif
-     %endmacro
-     %macro WIN64_RESTORE_XMM 0
-+        RESET_STACK_STATE
-     %endmacro
--    %macro WIN64_PUSH_XMM 0
-+    %macro WIN64_PUSH_XMM 0-2
-+        %if mmsize != 8 && %0 >= 1
-+            %assign xmm_regs_used %1
-+        %endif
-     %endmacro
- %endif
- 
- ; On AMD cpus <=K10, an ordinary ret is slow if it immediately follows either
- ; a branch or a branch target. So switch to a 2-byte form of ret in that case.
- ; We can automatically detect "follows a branch", but not a branch target.
- ; (SSSE3 is a sufficient condition to know that your cpu doesn't have this problem.)
- %macro REP_RET 0
-@@ -700,17 +790,17 @@ DECLARE_ARG 7, 8, 9, 10, 11, 12, 13, 14
-             %endif
-         %endmacro
-         %rotate 1
-     %endrep
- %endmacro
- 
- BRANCH_INSTR jz, je, jnz, jne, jl, jle, jnl, jnle, jg, jge, jng, jnge, ja, jae, jna, jnae, jb, jbe, jnb, jnbe, jc, jnc, js, jns, jo, jno, jp, jnp
- 
--%macro TAIL_CALL 2 ; callee, is_nonadjacent
-+%macro TAIL_CALL 1-2 1 ; callee, is_nonadjacent
-     %if has_epilogue
-         call %1
-         RET
-     %elif %2
-         jmp %1
-     %endif
-     annotate_function_size
- %endmacro
-@@ -730,32 +820,35 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, 
- %macro cglobal 1-2+ "" ; name, [PROLOGUE args]
-     cglobal_internal 1, %1 %+ SUFFIX, %2
- %endmacro
- %macro cvisible 1-2+ "" ; name, [PROLOGUE args]
-     cglobal_internal 0, %1 %+ SUFFIX, %2
- %endmacro
- %macro cglobal_internal 2-3+
-     annotate_function_size
--    %if %1
--        %xdefine %%FUNCTION_PREFIX private_prefix
--        %xdefine %%VISIBILITY hidden
--    %else
--        %xdefine %%FUNCTION_PREFIX public_prefix
--        %xdefine %%VISIBILITY
--    %endif
-     %ifndef cglobaled_%2
--        %xdefine %2 mangle(%%FUNCTION_PREFIX %+ _ %+ %2)
-+        %if %1
-+            %xdefine %2 mangle(private_prefix %+ _ %+ %2)
-+        %else
-+            %xdefine %2 mangle(public_prefix %+ _ %+ %2)
-+        %endif
-         %xdefine %2.skip_prologue %2 %+ .skip_prologue
-         CAT_XDEFINE cglobaled_, %2, 1
-     %endif
-     %xdefine current_function %2
-     %xdefine current_function_section __SECT__
-     %if FORMAT_ELF
--        global %2:function %%VISIBILITY
-+        %if %1
-+            global %2:function hidden
-+        %else
-+            global %2:function
-+        %endif
-+    %elif FORMAT_MACHO && HAVE_PRIVATE_EXTERN && %1
-+        global %2:private_extern
-     %else
-         global %2
-     %endif
-     align function_align
-     %2:
-     RESET_MM_PERMUTATION        ; needed for x86-64, also makes disassembly somewhat nicer
-     %xdefine rstk rsp           ; copy of the original stack pointer, used when greater alignment than the known stack alignment is required
-     %assign stack_offset 0      ; stack pointer offset relative to the return address
-@@ -766,16 +859,18 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, 
-         PROLOGUE %3
-     %endif
- %endmacro
- 
- ; Create a global symbol from a local label with the correct name mangling and type
- %macro cglobal_label 1
-     %if FORMAT_ELF
-         global current_function %+ %1:function hidden
-+    %elif FORMAT_MACHO && HAVE_PRIVATE_EXTERN
-+        global current_function %+ %1:private_extern
-     %else
-         global current_function %+ %1
-     %endif
-     %1:
- %endmacro
- 
- %macro cextern 1
-     %xdefine %1 mangle(private_prefix %+ _ %+ %1)
-@@ -791,25 +886,44 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, 
-     CAT_XDEFINE cglobaled_, %1, 1
-     extern %1
- %endmacro
- 
- %macro const 1-2+
-     %xdefine %1 mangle(private_prefix %+ _ %+ %1)
-     %if FORMAT_ELF
-         global %1:data hidden
-+    %elif FORMAT_MACHO && HAVE_PRIVATE_EXTERN
-+        global %1:private_extern
-     %else
-         global %1
-     %endif
-     %1: %2
- %endmacro
- 
--; This is needed for ELF, otherwise the GNU linker assumes the stack is executable by default.
- %if FORMAT_ELF
-+    ; The GNU linker assumes the stack is executable by default.
-     [SECTION .note.GNU-stack noalloc noexec nowrite progbits]
-+
-+    %ifdef __NASM_VERSION_ID__
-+        %if __NASM_VERSION_ID__ >= 0x020e0300 ; 2.14.03
-+            %if ARCH_X86_64
-+                ; Control-flow Enforcement Technology (CET) properties.
-+                [SECTION .note.gnu.property alloc noexec nowrite note align=gprsize]
-+                dd 0x00000004  ; n_namesz
-+                dd gprsize + 8 ; n_descsz
-+                dd 0x00000005  ; n_type = NT_GNU_PROPERTY_TYPE_0
-+                db "GNU",0     ; n_name
-+                dd 0xc0000002  ; pr_type = GNU_PROPERTY_X86_FEATURE_1_AND
-+                dd 0x00000004  ; pr_datasz
-+                dd 0x00000002  ; pr_data = GNU_PROPERTY_X86_FEATURE_1_SHSTK
-+                dd 0x00000000  ; pr_padding
-+            %endif
-+        %endif
-+    %endif
- %endif
- 
- ; Tell debuggers how large the function was.
- ; This may be invoked multiple times per function; we rely on later instances overriding earlier ones.
- ; This is invoked by RET and similar macros, and also cglobal does it for the previous function,
- ; but if the last function in a source file doesn't use any of the standard macros for its epilogue,
- ; then its size might be unspecified.
- %macro annotate_function_size 0
-@@ -823,42 +937,44 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, 
-             %endif
-         %endif
-     %endif
- %endmacro
- 
- ; cpuflags
- 
- %assign cpuflags_mmx       (1<<0)
--%assign cpuflags_mmx2      (1<<1) | cpuflags_mmx
--%assign cpuflags_3dnow     (1<<2) | cpuflags_mmx
--%assign cpuflags_3dnowext  (1<<3) | cpuflags_3dnow
--%assign cpuflags_sse       (1<<4) | cpuflags_mmx2
--%assign cpuflags_sse2      (1<<5) | cpuflags_sse
--%assign cpuflags_sse2slow  (1<<6) | cpuflags_sse2
--%assign cpuflags_lzcnt     (1<<7) | cpuflags_sse2
--%assign cpuflags_sse3      (1<<8) | cpuflags_sse2
--%assign cpuflags_ssse3     (1<<9) | cpuflags_sse3
--%assign cpuflags_sse4      (1<<10)| cpuflags_ssse3
--%assign cpuflags_sse42     (1<<11)| cpuflags_sse4
--%assign cpuflags_aesni     (1<<12)| cpuflags_sse42
--%assign cpuflags_avx       (1<<13)| cpuflags_sse42
--%assign cpuflags_xop       (1<<14)| cpuflags_avx
--%assign cpuflags_fma4      (1<<15)| cpuflags_avx
--%assign cpuflags_fma3      (1<<16)| cpuflags_avx
--%assign cpuflags_bmi1      (1<<17)| cpuflags_avx|cpuflags_lzcnt
--%assign cpuflags_bmi2      (1<<18)| cpuflags_bmi1
--%assign cpuflags_avx2      (1<<19)| cpuflags_fma3|cpuflags_bmi2
--%assign cpuflags_avx512    (1<<20)| cpuflags_avx2 ; F, CD, BW, DQ, VL
--%assign cpuflags_avx512icl (1<<25)| cpuflags_avx512
-+%assign cpuflags_mmx2      (1<<1)  | cpuflags_mmx
-+%assign cpuflags_3dnow     (1<<2)  | cpuflags_mmx
-+%assign cpuflags_3dnowext  (1<<3)  | cpuflags_3dnow
-+%assign cpuflags_sse       (1<<4)  | cpuflags_mmx2
-+%assign cpuflags_sse2      (1<<5)  | cpuflags_sse
-+%assign cpuflags_sse2slow  (1<<6)  | cpuflags_sse2
-+%assign cpuflags_lzcnt     (1<<7)  | cpuflags_sse2
-+%assign cpuflags_sse3      (1<<8)  | cpuflags_sse2
-+%assign cpuflags_ssse3     (1<<9)  | cpuflags_sse3
-+%assign cpuflags_sse4      (1<<10) | cpuflags_ssse3
-+%assign cpuflags_sse42     (1<<11) | cpuflags_sse4
-+%assign cpuflags_aesni     (1<<12) | cpuflags_sse42
-+%assign cpuflags_clmul     (1<<13) | cpuflags_sse42
-+%assign cpuflags_gfni      (1<<14) | cpuflags_aesni|cpuflags_clmul
-+%assign cpuflags_avx       (1<<15) | cpuflags_sse42
-+%assign cpuflags_xop       (1<<16) | cpuflags_avx
-+%assign cpuflags_fma4      (1<<17) | cpuflags_avx
-+%assign cpuflags_fma3      (1<<18) | cpuflags_avx
-+%assign cpuflags_bmi1      (1<<19) | cpuflags_avx|cpuflags_lzcnt
-+%assign cpuflags_bmi2      (1<<20) | cpuflags_bmi1
-+%assign cpuflags_avx2      (1<<21) | cpuflags_fma3|cpuflags_bmi2
-+%assign cpuflags_avx512    (1<<22) | cpuflags_avx2 ; F, CD, BW, DQ, VL
-+%assign cpuflags_avx512icl (1<<23) | cpuflags_avx512|cpuflags_gfni ; VNNI, IFMA, VBMI, VBMI2, VPOPCNTDQ, BITALG, VAES, VPCLMULQDQ
- 
--%assign cpuflags_cache32   (1<<21)
--%assign cpuflags_cache64   (1<<22)
--%assign cpuflags_aligned   (1<<23) ; not a cpu feature, but a function variant
--%assign cpuflags_atom      (1<<24)
-+%assign cpuflags_cache32   (1<<24)
-+%assign cpuflags_cache64   (1<<25)
-+%assign cpuflags_aligned   (1<<26) ; not a cpu feature, but a function variant
-+%assign cpuflags_atom      (1<<27)
- 
- ; Returns a boolean value expressing whether or not the specified cpuflag is enabled.
- %define    cpuflag(x) (((((cpuflags & (cpuflags_ %+ x)) ^ (cpuflags_ %+ x)) - 1) >> 31) & 1)
- %define notcpuflag(x) (cpuflag(x) ^ 1)
- 
- ; Takes an arbitrary number of cpuflags from the above list.
- ; All subsequent functions (up to the next INIT_CPUFLAGS) is built for the specified cpu.
- ; You shouldn't need to invoke this macro directly, it's a subroutine for INIT_MMX &co.
-@@ -890,19 +1006,27 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, 
-         %if cpuflag(aligned)
-             %define movu mova
-         %elif cpuflag(sse3) && notcpuflag(ssse3)
-             %define movu lddqu
-         %endif
-     %endif
- 
-     %if ARCH_X86_64 || cpuflag(sse2)
--        CPUNOP amdnop
-+        %ifdef __NASM_VERSION_ID__
-+            ALIGNMODE p6
-+        %else
-+            CPU amdnop
-+        %endif
-     %else
--        CPUNOP basicnop
-+        %ifdef __NASM_VERSION_ID__
-+            ALIGNMODE nop
-+        %else
-+            CPU basicnop
-+        %endif
-     %endif
- %endmacro
- 
- ; Merge mmx, sse*, and avx*
- ; m# is a simd register of the currently selected size
- ; xm# is the corresponding xmm register if mmsize >= 16, otherwise the same as m#
- ; ym# is the corresponding ymm register if mmsize >= 32, otherwise the same as m#
- ; zm# is the corresponding zmm register if mmsize >= 64, otherwise the same as m#
-@@ -966,54 +1090,63 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, 
-     %define movu movq
-     %define movh movd
-     %define movnta movntq
-     INIT_CPUFLAGS %1
-     DEFINE_MMREGS mm
- %endmacro
- 
- %macro INIT_XMM 0-1+
--    %assign avx_enabled 0
-+    %assign avx_enabled FORCE_VEX_ENCODING
-     %define RESET_MM_PERMUTATION INIT_XMM %1
-     %define mmsize 16
-     %define mova movdqa
-     %define movu movdqu
-     %define movh movq
-     %define movnta movntdq
-     INIT_CPUFLAGS %1
-     DEFINE_MMREGS xmm
-     %if WIN64
-         AVX512_MM_PERMUTATION 6 ; Swap callee-saved registers with volatile registers
-     %endif
-+    %xdefine bcstw 1to8
-+    %xdefine bcstd 1to4
-+    %xdefine bcstq 1to2
- %endmacro
- 
- %macro INIT_YMM 0-1+
-     %assign avx_enabled 1
-     %define RESET_MM_PERMUTATION INIT_YMM %1
-     %define mmsize 32
-     %define mova movdqa
-     %define movu movdqu
-     %undef movh
-     %define movnta movntdq
-     INIT_CPUFLAGS %1
-     DEFINE_MMREGS ymm
-     AVX512_MM_PERMUTATION
-+    %xdefine bcstw 1to16
-+    %xdefine bcstd 1to8
-+    %xdefine bcstq 1to4
- %endmacro
- 
- %macro INIT_ZMM 0-1+
-     %assign avx_enabled 1
-     %define RESET_MM_PERMUTATION INIT_ZMM %1
-     %define mmsize 64
-     %define mova movdqa
-     %define movu movdqu
-     %undef movh
-     %define movnta movntdq
-     INIT_CPUFLAGS %1
-     DEFINE_MMREGS zmm
-     AVX512_MM_PERMUTATION
-+    %xdefine bcstw 1to32
-+    %xdefine bcstd 1to16
-+    %xdefine bcstq 1to8
- %endmacro
- 
- INIT_XMM
- 
- %macro DECLARE_MMCAST 1
-     %define  mmmm%1   mm%1
-     %define  mmxmm%1  mm%1
-     %define  mmymm%1  mm%1
-@@ -1101,28 +1234,41 @@ INIT_XMM
- %macro SAVE_MM_PERMUTATION 0-1
-     %if %0
-         %xdefine %%f %1_m
-     %else
-         %xdefine %%f current_function %+ _m
-     %endif
-     %assign %%i 0
-     %rep num_mmregs
--        CAT_XDEFINE %%f, %%i, m %+ %%i
-+        %xdefine %%tmp m %+ %%i
-+        CAT_XDEFINE %%f, %%i, regnumof %+ %%tmp
-         %assign %%i %%i+1
-     %endrep
- %endmacro
- 
--%macro LOAD_MM_PERMUTATION 1 ; name to load from
--    %ifdef %1_m0
-+%macro LOAD_MM_PERMUTATION 0-1 ; name to load from
-+    %if %0
-+        %xdefine %%f %1_m
-+    %else
-+        %xdefine %%f current_function %+ _m
-+    %endif
-+    %xdefine %%tmp %%f %+ 0
-+    %ifnum %%tmp
-+        DEFINE_MMREGS mmtype
-         %assign %%i 0
-         %rep num_mmregs
--            CAT_XDEFINE m, %%i, %1_m %+ %%i
-+            %xdefine %%tmp %%f %+ %%i
-+            CAT_XDEFINE %%m, %%i, m %+ %%tmp
-+            %assign %%i %%i+1
-+        %endrep
-+        %rep num_mmregs
-+            %assign %%i %%i-1
-+            CAT_XDEFINE m, %%i, %%m %+ %%i
-             CAT_XDEFINE nn, m %+ %%i, %%i
--            %assign %%i %%i+1
-         %endrep
-     %endif
- %endmacro
- 
- ; Append cpuflags to the callee's name iff the appended name is known and the plain name isn't
- %macro call 1
-     %ifid %1
-         call_internal %1 %+ SUFFIX, %1
-@@ -1219,18 +1365,32 @@ INIT_XMM
-         %if %0 >= 8+%4
-             %assign __emulate_avx 1
-         %endif
-     %endif
-     %ifnidn %2, fnord
-         %ifdef cpuname
-             %if notcpuflag(%2)
-                 %error use of ``%1'' %2 instruction in cpuname function: current_function
--            %elif cpuflags_%2 < cpuflags_sse && notcpuflag(sse2) && __sizeofreg > 8
-+            %elif %3 == 0 && __sizeofreg == 16 && notcpuflag(sse2)
-                 %error use of ``%1'' sse2 instruction in cpuname function: current_function
-+            %elif %3 == 0 && __sizeofreg == 32 && notcpuflag(avx2)
-+                %error use of ``%1'' avx2 instruction in cpuname function: current_function
-+            %elif __sizeofreg == 16 && notcpuflag(sse)
-+                %error use of ``%1'' sse instruction in cpuname function: current_function
-+            %elif __sizeofreg == 32 && notcpuflag(avx)
-+                %error use of ``%1'' avx instruction in cpuname function: current_function
-+            %elif __sizeofreg == 64 && notcpuflag(avx512)
-+                %error use of ``%1'' avx512 instruction in cpuname function: current_function
-+            %elifidn %1, pextrw ; special case because the base instruction is mmx2,
-+                %ifnid %6       ; but sse4 is required for memory operands
-+                    %if notcpuflag(sse4)
-+                        %error use of ``%1'' sse4 instruction in cpuname function: current_function
-+                    %endif
-+                %endif
-             %endif
-         %endif
-     %endif
- 
-     %if __emulate_avx
-         %xdefine __src1 %7
-         %xdefine __src2 %8
-         %if %5 && %4 == 0
-@@ -1262,21 +1422,89 @@ INIT_XMM
-             %endif
-         %endif
-         %if %0 >= 9
-             %1 %6, __src2, %9
-         %else
-             %1 %6, __src2
-         %endif
-     %elif %0 >= 9
--        __instr %6, %7, %8, %9
-+        %if avx_enabled && __sizeofreg >= 16 && %4 == 1
-+            %ifnnum regnumof%7
-+                %if %3
-+                    vmovaps %6, %7
-+                %else
-+                    vmovdqa %6, %7
-+                %endif
-+                __instr %6, %6, %8, %9
-+            %else
-+                __instr %6, %7, %8, %9
-+            %endif
-+        %else
-+            __instr %6, %7, %8, %9
-+        %endif
-     %elif %0 == 8
--        __instr %6, %7, %8
-+        %if avx_enabled && __sizeofreg >= 16 && %4 == 0
-+            %xdefine __src1 %7
-+            %xdefine __src2 %8
-+            %if %5
-+                %ifnum regnumof%7
-+                    %ifnum regnumof%8
-+                        %if regnumof%7 < 8 && regnumof%8 >= 8 && regnumof%8 < 16 && sizeof%8 <= 32
-+                            ; Most VEX-encoded instructions require an additional byte to encode when
-+                            ; src2 is a high register (e.g. m8..15). If the instruction is commutative
-+                            ; we can swap src1 and src2 when doing so reduces the instruction length.
-+                            %xdefine __src1 %8
-+                            %xdefine __src2 %7
-+                        %endif
-+                    %endif
-+                %elifnum regnumof%8 ; put memory operands in src2 when possible
-+                    %xdefine __src1 %8
-+                    %xdefine __src2 %7
-+                %else
-+                    %assign __emulate_avx 1
-+                %endif
-+            %elifnnum regnumof%7
-+                ; EVEX allows imm8 shift instructions to be used with memory operands,
-+                ; but VEX does not. This handles those special cases.
-+                %ifnnum %8
-+                    %assign __emulate_avx 1
-+                %elif notcpuflag(avx512)
-+                    %assign __emulate_avx 1
-+                %endif
-+            %endif
-+            %if __emulate_avx ; a separate load is required
-+                %if %3
-+                    vmovaps %6, %7
-+                %else
-+                    vmovdqa %6, %7
-+                %endif
-+                __instr %6, %6, %8
-+            %else
-+                __instr %6, __src1, __src2
-+            %endif
-+        %else
-+            __instr %6, %7, %8
-+        %endif
-     %elif %0 == 7
--        __instr %6, %7
-+        %if avx_enabled && __sizeofreg >= 16 && %5
-+            %xdefine __src1 %6
-+            %xdefine __src2 %7
-+            %ifnum regnumof%6
-+                %ifnum regnumof%7
-+                    %if regnumof%6 < 8 && regnumof%7 >= 8 && regnumof%7 < 16 && sizeof%7 <= 32
-+                        %xdefine __src1 %7
-+                        %xdefine __src2 %6
-+                    %endif
-+                %endif
-+            %endif
-+            __instr %6, __src1, __src2
-+        %else
-+            __instr %6, %7
-+        %endif
-     %else
-         __instr %6
-     %endif
- %endmacro
- 
- ;%1 == instruction
- ;%2 == minimal instruction set
- ;%3 == 1 if float, 0 if int
-@@ -1313,18 +1541,18 @@ AVX_INSTR aesenclast, aesni, 0, 0, 0
- AVX_INSTR aesimc, aesni
- AVX_INSTR aeskeygenassist, aesni
- AVX_INSTR andnpd, sse2, 1, 0, 0
- AVX_INSTR andnps, sse, 1, 0, 0
- AVX_INSTR andpd, sse2, 1, 0, 1
- AVX_INSTR andps, sse, 1, 0, 1
- AVX_INSTR blendpd, sse4, 1, 1, 0
- AVX_INSTR blendps, sse4, 1, 1, 0
--AVX_INSTR blendvpd, sse4 ; can't be emulated
--AVX_INSTR blendvps, sse4 ; can't be emulated
-+AVX_INSTR blendvpd, sse4, 1, 1, 0 ; last operand must be xmm0 with legacy encoding
-+AVX_INSTR blendvps, sse4, 1, 1, 0 ; last operand must be xmm0 with legacy encoding
- AVX_INSTR cmpeqpd, sse2, 1, 0, 1
- AVX_INSTR cmpeqps, sse, 1, 0, 1
- AVX_INSTR cmpeqsd, sse2, 1, 0, 0
- AVX_INSTR cmpeqss, sse, 1, 0, 0
- AVX_INSTR cmplepd, sse2, 1, 0, 0
- AVX_INSTR cmpleps, sse, 1, 0, 0
- AVX_INSTR cmplesd, sse2, 1, 0, 0
- AVX_INSTR cmpless, sse, 1, 0, 0
-@@ -1351,246 +1579,282 @@ AVX_INSTR cmpordss, sse 1, 0, 0
- AVX_INSTR cmppd, sse2, 1, 1, 0
- AVX_INSTR cmpps, sse, 1, 1, 0
- AVX_INSTR cmpsd, sse2, 1, 1, 0
- AVX_INSTR cmpss, sse, 1, 1, 0
- AVX_INSTR cmpunordpd, sse2, 1, 0, 1
- AVX_INSTR cmpunordps, sse, 1, 0, 1
- AVX_INSTR cmpunordsd, sse2, 1, 0, 0
- AVX_INSTR cmpunordss, sse, 1, 0, 0
--AVX_INSTR comisd, sse2
--AVX_INSTR comiss, sse
--AVX_INSTR cvtdq2pd, sse2
--AVX_INSTR cvtdq2ps, sse2
--AVX_INSTR cvtpd2dq, sse2
--AVX_INSTR cvtpd2ps, sse2
--AVX_INSTR cvtps2dq, sse2
--AVX_INSTR cvtps2pd, sse2
--AVX_INSTR cvtsd2si, sse2
-+AVX_INSTR comisd, sse2, 1
-+AVX_INSTR comiss, sse, 1
-+AVX_INSTR cvtdq2pd, sse2, 1
-+AVX_INSTR cvtdq2ps, sse2, 1
-+AVX_INSTR cvtpd2dq, sse2, 1
-+AVX_INSTR cvtpd2ps, sse2, 1
-+AVX_INSTR cvtps2dq, sse2, 1
-+AVX_INSTR cvtps2pd, sse2, 1
-+AVX_INSTR cvtsd2si, sse2, 1
- AVX_INSTR cvtsd2ss, sse2, 1, 0, 0
- AVX_INSTR cvtsi2sd, sse2, 1, 0, 0
- AVX_INSTR cvtsi2ss, sse, 1, 0, 0
- AVX_INSTR cvtss2sd, sse2, 1, 0, 0
--AVX_INSTR cvtss2si, sse
--AVX_INSTR cvttpd2dq, sse2
--AVX_INSTR cvttps2dq, sse2
--AVX_INSTR cvttsd2si, sse2
--AVX_INSTR cvttss2si, sse
-+AVX_INSTR cvtss2si, sse, 1
-+AVX_INSTR cvttpd2dq, sse2, 1
-+AVX_INSTR cvttps2dq, sse2, 1
-+AVX_INSTR cvttsd2si, sse2, 1
-+AVX_INSTR cvttss2si, sse, 1
- AVX_INSTR divpd, sse2, 1, 0, 0
- AVX_INSTR divps, sse, 1, 0, 0
- AVX_INSTR divsd, sse2, 1, 0, 0
- AVX_INSTR divss, sse, 1, 0, 0
- AVX_INSTR dppd, sse4, 1, 1, 0
- AVX_INSTR dpps, sse4, 1, 1, 0
--AVX_INSTR extractps, sse4
-+AVX_INSTR extractps, sse4, 1
-+AVX_INSTR gf2p8affineinvqb, gfni, 0, 1, 0
-+AVX_INSTR gf2p8affineqb, gfni, 0, 1, 0
-+AVX_INSTR gf2p8mulb, gfni, 0, 0, 0
- AVX_INSTR haddpd, sse3, 1, 0, 0
- AVX_INSTR haddps, sse3, 1, 0, 0
- AVX_INSTR hsubpd, sse3, 1, 0, 0
- AVX_INSTR hsubps, sse3, 1, 0, 0
- AVX_INSTR insertps, sse4, 1, 1, 0
- AVX_INSTR lddqu, sse3
--AVX_INSTR ldmxcsr, sse
-+AVX_INSTR ldmxcsr, sse, 1
- AVX_INSTR maskmovdqu, sse2
- AVX_INSTR maxpd, sse2, 1, 0, 1
- AVX_INSTR maxps, sse, 1, 0, 1
- AVX_INSTR maxsd, sse2, 1, 0, 0
- AVX_INSTR maxss, sse, 1, 0, 0
- AVX_INSTR minpd, sse2, 1, 0, 1
- AVX_INSTR minps, sse, 1, 0, 1
- AVX_INSTR minsd, sse2, 1, 0, 0
- AVX_INSTR minss, sse, 1, 0, 0
--AVX_INSTR movapd, sse2
--AVX_INSTR movaps, sse
-+AVX_INSTR movapd, sse2, 1
-+AVX_INSTR movaps, sse, 1
- AVX_INSTR movd, mmx
--AVX_INSTR movddup, sse3
-+AVX_INSTR movddup, sse3, 1
- AVX_INSTR movdqa, sse2
- AVX_INSTR movdqu, sse2
- AVX_INSTR movhlps, sse, 1, 0, 0
- AVX_INSTR movhpd, sse2, 1, 0, 0
- AVX_INSTR movhps, sse, 1, 0, 0
- AVX_INSTR movlhps, sse, 1, 0, 0
- AVX_INSTR movlpd, sse2, 1, 0, 0
- AVX_INSTR movlps, sse, 1, 0, 0
--AVX_INSTR movmskpd, sse2
--AVX_INSTR movmskps, sse
-+AVX_INSTR movmskpd, sse2, 1
-+AVX_INSTR movmskps, sse, 1
- AVX_INSTR movntdq, sse2
- AVX_INSTR movntdqa, sse4
--AVX_INSTR movntpd, sse2
--AVX_INSTR movntps, sse
-+AVX_INSTR movntpd, sse2, 1
-+AVX_INSTR movntps, sse, 1
- AVX_INSTR movq, mmx
- AVX_INSTR movsd, sse2, 1, 0, 0
--AVX_INSTR movshdup, sse3
--AVX_INSTR movsldup, sse3
-+AVX_INSTR movshdup, sse3, 1
-+AVX_INSTR movsldup, sse3, 1
- AVX_INSTR movss, sse, 1, 0, 0
--AVX_INSTR movupd, sse2
--AVX_INSTR movups, sse
-+AVX_INSTR movupd, sse2, 1
-+AVX_INSTR movups, sse, 1
- AVX_INSTR mpsadbw, sse4, 0, 1, 0
- AVX_INSTR mulpd, sse2, 1, 0, 1
- AVX_INSTR mulps, sse, 1, 0, 1
- AVX_INSTR mulsd, sse2, 1, 0, 0
- AVX_INSTR mulss, sse, 1, 0, 0
- AVX_INSTR orpd, sse2, 1, 0, 1
- AVX_INSTR orps, sse, 1, 0, 1
- AVX_INSTR pabsb, ssse3
- AVX_INSTR pabsd, ssse3
- AVX_INSTR pabsw, ssse3
-+AVX_INSTR packssdw, mmx, 0, 0, 0
- AVX_INSTR packsswb, mmx, 0, 0, 0
--AVX_INSTR packssdw, mmx, 0, 0, 0
-+AVX_INSTR packusdw, sse4, 0, 0, 0
- AVX_INSTR packuswb, mmx, 0, 0, 0
--AVX_INSTR packusdw, sse4, 0, 0, 0
- AVX_INSTR paddb, mmx, 0, 0, 1
--AVX_INSTR paddw, mmx, 0, 0, 1
- AVX_INSTR paddd, mmx, 0, 0, 1
- AVX_INSTR paddq, sse2, 0, 0, 1
- AVX_INSTR paddsb, mmx, 0, 0, 1
- AVX_INSTR paddsw, mmx, 0, 0, 1
- AVX_INSTR paddusb, mmx, 0, 0, 1
- AVX_INSTR paddusw, mmx, 0, 0, 1
-+AVX_INSTR paddw, mmx, 0, 0, 1
- AVX_INSTR palignr, ssse3, 0, 1, 0
- AVX_INSTR pand, mmx, 0, 0, 1
- AVX_INSTR pandn, mmx, 0, 0, 0
- AVX_INSTR pavgb, mmx2, 0, 0, 1
- AVX_INSTR pavgw, mmx2, 0, 0, 1
--AVX_INSTR pblendvb, sse4 ; can't be emulated
-+AVX_INSTR pblendvb, sse4, 0, 1, 0 ; last operand must be xmm0 with legacy encoding
- AVX_INSTR pblendw, sse4, 0, 1, 0
--AVX_INSTR pclmulqdq, fnord, 0, 1, 0
--AVX_INSTR pclmulhqhqdq, fnord, 0, 0, 0
--AVX_INSTR pclmulhqlqdq, fnord, 0, 0, 0
--AVX_INSTR pclmullqhqdq, fnord, 0, 0, 0
--AVX_INSTR pclmullqlqdq, fnord, 0, 0, 0
-+AVX_INSTR pclmulhqhqdq, clmul, 0, 0, 0
-+AVX_INSTR pclmulhqlqdq, clmul, 0, 0, 0
-+AVX_INSTR pclmullqhqdq, clmul, 0, 0, 0
-+AVX_INSTR pclmullqlqdq, clmul, 0, 0, 0
-+AVX_INSTR pclmulqdq, clmul, 0, 1, 0
-+AVX_INSTR pcmpeqb, mmx, 0, 0, 1
-+AVX_INSTR pcmpeqd, mmx, 0, 0, 1
-+AVX_INSTR pcmpeqq, sse4, 0, 0, 1
-+AVX_INSTR pcmpeqw, mmx, 0, 0, 1
- AVX_INSTR pcmpestri, sse42
- AVX_INSTR pcmpestrm, sse42
-+AVX_INSTR pcmpgtb, mmx, 0, 0, 0
-+AVX_INSTR pcmpgtd, mmx, 0, 0, 0
-+AVX_INSTR pcmpgtq, sse42, 0, 0, 0
-+AVX_INSTR pcmpgtw, mmx, 0, 0, 0
- AVX_INSTR pcmpistri, sse42
- AVX_INSTR pcmpistrm, sse42
--AVX_INSTR pcmpeqb, mmx, 0, 0, 1
--AVX_INSTR pcmpeqw, mmx, 0, 0, 1
--AVX_INSTR pcmpeqd, mmx, 0, 0, 1
--AVX_INSTR pcmpeqq, sse4, 0, 0, 1
--AVX_INSTR pcmpgtb, mmx, 0, 0, 0
--AVX_INSTR pcmpgtw, mmx, 0, 0, 0
--AVX_INSTR pcmpgtd, mmx, 0, 0, 0
--AVX_INSTR pcmpgtq, sse42, 0, 0, 0
- AVX_INSTR pextrb, sse4
- AVX_INSTR pextrd, sse4
- AVX_INSTR pextrq, sse4
- AVX_INSTR pextrw, mmx2
--AVX_INSTR phaddw, ssse3, 0, 0, 0
- AVX_INSTR phaddd, ssse3, 0, 0, 0
- AVX_INSTR phaddsw, ssse3, 0, 0, 0
-+AVX_INSTR phaddw, ssse3, 0, 0, 0
- AVX_INSTR phminposuw, sse4
--AVX_INSTR phsubw, ssse3, 0, 0, 0
- AVX_INSTR phsubd, ssse3, 0, 0, 0
- AVX_INSTR phsubsw, ssse3, 0, 0, 0
-+AVX_INSTR phsubw, ssse3, 0, 0, 0
- AVX_INSTR pinsrb, sse4, 0, 1, 0
- AVX_INSTR pinsrd, sse4, 0, 1, 0
- AVX_INSTR pinsrq, sse4, 0, 1, 0
- AVX_INSTR pinsrw, mmx2, 0, 1, 0
-+AVX_INSTR pmaddubsw, ssse3, 0, 0, 0
- AVX_INSTR pmaddwd, mmx, 0, 0, 1
--AVX_INSTR pmaddubsw, ssse3, 0, 0, 0
- AVX_INSTR pmaxsb, sse4, 0, 0, 1
-+AVX_INSTR pmaxsd, sse4, 0, 0, 1
- AVX_INSTR pmaxsw, mmx2, 0, 0, 1
--AVX_INSTR pmaxsd, sse4, 0, 0, 1
- AVX_INSTR pmaxub, mmx2, 0, 0, 1
--AVX_INSTR pmaxuw, sse4, 0, 0, 1
- AVX_INSTR pmaxud, sse4, 0, 0, 1
-+AVX_INSTR pmaxuw, sse4, 0, 0, 1
- AVX_INSTR pminsb, sse4, 0, 0, 1
-+AVX_INSTR pminsd, sse4, 0, 0, 1
- AVX_INSTR pminsw, mmx2, 0, 0, 1
--AVX_INSTR pminsd, sse4, 0, 0, 1
- AVX_INSTR pminub, mmx2, 0, 0, 1
-+AVX_INSTR pminud, sse4, 0, 0, 1
- AVX_INSTR pminuw, sse4, 0, 0, 1
--AVX_INSTR pminud, sse4, 0, 0, 1
- AVX_INSTR pmovmskb, mmx2
--AVX_INSTR pmovsxbw, sse4
- AVX_INSTR pmovsxbd, sse4
- AVX_INSTR pmovsxbq, sse4
-+AVX_INSTR pmovsxbw, sse4
-+AVX_INSTR pmovsxdq, sse4
- AVX_INSTR pmovsxwd, sse4
- AVX_INSTR pmovsxwq, sse4
--AVX_INSTR pmovsxdq, sse4
--AVX_INSTR pmovzxbw, sse4
- AVX_INSTR pmovzxbd, sse4
- AVX_INSTR pmovzxbq, sse4
-+AVX_INSTR pmovzxbw, sse4
-+AVX_INSTR pmovzxdq, sse4
- AVX_INSTR pmovzxwd, sse4
- AVX_INSTR pmovzxwq, sse4
--AVX_INSTR pmovzxdq, sse4
- AVX_INSTR pmuldq, sse4, 0, 0, 1
- AVX_INSTR pmulhrsw, ssse3, 0, 0, 1
- AVX_INSTR pmulhuw, mmx2, 0, 0, 1
- AVX_INSTR pmulhw, mmx, 0, 0, 1
-+AVX_INSTR pmulld, sse4, 0, 0, 1
- AVX_INSTR pmullw, mmx, 0, 0, 1
--AVX_INSTR pmulld, sse4, 0, 0, 1
- AVX_INSTR pmuludq, sse2, 0, 0, 1
- AVX_INSTR por, mmx, 0, 0, 1
- AVX_INSTR psadbw, mmx2, 0, 0, 1
- AVX_INSTR pshufb, ssse3, 0, 0, 0
- AVX_INSTR pshufd, sse2
- AVX_INSTR pshufhw, sse2
- AVX_INSTR pshuflw, sse2
- AVX_INSTR psignb, ssse3, 0, 0, 0
-+AVX_INSTR psignd, ssse3, 0, 0, 0
- AVX_INSTR psignw, ssse3, 0, 0, 0
--AVX_INSTR psignd, ssse3, 0, 0, 0
-+AVX_INSTR pslld, mmx, 0, 0, 0
-+AVX_INSTR pslldq, sse2, 0, 0, 0
-+AVX_INSTR psllq, mmx, 0, 0, 0
- AVX_INSTR psllw, mmx, 0, 0, 0
--AVX_INSTR pslld, mmx, 0, 0, 0
--AVX_INSTR psllq, mmx, 0, 0, 0
--AVX_INSTR pslldq, sse2, 0, 0, 0
-+AVX_INSTR psrad, mmx, 0, 0, 0
- AVX_INSTR psraw, mmx, 0, 0, 0
--AVX_INSTR psrad, mmx, 0, 0, 0
--AVX_INSTR psrlw, mmx, 0, 0, 0
- AVX_INSTR psrld, mmx, 0, 0, 0
-+AVX_INSTR psrldq, sse2, 0, 0, 0
- AVX_INSTR psrlq, mmx, 0, 0, 0
--AVX_INSTR psrldq, sse2, 0, 0, 0
-+AVX_INSTR psrlw, mmx, 0, 0, 0
- AVX_INSTR psubb, mmx, 0, 0, 0
--AVX_INSTR psubw, mmx, 0, 0, 0
- AVX_INSTR psubd, mmx, 0, 0, 0
- AVX_INSTR psubq, sse2, 0, 0, 0
- AVX_INSTR psubsb, mmx, 0, 0, 0
- AVX_INSTR psubsw, mmx, 0, 0, 0
- AVX_INSTR psubusb, mmx, 0, 0, 0
- AVX_INSTR psubusw, mmx, 0, 0, 0
-+AVX_INSTR psubw, mmx, 0, 0, 0
- AVX_INSTR ptest, sse4
- AVX_INSTR punpckhbw, mmx, 0, 0, 0
--AVX_INSTR punpckhwd, mmx, 0, 0, 0
- AVX_INSTR punpckhdq, mmx, 0, 0, 0
- AVX_INSTR punpckhqdq, sse2, 0, 0, 0
-+AVX_INSTR punpckhwd, mmx, 0, 0, 0
- AVX_INSTR punpcklbw, mmx, 0, 0, 0
--AVX_INSTR punpcklwd, mmx, 0, 0, 0
- AVX_INSTR punpckldq, mmx, 0, 0, 0
- AVX_INSTR punpcklqdq, sse2, 0, 0, 0
-+AVX_INSTR punpcklwd, mmx, 0, 0, 0
- AVX_INSTR pxor, mmx, 0, 0, 1
--AVX_INSTR rcpps, sse
-+AVX_INSTR rcpps, sse, 1
- AVX_INSTR rcpss, sse, 1, 0, 0
--AVX_INSTR roundpd, sse4
--AVX_INSTR roundps, sse4
-+AVX_INSTR roundpd, sse4, 1
-+AVX_INSTR roundps, sse4, 1
- AVX_INSTR roundsd, sse4, 1, 1, 0
- AVX_INSTR roundss, sse4, 1, 1, 0
--AVX_INSTR rsqrtps, sse
-+AVX_INSTR rsqrtps, sse, 1
- AVX_INSTR rsqrtss, sse, 1, 0, 0
- AVX_INSTR shufpd, sse2, 1, 1, 0
- AVX_INSTR shufps, sse, 1, 1, 0
--AVX_INSTR sqrtpd, sse2
--AVX_INSTR sqrtps, sse
-+AVX_INSTR sqrtpd, sse2, 1
-+AVX_INSTR sqrtps, sse, 1
- AVX_INSTR sqrtsd, sse2, 1, 0, 0
- AVX_INSTR sqrtss, sse, 1, 0, 0
--AVX_INSTR stmxcsr, sse
-+AVX_INSTR stmxcsr, sse, 1
- AVX_INSTR subpd, sse2, 1, 0, 0
- AVX_INSTR subps, sse, 1, 0, 0
- AVX_INSTR subsd, sse2, 1, 0, 0
- AVX_INSTR subss, sse, 1, 0, 0
--AVX_INSTR ucomisd, sse2
--AVX_INSTR ucomiss, sse
-+AVX_INSTR ucomisd, sse2, 1
-+AVX_INSTR ucomiss, sse, 1
- AVX_INSTR unpckhpd, sse2, 1, 0, 0
- AVX_INSTR unpckhps, sse, 1, 0, 0
- AVX_INSTR unpcklpd, sse2, 1, 0, 0
- AVX_INSTR unpcklps, sse, 1, 0, 0
- AVX_INSTR xorpd, sse2, 1, 0, 1
- AVX_INSTR xorps, sse, 1, 0, 1
- 
- ; 3DNow instructions, for sharing code between AVX, SSE and 3DN
- AVX_INSTR pfadd, 3dnow, 1, 0, 1
-+AVX_INSTR pfmul, 3dnow, 1, 0, 1
- AVX_INSTR pfsub, 3dnow, 1, 0, 0
--AVX_INSTR pfmul, 3dnow, 1, 0, 1
-+
-+;%1 == instruction
-+;%2 == minimal instruction set
-+%macro GPR_INSTR 2
-+    %macro %1 2-5 fnord, %1, %2
-+        %ifdef cpuname
-+            %if notcpuflag(%5)
-+                %error use of ``%4'' %5 instruction in cpuname function: current_function
-+            %endif
-+        %endif
-+        %ifidn %3, fnord
-+            %4 %1, %2
-+        %else
-+            %4 %1, %2, %3
-+        %endif
-+    %endmacro
-+%endmacro
-+
-+GPR_INSTR andn, bmi1
-+GPR_INSTR bextr, bmi1
-+GPR_INSTR blsi, bmi1
-+GPR_INSTR blsmsk, bmi1
-+GPR_INSTR blsr, bmi1
-+GPR_INSTR bzhi, bmi2
-+GPR_INSTR crc32, sse42
-+GPR_INSTR mulx, bmi2
-+GPR_INSTR pdep, bmi2
-+GPR_INSTR pext, bmi2
-+GPR_INSTR popcnt, sse42
-+GPR_INSTR rorx, bmi2
-+GPR_INSTR sarx, bmi2
-+GPR_INSTR shlx, bmi2
-+GPR_INSTR shrx, bmi2
- 
- ; base-4 constants for shuffles
- %assign i 0
- %rep 256
-     %assign j ((i>>6)&3)*1000 + ((i>>4)&3)*100 + ((i>>2)&3)*10 + (i&3)
-     %if j < 10
-         CAT_XDEFINE q000, j, i
-     %elif j < 100
-@@ -1613,25 +1877,21 @@ AVX_INSTR pfmul, 3dnow, 1, 0, 1
-             %6 %1, %2, %3
-             %7 %1, %4
-         %else
-             %error non-xop emulation of ``%5 %1, %2, %3, %4'' is not supported
-         %endif
-     %endmacro
- %endmacro
- 
--FMA_INSTR  pmacsww,  pmullw, paddw
--FMA_INSTR  pmacsdd,  pmulld, paddd ; sse4 emulation
--FMA_INSTR pmacsdql,  pmuldq, paddq ; sse4 emulation
-+FMA_INSTR pmacsdd,  pmulld,  paddd ; sse4 emulation
-+FMA_INSTR pmacsdql, pmuldq,  paddq ; sse4 emulation
-+FMA_INSTR pmacsww,  pmullw,  paddw
- FMA_INSTR pmadcswd, pmaddwd, paddd
- 
--; tzcnt is equivalent to "rep bsf" and is backwards-compatible with bsf.
--; This lets us use tzcnt without bumping the yasm version requirement yet.
--%define tzcnt rep bsf
--
- ; Macros for consolidating FMA3 and FMA4 using 4-operand (dst, src1, src2, src3) syntax.
- ; FMA3 is only possible if dst is the same as one of the src registers.
- ; Either src2 or src3 can be a memory operand.
- %macro FMA4_INSTR 2-*
-     %push fma4_instr
-     %xdefine %$prefix %1
-     %rep %0 - 1
-         %macro %$prefix%2 4-6 %$prefix, %2
-@@ -1682,16 +1942,21 @@ FMA4_INSTR fnmsub,   pd, ps, sd, ss
-                 %assign %%evex_required 1
-             %endif
-         %endif
-         %ifnum regnumof%2
-             %if regnumof%2 >= 16 || sizeof%2 > 32
-                 %assign %%evex_required 1
-             %endif
-         %endif
-+        %ifnum regnumof%3
-+            %if regnumof%3 >= 16 || sizeof%3 > 32
-+                %assign %%evex_required 1
-+            %endif
-+        %endif
-         %if %%evex_required
-             %6 %%args
-         %else
-             %5 %%args ; Prefer VEX over EVEX due to shorter instruction length
-         %endif
-     %endmacro
- %endmacro
- 
-@@ -1706,21 +1971,8 @@ EVEX_INSTR vmovdqu,        vmovdqu32
- EVEX_INSTR vpand,          vpandd
- EVEX_INSTR vpandn,         vpandnd
- EVEX_INSTR vpor,           vpord
- EVEX_INSTR vpxor,          vpxord
- EVEX_INSTR vrcpps,         vrcp14ps,   1 ; EVEX versions have higher precision
- EVEX_INSTR vrcpss,         vrcp14ss,   1
- EVEX_INSTR vrsqrtps,       vrsqrt14ps, 1
- EVEX_INSTR vrsqrtss,       vrsqrt14ss, 1
--
--; workaround: vpbroadcastq is broken in x86_32 due to a yasm bug (fixed in 1.3.0)
--%ifdef __YASM_VER__
--    %if __YASM_VERSION_ID__ < 0x01030000 && ARCH_X86_64 == 0
--        %macro vpbroadcastq 2
--            %if sizeof%1 == 16
--                movddup %1, %2
--            %else
--                vbroadcastsd %1, %2
--            %endif
--        %endmacro
--    %endif
--%endif
-diff --git a/media/ffvpx/libavutil/x86/x86util.asm b/media/ffvpx/libavutil/x86/x86util.asm
---- a/media/ffvpx/libavutil/x86/x86util.asm
-+++ b/media/ffvpx/libavutil/x86/x86util.asm
-@@ -797,20 +797,16 @@
- %macro CLIPW 3 ;(dst, min, max)
-     pmaxsw %1, %2
-     pminsw %1, %3
- %endmacro
- 
- %macro PMINSD 3 ; dst, src, tmp/unused
- %if cpuflag(sse4)
-     pminsd    %1, %2
--%elif cpuflag(sse2)
--    cvtdq2ps  %1, %1
--    minps     %1, %2
--    cvtps2dq  %1, %1
- %else
-     mova      %3, %2
-     pcmpgtd   %3, %1
-     pxor      %1, %2
-     pand      %1, %3
-     pxor      %1, %2
- %endif
- %endmacro
-diff --git a/media/ffvpx/libavutil_visibility.h b/media/ffvpx/libavutil_visibility.h
---- a/media/ffvpx/libavutil_visibility.h
-+++ b/media/ffvpx/libavutil_visibility.h
-@@ -5,16 +5,16 @@
-  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- 
- // Include file for fixing symbol visibility on Linux.
- 
- #ifndef MOZILLA_AVUTIL_VISIBILITY_H
- #define MOZILLA_AVUTIL_VISIBILITY_H
- 
- #pragma GCC visibility push(default)
--#include "libavutil/cpu.h"
- 
- // We need av_log() to be visible so we can enable assertions in libavcodec.
- #include "libavutil/log.h"
-+#include "libavcodec/packet.h"
- 
- #pragma GCC visibility pop
- 
- #endif // MOZILLA_AVUTIL_VISIBILITY_H
-
diff --git a/5970587d9a7a.patch b/5970587d9a7a.patch
deleted file mode 100644
index dc76207..0000000
--- a/5970587d9a7a.patch
+++ /dev/null
@@ -1,15072 +0,0 @@
-
-# HG changeset patch
-# User Paul Adenot <paul@paul.cx>
-# Date 1714486905 0
-# Node ID 5970587d9a7a05549c7e9f8bb5723c4e6866a3c8
-# Parent  5e6f6e0723be0759e720d417dd4e2de7817f42d5
-Bug 1889978 - Vendor ffmpeg 7.0 headers. r=media-playback-reviewers,frontend-codestyle-reviewers,alwu
-
-Differential Revision: https://phabricator.services.mozilla.com/D206922
-
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/COPYING.LGPLv2.1 b/dom/media/platforms/ffmpeg/ffmpeg61/include/COPYING.LGPLv2.1
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/COPYING.LGPLv2.1
-@@ -0,0 +1,504 @@
-+                  GNU LESSER GENERAL PUBLIC LICENSE
-+                       Version 2.1, February 1999
-+
-+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ Everyone is permitted to copy and distribute verbatim copies
-+ of this license document, but changing it is not allowed.
-+
-+[This is the first released version of the Lesser GPL.  It also counts
-+ as the successor of the GNU Library Public License, version 2, hence
-+ the version number 2.1.]
-+
-+                            Preamble
-+
-+  The licenses for most software are designed to take away your
-+freedom to share and change it.  By contrast, the GNU General Public
-+Licenses are intended to guarantee your freedom to share and change
-+free software--to make sure the software is free for all its users.
-+
-+  This license, the Lesser General Public License, applies to some
-+specially designated software packages--typically libraries--of the
-+Free Software Foundation and other authors who decide to use it.  You
-+can use it too, but we suggest you first think carefully about whether
-+this license or the ordinary General Public License is the better
-+strategy to use in any particular case, based on the explanations below.
-+
-+  When we speak of free software, we are referring to freedom of use,
-+not price.  Our General Public Licenses are designed to make sure that
-+you have the freedom to distribute copies of free software (and charge
-+for this service if you wish); that you receive source code or can get
-+it if you want it; that you can change the software and use pieces of
-+it in new free programs; and that you are informed that you can do
-+these things.
-+
-+  To protect your rights, we need to make restrictions that forbid
-+distributors to deny you these rights or to ask you to surrender these
-+rights.  These restrictions translate to certain responsibilities for
-+you if you distribute copies of the library or if you modify it.
-+
-+  For example, if you distribute copies of the library, whether gratis
-+or for a fee, you must give the recipients all the rights that we gave
-+you.  You must make sure that they, too, receive or can get the source
-+code.  If you link other code with the library, you must provide
-+complete object files to the recipients, so that they can relink them
-+with the library after making changes to the library and recompiling
-+it.  And you must show them these terms so they know their rights.
-+
-+  We protect your rights with a two-step method: (1) we copyright the
-+library, and (2) we offer you this license, which gives you legal
-+permission to copy, distribute and/or modify the library.
-+
-+  To protect each distributor, we want to make it very clear that
-+there is no warranty for the free library.  Also, if the library is
-+modified by someone else and passed on, the recipients should know
-+that what they have is not the original version, so that the original
-+author's reputation will not be affected by problems that might be
-+introduced by others.
-+
-+  Finally, software patents pose a constant threat to the existence of
-+any free program.  We wish to make sure that a company cannot
-+effectively restrict the users of a free program by obtaining a
-+restrictive license from a patent holder.  Therefore, we insist that
-+any patent license obtained for a version of the library must be
-+consistent with the full freedom of use specified in this license.
-+
-+  Most GNU software, including some libraries, is covered by the
-+ordinary GNU General Public License.  This license, the GNU Lesser
-+General Public License, applies to certain designated libraries, and
-+is quite different from the ordinary General Public License.  We use
-+this license for certain libraries in order to permit linking those
-+libraries into non-free programs.
-+
-+  When a program is linked with a library, whether statically or using
-+a shared library, the combination of the two is legally speaking a
-+combined work, a derivative of the original library.  The ordinary
-+General Public License therefore permits such linking only if the
-+entire combination fits its criteria of freedom.  The Lesser General
-+Public License permits more lax criteria for linking other code with
-+the library.
-+
-+  We call this license the "Lesser" General Public License because it
-+does Less to protect the user's freedom than the ordinary General
-+Public License.  It also provides other free software developers Less
-+of an advantage over competing non-free programs.  These disadvantages
-+are the reason we use the ordinary General Public License for many
-+libraries.  However, the Lesser license provides advantages in certain
-+special circumstances.
-+
-+  For example, on rare occasions, there may be a special need to
-+encourage the widest possible use of a certain library, so that it becomes
-+a de-facto standard.  To achieve this, non-free programs must be
-+allowed to use the library.  A more frequent case is that a free
-+library does the same job as widely used non-free libraries.  In this
-+case, there is little to gain by limiting the free library to free
-+software only, so we use the Lesser General Public License.
-+
-+  In other cases, permission to use a particular library in non-free
-+programs enables a greater number of people to use a large body of
-+free software.  For example, permission to use the GNU C Library in
-+non-free programs enables many more people to use the whole GNU
-+operating system, as well as its variant, the GNU/Linux operating
-+system.
-+
-+  Although the Lesser General Public License is Less protective of the
-+users' freedom, it does ensure that the user of a program that is
-+linked with the Library has the freedom and the wherewithal to run
-+that program using a modified version of the Library.
-+
-+  The precise terms and conditions for copying, distribution and
-+modification follow.  Pay close attention to the difference between a
-+"work based on the library" and a "work that uses the library".  The
-+former contains code derived from the library, whereas the latter must
-+be combined with the library in order to run.
-+
-+                  GNU LESSER GENERAL PUBLIC LICENSE
-+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-+
-+  0. This License Agreement applies to any software library or other
-+program which contains a notice placed by the copyright holder or
-+other authorized party saying it may be distributed under the terms of
-+this Lesser General Public License (also called "this License").
-+Each licensee is addressed as "you".
-+
-+  A "library" means a collection of software functions and/or data
-+prepared so as to be conveniently linked with application programs
-+(which use some of those functions and data) to form executables.
-+
-+  The "Library", below, refers to any such software library or work
-+which has been distributed under these terms.  A "work based on the
-+Library" means either the Library or any derivative work under
-+copyright law: that is to say, a work containing the Library or a
-+portion of it, either verbatim or with modifications and/or translated
-+straightforwardly into another language.  (Hereinafter, translation is
-+included without limitation in the term "modification".)
-+
-+  "Source code" for a work means the preferred form of the work for
-+making modifications to it.  For a library, complete source code means
-+all the source code for all modules it contains, plus any associated
-+interface definition files, plus the scripts used to control compilation
-+and installation of the library.
-+
-+  Activities other than copying, distribution and modification are not
-+covered by this License; they are outside its scope.  The act of
-+running a program using the Library is not restricted, and output from
-+such a program is covered only if its contents constitute a work based
-+on the Library (independent of the use of the Library in a tool for
-+writing it).  Whether that is true depends on what the Library does
-+and what the program that uses the Library does.
-+
-+  1. You may copy and distribute verbatim copies of the Library's
-+complete source code as you receive it, in any medium, provided that
-+you conspicuously and appropriately publish on each copy an
-+appropriate copyright notice and disclaimer of warranty; keep intact
-+all the notices that refer to this License and to the absence of any
-+warranty; and distribute a copy of this License along with the
-+Library.
-+
-+  You may charge a fee for the physical act of transferring a copy,
-+and you may at your option offer warranty protection in exchange for a
-+fee.
-+
-+  2. You may modify your copy or copies of the Library or any portion
-+of it, thus forming a work based on the Library, and copy and
-+distribute such modifications or work under the terms of Section 1
-+above, provided that you also meet all of these conditions:
-+
-+    a) The modified work must itself be a software library.
-+
-+    b) You must cause the files modified to carry prominent notices
-+    stating that you changed the files and the date of any change.
-+
-+    c) You must cause the whole of the work to be licensed at no
-+    charge to all third parties under the terms of this License.
-+
-+    d) If a facility in the modified Library refers to a function or a
-+    table of data to be supplied by an application program that uses
-+    the facility, other than as an argument passed when the facility
-+    is invoked, then you must make a good faith effort to ensure that,
-+    in the event an application does not supply such function or
-+    table, the facility still operates, and performs whatever part of
-+    its purpose remains meaningful.
-+
-+    (For example, a function in a library to compute square roots has
-+    a purpose that is entirely well-defined independent of the
-+    application.  Therefore, Subsection 2d requires that any
-+    application-supplied function or table used by this function must
-+    be optional: if the application does not supply it, the square
-+    root function must still compute square roots.)
-+
-+These requirements apply to the modified work as a whole.  If
-+identifiable sections of that work are not derived from the Library,
-+and can be reasonably considered independent and separate works in
-+themselves, then this License, and its terms, do not apply to those
-+sections when you distribute them as separate works.  But when you
-+distribute the same sections as part of a whole which is a work based
-+on the Library, the distribution of the whole must be on the terms of
-+this License, whose permissions for other licensees extend to the
-+entire whole, and thus to each and every part regardless of who wrote
-+it.
-+
-+Thus, it is not the intent of this section to claim rights or contest
-+your rights to work written entirely by you; rather, the intent is to
-+exercise the right to control the distribution of derivative or
-+collective works based on the Library.
-+
-+In addition, mere aggregation of another work not based on the Library
-+with the Library (or with a work based on the Library) on a volume of
-+a storage or distribution medium does not bring the other work under
-+the scope of this License.
-+
-+  3. You may opt to apply the terms of the ordinary GNU General Public
-+License instead of this License to a given copy of the Library.  To do
-+this, you must alter all the notices that refer to this License, so
-+that they refer to the ordinary GNU General Public License, version 2,
-+instead of to this License.  (If a newer version than version 2 of the
-+ordinary GNU General Public License has appeared, then you can specify
-+that version instead if you wish.)  Do not make any other change in
-+these notices.
-+
-+  Once this change is made in a given copy, it is irreversible for
-+that copy, so the ordinary GNU General Public License applies to all
-+subsequent copies and derivative works made from that copy.
-+
-+  This option is useful when you wish to copy part of the code of
-+the Library into a program that is not a library.
-+
-+  4. You may copy and distribute the Library (or a portion or
-+derivative of it, under Section 2) in object code or executable form
-+under the terms of Sections 1 and 2 above provided that you accompany
-+it with the complete corresponding machine-readable source code, which
-+must be distributed under the terms of Sections 1 and 2 above on a
-+medium customarily used for software interchange.
-+
-+  If distribution of object code is made by offering access to copy
-+from a designated place, then offering equivalent access to copy the
-+source code from the same place satisfies the requirement to
-+distribute the source code, even though third parties are not
-+compelled to copy the source along with the object code.
-+
-+  5. A program that contains no derivative of any portion of the
-+Library, but is designed to work with the Library by being compiled or
-+linked with it, is called a "work that uses the Library".  Such a
-+work, in isolation, is not a derivative work of the Library, and
-+therefore falls outside the scope of this License.
-+
-+  However, linking a "work that uses the Library" with the Library
-+creates an executable that is a derivative of the Library (because it
-+contains portions of the Library), rather than a "work that uses the
-+library".  The executable is therefore covered by this License.
-+Section 6 states terms for distribution of such executables.
-+
-+  When a "work that uses the Library" uses material from a header file
-+that is part of the Library, the object code for the work may be a
-+derivative work of the Library even though the source code is not.
-+Whether this is true is especially significant if the work can be
-+linked without the Library, or if the work is itself a library.  The
-+threshold for this to be true is not precisely defined by law.
-+
-+  If such an object file uses only numerical parameters, data
-+structure layouts and accessors, and small macros and small inline
-+functions (ten lines or less in length), then the use of the object
-+file is unrestricted, regardless of whether it is legally a derivative
-+work.  (Executables containing this object code plus portions of the
-+Library will still fall under Section 6.)
-+
-+  Otherwise, if the work is a derivative of the Library, you may
-+distribute the object code for the work under the terms of Section 6.
-+Any executables containing that work also fall under Section 6,
-+whether or not they are linked directly with the Library itself.
-+
-+  6. As an exception to the Sections above, you may also combine or
-+link a "work that uses the Library" with the Library to produce a
-+work containing portions of the Library, and distribute that work
-+under terms of your choice, provided that the terms permit
-+modification of the work for the customer's own use and reverse
-+engineering for debugging such modifications.
-+
-+  You must give prominent notice with each copy of the work that the
-+Library is used in it and that the Library and its use are covered by
-+this License.  You must supply a copy of this License.  If the work
-+during execution displays copyright notices, you must include the
-+copyright notice for the Library among them, as well as a reference
-+directing the user to the copy of this License.  Also, you must do one
-+of these things:
-+
-+    a) Accompany the work with the complete corresponding
-+    machine-readable source code for the Library including whatever
-+    changes were used in the work (which must be distributed under
-+    Sections 1 and 2 above); and, if the work is an executable linked
-+    with the Library, with the complete machine-readable "work that
-+    uses the Library", as object code and/or source code, so that the
-+    user can modify the Library and then relink to produce a modified
-+    executable containing the modified Library.  (It is understood
-+    that the user who changes the contents of definitions files in the
-+    Library will not necessarily be able to recompile the application
-+    to use the modified definitions.)
-+
-+    b) Use a suitable shared library mechanism for linking with the
-+    Library.  A suitable mechanism is one that (1) uses at run time a
-+    copy of the library already present on the user's computer system,
-+    rather than copying library functions into the executable, and (2)
-+    will operate properly with a modified version of the library, if
-+    the user installs one, as long as the modified version is
-+    interface-compatible with the version that the work was made with.
-+
-+    c) Accompany the work with a written offer, valid for at
-+    least three years, to give the same user the materials
-+    specified in Subsection 6a, above, for a charge no more
-+    than the cost of performing this distribution.
-+
-+    d) If distribution of the work is made by offering access to copy
-+    from a designated place, offer equivalent access to copy the above
-+    specified materials from the same place.
-+
-+    e) Verify that the user has already received a copy of these
-+    materials or that you have already sent this user a copy.
-+
-+  For an executable, the required form of the "work that uses the
-+Library" must include any data and utility programs needed for
-+reproducing the executable from it.  However, as a special exception,
-+the materials to be distributed need not include anything that is
-+normally distributed (in either source or binary form) with the major
-+components (compiler, kernel, and so on) of the operating system on
-+which the executable runs, unless that component itself accompanies
-+the executable.
-+
-+  It may happen that this requirement contradicts the license
-+restrictions of other proprietary libraries that do not normally
-+accompany the operating system.  Such a contradiction means you cannot
-+use both them and the Library together in an executable that you
-+distribute.
-+
-+  7. You may place library facilities that are a work based on the
-+Library side-by-side in a single library together with other library
-+facilities not covered by this License, and distribute such a combined
-+library, provided that the separate distribution of the work based on
-+the Library and of the other library facilities is otherwise
-+permitted, and provided that you do these two things:
-+
-+    a) Accompany the combined library with a copy of the same work
-+    based on the Library, uncombined with any other library
-+    facilities.  This must be distributed under the terms of the
-+    Sections above.
-+
-+    b) Give prominent notice with the combined library of the fact
-+    that part of it is a work based on the Library, and explaining
-+    where to find the accompanying uncombined form of the same work.
-+
-+  8. You may not copy, modify, sublicense, link with, or distribute
-+the Library except as expressly provided under this License.  Any
-+attempt otherwise to copy, modify, sublicense, link with, or
-+distribute the Library is void, and will automatically terminate your
-+rights under this License.  However, parties who have received copies,
-+or rights, from you under this License will not have their licenses
-+terminated so long as such parties remain in full compliance.
-+
-+  9. You are not required to accept this License, since you have not
-+signed it.  However, nothing else grants you permission to modify or
-+distribute the Library or its derivative works.  These actions are
-+prohibited by law if you do not accept this License.  Therefore, by
-+modifying or distributing the Library (or any work based on the
-+Library), you indicate your acceptance of this License to do so, and
-+all its terms and conditions for copying, distributing or modifying
-+the Library or works based on it.
-+
-+  10. Each time you redistribute the Library (or any work based on the
-+Library), the recipient automatically receives a license from the
-+original licensor to copy, distribute, link with or modify the Library
-+subject to these terms and conditions.  You may not impose any further
-+restrictions on the recipients' exercise of the rights granted herein.
-+You are not responsible for enforcing compliance by third parties with
-+this License.
-+
-+  11. If, as a consequence of a court judgment or allegation of patent
-+infringement or for any other reason (not limited to patent issues),
-+conditions are imposed on you (whether by court order, agreement or
-+otherwise) that contradict the conditions of this License, they do not
-+excuse you from the conditions of this License.  If you cannot
-+distribute so as to satisfy simultaneously your obligations under this
-+License and any other pertinent obligations, then as a consequence you
-+may not distribute the Library at all.  For example, if a patent
-+license would not permit royalty-free redistribution of the Library by
-+all those who receive copies directly or indirectly through you, then
-+the only way you could satisfy both it and this License would be to
-+refrain entirely from distribution of the Library.
-+
-+If any portion of this section is held invalid or unenforceable under any
-+particular circumstance, the balance of the section is intended to apply,
-+and the section as a whole is intended to apply in other circumstances.
-+
-+It is not the purpose of this section to induce you to infringe any
-+patents or other property right claims or to contest validity of any
-+such claims; this section has the sole purpose of protecting the
-+integrity of the free software distribution system which is
-+implemented by public license practices.  Many people have made
-+generous contributions to the wide range of software distributed
-+through that system in reliance on consistent application of that
-+system; it is up to the author/donor to decide if he or she is willing
-+to distribute software through any other system and a licensee cannot
-+impose that choice.
-+
-+This section is intended to make thoroughly clear what is believed to
-+be a consequence of the rest of this License.
-+
-+  12. If the distribution and/or use of the Library is restricted in
-+certain countries either by patents or by copyrighted interfaces, the
-+original copyright holder who places the Library under this License may add
-+an explicit geographical distribution limitation excluding those countries,
-+so that distribution is permitted only in or among countries not thus
-+excluded.  In such case, this License incorporates the limitation as if
-+written in the body of this License.
-+
-+  13. The Free Software Foundation may publish revised and/or new
-+versions of the Lesser General Public License from time to time.
-+Such new versions will be similar in spirit to the present version,
-+but may differ in detail to address new problems or concerns.
-+
-+Each version is given a distinguishing version number.  If the Library
-+specifies a version number of this License which applies to it and
-+"any later version", you have the option of following the terms and
-+conditions either of that version or of any later version published by
-+the Free Software Foundation.  If the Library does not specify a
-+license version number, you may choose any version ever published by
-+the Free Software Foundation.
-+
-+  14. If you wish to incorporate parts of the Library into other free
-+programs whose distribution conditions are incompatible with these,
-+write to the author to ask for permission.  For software which is
-+copyrighted by the Free Software Foundation, write to the Free
-+Software Foundation; we sometimes make exceptions for this.  Our
-+decision will be guided by the two goals of preserving the free status
-+of all derivatives of our free software and of promoting the sharing
-+and reuse of software generally.
-+
-+                            NO WARRANTY
-+
-+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-+
-+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-+DAMAGES.
-+
-+                     END OF TERMS AND CONDITIONS
-+
-+           How to Apply These Terms to Your New Libraries
-+
-+  If you develop a new library, and you want it to be of the greatest
-+possible use to the public, we recommend making it free software that
-+everyone can redistribute and change.  You can do so by permitting
-+redistribution under these terms (or, alternatively, under the terms of the
-+ordinary General Public License).
-+
-+  To apply these terms, attach the following notices to the library.  It is
-+safest to attach them to the start of each source file to most effectively
-+convey the exclusion of warranty; and each file should have at least the
-+"copyright" line and a pointer to where the full notice is found.
-+
-+    <one line to give the library's name and a brief idea of what it does.>
-+    Copyright (C) <year>  <name of author>
-+
-+    This library 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.
-+
-+    This library 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 this library; if not, write to the Free Software
-+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+
-+Also add information on how to contact you by electronic and paper mail.
-+
-+You should also get your employer (if you work as a programmer) or your
-+school, if any, to sign a "copyright disclaimer" for the library, if
-+necessary.  Here is a sample; alter the names:
-+
-+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-+
-+  <signature of Ty Coon>, 1 April 1990
-+  Ty Coon, President of Vice
-+
-+That's all there is to it!
-+
-+
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/avcodec.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/avcodec.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/avcodec.h
-@@ -0,0 +1,3121 @@
-+/*
-+ * copyright (c) 2001 Fabrice Bellard
-+ *
-+ * 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_AVCODEC_H
-+#define AVCODEC_AVCODEC_H
-+
-+/**
-+ * @file
-+ * @ingroup libavc
-+ * Libavcodec external API header
-+ */
-+
-+#include "libavutil/samplefmt.h"
-+#include "libavutil/attributes.h"
-+#include "libavutil/avutil.h"
-+#include "libavutil/buffer.h"
-+#include "libavutil/channel_layout.h"
-+#include "libavutil/dict.h"
-+#include "libavutil/frame.h"
-+#include "libavutil/log.h"
-+#include "libavutil/pixfmt.h"
-+#include "libavutil/rational.h"
-+
-+#include "codec.h"
-+#include "codec_id.h"
-+#include "defs.h"
-+#include "packet.h"
-+#include "version_major.h"
-+#ifndef HAVE_AV_CONFIG_H
-+/* When included as part of the ffmpeg build, only include the major version
-+ * to avoid unnecessary rebuilds. When included externally, keep including
-+ * the full version information. */
-+#  include "version.h"
-+
-+#  include "codec_desc.h"
-+#  include "codec_par.h"
-+#endif
-+
-+struct AVCodecParameters;
-+
-+/**
-+ * @defgroup libavc libavcodec
-+ * Encoding/Decoding Library
-+ *
-+ * @{
-+ *
-+ * @defgroup lavc_decoding Decoding
-+ * @{
-+ * @}
-+ *
-+ * @defgroup lavc_encoding Encoding
-+ * @{
-+ * @}
-+ *
-+ * @defgroup lavc_codec Codecs
-+ * @{
-+ * @defgroup lavc_codec_native Native Codecs
-+ * @{
-+ * @}
-+ * @defgroup lavc_codec_wrappers External library wrappers
-+ * @{
-+ * @}
-+ * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge
-+ * @{
-+ * @}
-+ * @}
-+ * @defgroup lavc_internal Internal
-+ * @{
-+ * @}
-+ * @}
-+ */
-+
-+/**
-+ * @ingroup libavc
-+ * @defgroup lavc_encdec send/receive encoding and decoding API overview
-+ * @{
-+ *
-+ * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/
-+ * avcodec_receive_packet() functions provide an encode/decode API, which
-+ * decouples input and output.
-+ *
-+ * The API is very similar for encoding/decoding and audio/video, and works as
-+ * follows:
-+ * - Set up and open the AVCodecContext as usual.
-+ * - Send valid input:
-+ *   - For decoding, call avcodec_send_packet() to give the decoder raw
-+ *     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
-+ *   refcounted AVFrames.)
-+ * - Receive output in a loop. Periodically call one of the avcodec_receive_*()
-+ *   functions and process their output:
-+ *   - For decoding, call avcodec_receive_frame(). On success, it will return
-+ *     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
-+ *   input frame/packet, the codec will typically return 1 output frame/packet,
-+ *   but it can also be 0 or more than 1.
-+ *
-+ * At the beginning of decoding or encoding, the codec might accept multiple
-+ * input frames/packets without returning a frame, until its internal buffers
-+ * are filled. This situation is handled transparently if you follow the steps
-+ * outlined above.
-+ *
-+ * In theory, sending input can result in EAGAIN - this should happen only if
-+ * not all output was received. You can use this to structure alternative decode
-+ * or encode loops other than the one suggested above. For example, you could
-+ * try sending new input on each iteration, and try to receive output if that
-+ * returns EAGAIN.
-+ *
-+ * End of stream situations. These require "flushing" (aka draining) the codec,
-+ * as the codec might buffer multiple frames or packets internally for
-+ * performance or out of necessity (consider B-frames).
-+ * This is handled as follows:
-+ * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding)
-+ *   or avcodec_send_frame() (encoding) functions. This will enter draining
-+ *   mode.
-+ * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet()
-+ *   (encoding) in a loop until AVERROR_EOF is returned. The functions will
-+ *   not return AVERROR(EAGAIN), unless you forgot to enter draining mode.
-+ * - Before decoding can be resumed again, the codec has to be reset with
-+ *   avcodec_flush_buffers().
-+ *
-+ * Using the API as outlined above is highly recommended. But it is also
-+ * possible to call functions outside of this rigid schema. For example, you can
-+ * call avcodec_send_packet() repeatedly without calling
-+ * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed
-+ * until the codec's internal buffer has been filled up (which is typically of
-+ * size 1 per output frame, after initial input), and then reject input with
-+ * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to
-+ * read at least some output.
-+ *
-+ * Not all codecs will follow a rigid and predictable dataflow; the only
-+ * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on
-+ * one end implies that a receive/send call on the other end will succeed, or
-+ * at least will not fail with AVERROR(EAGAIN). In general, no codec will
-+ * permit unlimited buffering of input or output.
-+ *
-+ * A codec is not allowed to return AVERROR(EAGAIN) for both sending and
-+ * receiving. This would be an invalid state, which could put the codec user
-+ * into an endless loop. The API has no concept of time either: it cannot happen
-+ * that trying to do avcodec_send_packet() results in AVERROR(EAGAIN), but a
-+ * repeated call 1 second later accepts the packet (with no other receive/flush
-+ * API calls involved). The API is a strict state machine, and the passage of
-+ * time is not supposed to influence it. Some timing-dependent behavior might
-+ * still be deemed acceptable in certain cases. But it must never result in both
-+ * send/receive returning EAGAIN at the same time at any point. It must also
-+ * absolutely be avoided that the current state is "unstable" and can
-+ * "flip-flop" between the send/receive APIs allowing progress. For example,
-+ * it's not allowed that the codec randomly decides that it actually wants to
-+ * consume a packet now instead of returning a frame, after it just returned
-+ * AVERROR(EAGAIN) on an avcodec_send_packet() call.
-+ * @}
-+ */
-+
-+/**
-+ * @defgroup lavc_core Core functions/structures.
-+ * @ingroup libavc
-+ *
-+ * Basic definitions, functions for querying libavcodec capabilities,
-+ * allocating core structures, etc.
-+ * @{
-+ */
-+
-+#if FF_API_BUFFER_MIN_SIZE
-+/**
-+ * @ingroup lavc_encoding
-+ * minimum encoding buffer size
-+ * Used to avoid some checks during header writing.
-+ * @deprecated Unused: avcodec_receive_packet() does not work
-+ *             with preallocated packet buffers.
-+ */
-+#  define AV_INPUT_BUFFER_MIN_SIZE 16384
-+#endif
-+
-+/**
-+ * @ingroup lavc_encoding
-+ */
-+typedef struct RcOverride {
-+  int start_frame;
-+  int end_frame;
-+  int qscale;  // If this is 0 then quality_factor will be used instead.
-+  float quality_factor;
-+} RcOverride;
-+
-+/* encoding support
-+   These flags can be passed in AVCodecContext.flags before initialization.
-+   Note: Not everything is supported yet.
-+*/
-+
-+/**
-+ * Allow decoders to produce frames with data planes that are not aligned
-+ * to CPU requirements (e.g. due to cropping).
-+ */
-+#define AV_CODEC_FLAG_UNALIGNED (1 << 0)
-+/**
-+ * Use fixed qscale.
-+ */
-+#define AV_CODEC_FLAG_QSCALE (1 << 1)
-+/**
-+ * 4 MV per MB allowed / advanced prediction for H.263.
-+ */
-+#define AV_CODEC_FLAG_4MV (1 << 2)
-+/**
-+ * Output even those frames that might be corrupted.
-+ */
-+#define AV_CODEC_FLAG_OUTPUT_CORRUPT (1 << 3)
-+/**
-+ * Use qpel MC.
-+ */
-+#define AV_CODEC_FLAG_QPEL (1 << 4)
-+#if FF_API_DROPCHANGED
-+/**
-+ * Don't output frames whose parameters differ from first
-+ * decoded frame in stream.
-+ *
-+ * @deprecated callers should implement this functionality in their own code
-+ */
-+#  define AV_CODEC_FLAG_DROPCHANGED (1 << 5)
-+#endif
-+/**
-+ * Request the encoder to output reconstructed frames, i.e.\ frames that would
-+ * be produced by decoding the encoded bistream. These frames may be retrieved
-+ * by calling avcodec_receive_frame() immediately after a successful call to
-+ * avcodec_receive_packet().
-+ *
-+ * Should only be used with encoders flagged with the
-+ * @ref AV_CODEC_CAP_ENCODER_RECON_FRAME capability.
-+ *
-+ * @note
-+ * Each reconstructed frame returned by the encoder corresponds to the last
-+ * encoded packet, i.e. the frames are returned in coded order rather than
-+ * presentation order.
-+ *
-+ * @note
-+ * Frame parameters (like pixel format or dimensions) do not have to match the
-+ * AVCodecContext values. Make sure to use the values from the returned frame.
-+ */
-+#define AV_CODEC_FLAG_RECON_FRAME (1 << 6)
-+/**
-+ * @par decoding
-+ * Request the decoder to propagate each packet's AVPacket.opaque and
-+ * AVPacket.opaque_ref to its corresponding output AVFrame.
-+ *
-+ * @par encoding:
-+ * Request the encoder to propagate each frame's AVFrame.opaque and
-+ * AVFrame.opaque_ref values to its corresponding output AVPacket.
-+ *
-+ * @par
-+ * May only be set on encoders that have the
-+ * @ref AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability flag.
-+ *
-+ * @note
-+ * While in typical cases one input frame produces exactly one output packet
-+ * (perhaps after a delay), in general the mapping of frames to packets is
-+ * M-to-N, so
-+ * - Any number of input frames may be associated with any given output packet.
-+ *   This includes zero - e.g. some encoders may output packets that carry only
-+ *   metadata about the whole stream.
-+ * - A given input frame may be associated with any number of output packets.
-+ *   Again this includes zero - e.g. some encoders may drop frames under certain
-+ *   conditions.
-+ * .
-+ * This implies that when using this flag, the caller must NOT assume that
-+ * - a given input frame's opaques will necessarily appear on some output
-+ * packet;
-+ * - every output packet will have some non-NULL opaque value.
-+ * .
-+ * When an output packet contains multiple frames, the opaque values will be
-+ * taken from the first of those.
-+ *
-+ * @note
-+ * The converse holds for decoders, with frames and packets switched.
-+ */
-+#define AV_CODEC_FLAG_COPY_OPAQUE (1 << 7)
-+/**
-+ * Signal to the encoder that the values of AVFrame.duration are valid and
-+ * should be used (typically for transferring them to output packets).
-+ *
-+ * If this flag is not set, frame durations are ignored.
-+ */
-+#define AV_CODEC_FLAG_FRAME_DURATION (1 << 8)
-+/**
-+ * Use internal 2pass ratecontrol in first pass mode.
-+ */
-+#define AV_CODEC_FLAG_PASS1 (1 << 9)
-+/**
-+ * Use internal 2pass ratecontrol in second pass mode.
-+ */
-+#define AV_CODEC_FLAG_PASS2 (1 << 10)
-+/**
-+ * loop filter.
-+ */
-+#define AV_CODEC_FLAG_LOOP_FILTER (1 << 11)
-+/**
-+ * Only decode/encode grayscale.
-+ */
-+#define AV_CODEC_FLAG_GRAY (1 << 13)
-+/**
-+ * error[?] variables will be set during encoding.
-+ */
-+#define AV_CODEC_FLAG_PSNR (1 << 15)
-+/**
-+ * Use interlaced DCT.
-+ */
-+#define AV_CODEC_FLAG_INTERLACED_DCT (1 << 18)
-+/**
-+ * Force low delay.
-+ */
-+#define AV_CODEC_FLAG_LOW_DELAY (1 << 19)
-+/**
-+ * Place global headers in extradata instead of every keyframe.
-+ */
-+#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
-+/**
-+ * Use only bitexact stuff (except (I)DCT).
-+ */
-+#define AV_CODEC_FLAG_BITEXACT (1 << 23)
-+/* Fx : Flag for H.263+ extra options */
-+/**
-+ * H.263 advanced intra coding / MPEG-4 AC prediction
-+ */
-+#define AV_CODEC_FLAG_AC_PRED (1 << 24)
-+/**
-+ * interlaced motion estimation
-+ */
-+#define AV_CODEC_FLAG_INTERLACED_ME (1 << 29)
-+#define AV_CODEC_FLAG_CLOSED_GOP (1U << 31)
-+
-+/**
-+ * Allow non spec compliant speedup tricks.
-+ */
-+#define AV_CODEC_FLAG2_FAST (1 << 0)
-+/**
-+ * Skip bitstream encoding.
-+ */
-+#define AV_CODEC_FLAG2_NO_OUTPUT (1 << 2)
-+/**
-+ * Place global headers at every keyframe instead of in extradata.
-+ */
-+#define AV_CODEC_FLAG2_LOCAL_HEADER (1 << 3)
-+
-+/**
-+ * Input bitstream might be truncated at a packet boundaries
-+ * instead of only at frame boundaries.
-+ */
-+#define AV_CODEC_FLAG2_CHUNKS (1 << 15)
-+/**
-+ * Discard cropping information from SPS.
-+ */
-+#define AV_CODEC_FLAG2_IGNORE_CROP (1 << 16)
-+
-+/**
-+ * Show all frames before the first keyframe
-+ */
-+#define AV_CODEC_FLAG2_SHOW_ALL (1 << 22)
-+/**
-+ * Export motion vectors through frame side data
-+ */
-+#define AV_CODEC_FLAG2_EXPORT_MVS (1 << 28)
-+/**
-+ * Do not skip samples and export skip information as frame side data
-+ */
-+#define AV_CODEC_FLAG2_SKIP_MANUAL (1 << 29)
-+/**
-+ * Do not reset ASS ReadOrder field on flush (subtitles decoding)
-+ */
-+#define AV_CODEC_FLAG2_RO_FLUSH_NOOP (1 << 30)
-+/**
-+ * Generate/parse ICC profiles on encode/decode, as appropriate for the type of
-+ * file. No effect on codecs which cannot contain embedded ICC profiles, or
-+ * when compiled without support for lcms2.
-+ */
-+#define AV_CODEC_FLAG2_ICC_PROFILES (1U << 31)
-+
-+/* 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)
-+/**
-+ * Decoding only.
-+ * Export the AVVideoEncParams structure through frame side data.
-+ */
-+#define AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS (1 << 2)
-+/**
-+ * Decoding only.
-+ * Do not apply film grain, export it instead.
-+ */
-+#define AV_CODEC_EXPORT_DATA_FILM_GRAIN (1 << 3)
-+
-+/**
-+ * The decoder will keep a reference to the frame and may reuse it later.
-+ */
-+#define AV_GET_BUFFER_FLAG_REF (1 << 0)
-+
-+/**
-+ * The encoder will keep a reference to the packet and may reuse it later.
-+ */
-+#define AV_GET_ENCODE_BUFFER_FLAG_REF (1 << 0)
-+
-+/**
-+ * main external API structure.
-+ * New fields can be added to the end with minor version bumps.
-+ * Removal, reordering and changes to existing fields require a major
-+ * version bump.
-+ * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from
-+ * user applications. The name string for AVOptions options matches the
-+ * associated command line parameter name and can be found in
-+ * libavcodec/options_table.h The AVOption/command line parameter names differ
-+ * in some cases from the C structure field names for historic reasons or
-+ * brevity. sizeof(AVCodecContext) must not be used outside libav*.
-+ */
-+typedef struct AVCodecContext {
-+  /**
-+   * information on struct for av_log
-+   * - set by avcodec_alloc_context3
-+   */
-+  const AVClass* av_class;
-+  int log_level_offset;
-+
-+  enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */
-+  const struct AVCodec* codec;
-+  enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */
-+
-+  /**
-+   * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
-+   * This is used to work around some encoder bugs.
-+   * A demuxer should set this to what is stored in the field used to identify
-+   * the codec. If there are multiple such fields in a container then the
-+   * demuxer should choose the one which maximizes the information about the
-+   * used codec. If the codec tag field in a container is larger than 32 bits
-+   * then the demuxer should remap the longer ID to 32 bits with a table or
-+   * other structure. Alternatively a new extra_codec_tag + size could be added
-+   * but for this a clear advantage must be demonstrated first.
-+   * - encoding: Set by user, if not then the default based on codec_id will be
-+   * used.
-+   * - decoding: Set by user, will be converted to uppercase by libavcodec
-+   * during init.
-+   */
-+  unsigned int codec_tag;
-+
-+  void* priv_data;
-+
-+  /**
-+   * Private context used for internal data.
-+   *
-+   * Unlike priv_data, this is not codec-specific. It is used in general
-+   * libavcodec functions.
-+   */
-+  struct AVCodecInternal* internal;
-+
-+  /**
-+   * Private data of the user, can be used to carry app specific stuff.
-+   * - encoding: Set by user.
-+   * - decoding: Set by user.
-+   */
-+  void* opaque;
-+
-+  /**
-+   * the average bitrate
-+   * - encoding: Set by user; unused for constant quantizer encoding.
-+   * - decoding: Set by user, may be overwritten by libavcodec
-+   *             if this info is available in the stream
-+   */
-+  int64_t bit_rate;
-+
-+  /**
-+   * AV_CODEC_FLAG_*.
-+   * - encoding: Set by user.
-+   * - decoding: Set by user.
-+   */
-+  int flags;
-+
-+  /**
-+   * AV_CODEC_FLAG2_*
-+   * - encoding: Set by user.
-+   * - decoding: Set by user.
-+   */
-+  int flags2;
-+
-+  /**
-+   * some codecs need / can use extradata like Huffman tables.
-+   * MJPEG: Huffman tables
-+   * rv10: additional flags
-+   * MPEG-4: global headers (they can be in the bitstream or here)
-+   * The allocated memory should be AV_INPUT_BUFFER_PADDING_SIZE bytes larger
-+   * than extradata_size to avoid problems if it is read with the bitstream
-+   * reader. The bytewise contents of extradata must not depend on the
-+   * architecture or CPU endianness. Must be allocated with the av_malloc()
-+   * family of functions.
-+   * - encoding: Set/allocated/freed by libavcodec.
-+   * - decoding: Set/allocated/freed by user.
-+   */
-+  uint8_t* extradata;
-+  int extradata_size;
-+
-+  /**
-+   * This is the fundamental unit of time (in seconds) in terms
-+   * of which frame timestamps are represented. For fixed-fps content,
-+   * timebase should be 1/framerate and timestamp increments should be
-+   * identically 1.
-+   * This often, but not always is the inverse of the frame rate or field rate
-+   * for video. 1/time_base is not the average frame rate if the frame rate is
-+   * not constant.
-+   *
-+   * Like containers, elementary streams also can store timestamps, 1/time_base
-+   * is the unit in which these timestamps are specified.
-+   * As example of such codec time base see ISO/IEC 14496-2:2001(E)
-+   * vop_time_increment_resolution and fixed_vop_rate
-+   * (fixed_vop_rate == 0 implies that it is different from the framerate)
-+   *
-+   * - encoding: MUST be set by user.
-+   * - decoding: unused.
-+   */
-+  AVRational time_base;
-+
-+  /**
-+   * Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
-+   * - encoding: unused.
-+   * - decoding: set by user.
-+   */
-+  AVRational pkt_timebase;
-+
-+  /**
-+   * - decoding: For codecs that store a framerate value in the compressed
-+   *             bitstream, the decoder may export it here. { 0, 1} when
-+   *             unknown.
-+   * - encoding: May be used to signal the framerate of CFR content to an
-+   *             encoder.
-+   */
-+  AVRational framerate;
-+
-+#if FF_API_TICKS_PER_FRAME
-+  /**
-+   * For some codecs, the time base is closer to the field rate than the frame
-+   * rate. Most notably, H.264 and MPEG-2 specify time_base as half of frame
-+   * duration if no telecine is used ...
-+   *
-+   * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it
-+   * to 2.
-+   *
-+   * @deprecated
-+   * - decoding: Use AVCodecDescriptor.props & AV_CODEC_PROP_FIELDS
-+   * - encoding: Set AVCodecContext.framerate instead
-+   *
-+   */
-+  attribute_deprecated int ticks_per_frame;
-+#endif
-+
-+  /**
-+   * Codec delay.
-+   *
-+   * Encoding: Number of frames delay there will be from the encoder input to
-+   *           the decoder output. (we assume the decoder matches the spec)
-+   * Decoding: Number of frames delay in addition to what a standard decoder
-+   *           as specified in the spec would produce.
-+   *
-+   * Video:
-+   *   Number of frames the decoded output will be delayed relative to the
-+   *   encoded input.
-+   *
-+   * Audio:
-+   *   For encoding, this field is unused (see initial_padding).
-+   *
-+   *   For decoding, this is the number of samples the decoder needs to
-+   *   output before the decoder's output is valid. When seeking, you should
-+   *   start decoding this many samples prior to your desired seek point.
-+   *
-+   * - encoding: Set by libavcodec.
-+   * - decoding: Set by libavcodec.
-+   */
-+  int delay;
-+
-+  /* video only */
-+  /**
-+   * picture width / height.
-+   *
-+   * @note Those fields may not match the values of the last
-+   * AVFrame output by avcodec_receive_frame() due frame
-+   * reordering.
-+   *
-+   * - encoding: MUST be set by user.
-+   * - decoding: May be set by the user before opening the decoder if known e.g.
-+   *             from the container. Some decoders will require the dimensions
-+   *             to be set by the caller. During decoding, the decoder may
-+   *             overwrite those values as required while parsing the data.
-+   */
-+  int width, height;
-+
-+  /**
-+   * Bitstream width / height, may be different from width/height e.g. when
-+   * the decoded frame is cropped before being output or lowres is enabled.
-+   *
-+   * @note Those field may not match the value of the last
-+   * AVFrame output by avcodec_receive_frame() due frame
-+   * reordering.
-+   *
-+   * - encoding: unused
-+   * - decoding: May be set by the user before opening the decoder if known
-+   *             e.g. from the container. During decoding, the decoder may
-+   *             overwrite those values as required while parsing the data.
-+   */
-+  int coded_width, coded_height;
-+
-+  /**
-+   * sample aspect ratio (0 if unknown)
-+   * That is the width of a pixel divided by the height of the pixel.
-+   * Numerator and denominator must be relatively prime and smaller than 256 for
-+   * some video standards.
-+   * - encoding: Set by user.
-+   * - decoding: Set by libavcodec.
-+   */
-+  AVRational sample_aspect_ratio;
-+
-+  /**
-+   * Pixel format, see AV_PIX_FMT_xxx.
-+   * May be set by the demuxer if known from headers.
-+   * May be overridden by the decoder if it knows better.
-+   *
-+   * @note This field may not match the value of the last
-+   * AVFrame output by avcodec_receive_frame() due frame
-+   * reordering.
-+   *
-+   * - encoding: Set by user.
-+   * - decoding: Set by user if known, overridden by libavcodec while
-+   *             parsing the data.
-+   */
-+  enum AVPixelFormat pix_fmt;
-+
-+  /**
-+   * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
-+   * - encoding: unused.
-+   * - decoding: Set by libavcodec before calling get_format()
-+   */
-+  enum AVPixelFormat sw_pix_fmt;
-+
-+  /**
-+   * Chromaticity coordinates of the source primaries.
-+   * - encoding: Set by user
-+   * - decoding: Set by libavcodec
-+   */
-+  enum AVColorPrimaries color_primaries;
-+
-+  /**
-+   * Color Transfer Characteristic.
-+   * - encoding: Set by user
-+   * - decoding: Set by libavcodec
-+   */
-+  enum AVColorTransferCharacteristic color_trc;
-+
-+  /**
-+   * YUV colorspace type.
-+   * - encoding: Set by user
-+   * - decoding: Set by libavcodec
-+   */
-+  enum AVColorSpace colorspace;
-+
-+  /**
-+   * MPEG vs JPEG YUV range.
-+   * - encoding: Set by user to override the default output color range value,
-+   *   If not specified, libavcodec sets the color range depending on the
-+   *   output format.
-+   * - decoding: Set by libavcodec, can be set by the user to propagate the
-+   *   color range to components reading from the decoder context.
-+   */
-+  enum AVColorRange color_range;
-+
-+  /**
-+   * This defines the location of chroma samples.
-+   * - encoding: Set by user
-+   * - decoding: Set by libavcodec
-+   */
-+  enum AVChromaLocation chroma_sample_location;
-+
-+  /** Field order
-+   * - encoding: set by libavcodec
-+   * - decoding: Set by user.
-+   */
-+  enum AVFieldOrder field_order;
-+
-+  /**
-+   * number of reference frames
-+   * - encoding: Set by user.
-+   * - decoding: Set by lavc.
-+   */
-+  int refs;
-+
-+  /**
-+   * Size of the frame reordering buffer in the decoder.
-+   * For MPEG-2 it is 1 IPB or 0 low delay IP.
-+   * - encoding: Set by libavcodec.
-+   * - decoding: Set by libavcodec.
-+   */
-+  int has_b_frames;
-+
-+  /**
-+   * slice flags
-+   * - encoding: unused
-+   * - decoding: Set by user.
-+   */
-+  int slice_flags;
-+#define SLICE_FLAG_CODED_ORDER \
-+  0x0001  ///< draw_horiz_band() is called in coded order instead of display
-+#define SLICE_FLAG_ALLOW_FIELD \
-+  0x0002  ///< allow draw_horiz_band() with field slices (MPEG-2 field pics)
-+#define SLICE_FLAG_ALLOW_PLANE \
-+  0x0004  ///< allow draw_horiz_band() with 1 component at a time (SVQ1)
-+
-+  /**
-+   * If non NULL, 'draw_horiz_band' is called by the libavcodec
-+   * decoder to draw a horizontal band. It improves cache usage. Not
-+   * all codecs can do that. You must check the codec capabilities
-+   * beforehand.
-+   * When multithreading is used, it may be called from multiple threads
-+   * at the same time; threads might draw different parts of the same AVFrame,
-+   * or multiple AVFrames, and there is no guarantee that slices will be drawn
-+   * in order.
-+   * The function is also used by hardware acceleration APIs.
-+   * It is called at least once during frame decoding to pass
-+   * the data needed for hardware render.
-+   * In that mode instead of pixel data, AVFrame points to
-+   * a structure specific to the acceleration API. The application
-+   * reads the structure and can change some fields to indicate progress
-+   * or mark state.
-+   * - encoding: unused
-+   * - decoding: Set by user.
-+   * @param height the height of the slice
-+   * @param y the y position of the slice
-+   * @param type 1->top field, 2->bottom field, 3->frame
-+   * @param offset offset into the AVFrame.data from which the slice should be
-+   * read
-+   */
-+  void (*draw_horiz_band)(struct AVCodecContext* s, const AVFrame* src,
-+                          int offset[AV_NUM_DATA_POINTERS], int y, int type,
-+                          int height);
-+
-+  /**
-+   * Callback to negotiate the pixel format. Decoding only, may be set by the
-+   * caller before avcodec_open2().
-+   *
-+   * Called by some decoders to select the pixel format that will be used for
-+   * the output frames. This is mainly used to set up hardware acceleration,
-+   * then the provided format list contains the corresponding hwaccel pixel
-+   * formats alongside the "software" one. The software pixel format may also
-+   * be retrieved from \ref sw_pix_fmt.
-+   *
-+   * This callback will be called when the coded frame properties (such as
-+   * resolution, pixel format, etc.) change and more than one output format is
-+   * supported for those new properties. If a hardware pixel format is chosen
-+   * and initialization for it fails, the callback may be called again
-+   * immediately.
-+   *
-+   * This callback may be called from different threads if the decoder is
-+   * multi-threaded, but not from more than one thread simultaneously.
-+   *
-+   * @param fmt list of formats which may be used in the current
-+   *            configuration, terminated by AV_PIX_FMT_NONE.
-+   * @warning Behavior is undefined if the callback returns a value other
-+   *          than one of the formats in fmt or AV_PIX_FMT_NONE.
-+   * @return the chosen format or AV_PIX_FMT_NONE
-+   */
-+  enum AVPixelFormat (*get_format)(struct AVCodecContext* s,
-+                                   const enum AVPixelFormat* fmt);
-+
-+  /**
-+   * maximum number of B-frames between non-B-frames
-+   * Note: The output will be delayed by max_b_frames+1 relative to the input.
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int max_b_frames;
-+
-+  /**
-+   * qscale factor between IP and B-frames
-+   * If > 0 then the last P-frame quantizer will be used (q=
-+   * lastp_q*factor+offset). If < 0 then normal ratecontrol will be done (q=
-+   * -normal_q*factor+offset).
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  float b_quant_factor;
-+
-+  /**
-+   * qscale offset between IP and B-frames
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  float b_quant_offset;
-+
-+  /**
-+   * qscale factor between P- and I-frames
-+   * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor +
-+   * offset). If < 0 then normal ratecontrol will be done (q=
-+   * -normal_q*factor+offset).
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  float i_quant_factor;
-+
-+  /**
-+   * qscale offset between P and I-frames
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  float i_quant_offset;
-+
-+  /**
-+   * luminance masking (0-> disabled)
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  float lumi_masking;
-+
-+  /**
-+   * temporary complexity masking (0-> disabled)
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  float temporal_cplx_masking;
-+
-+  /**
-+   * spatial complexity masking (0-> disabled)
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  float spatial_cplx_masking;
-+
-+  /**
-+   * p block masking (0-> disabled)
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  float p_masking;
-+
-+  /**
-+   * darkness masking (0-> disabled)
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  float dark_masking;
-+
-+  /**
-+   * noise vs. sse weight for the nsse comparison function
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int nsse_weight;
-+
-+  /**
-+   * motion estimation comparison function
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int me_cmp;
-+  /**
-+   * subpixel motion estimation comparison function
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int me_sub_cmp;
-+  /**
-+   * macroblock comparison function (not supported yet)
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int mb_cmp;
-+  /**
-+   * interlaced DCT comparison function
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int ildct_cmp;
-+#define FF_CMP_SAD 0
-+#define FF_CMP_SSE 1
-+#define FF_CMP_SATD 2
-+#define FF_CMP_DCT 3
-+#define FF_CMP_PSNR 4
-+#define FF_CMP_BIT 5
-+#define FF_CMP_RD 6
-+#define FF_CMP_ZERO 7
-+#define FF_CMP_VSAD 8
-+#define FF_CMP_VSSE 9
-+#define FF_CMP_NSSE 10
-+#define FF_CMP_W53 11
-+#define FF_CMP_W97 12
-+#define FF_CMP_DCTMAX 13
-+#define FF_CMP_DCT264 14
-+#define FF_CMP_MEDIAN_SAD 15
-+#define FF_CMP_CHROMA 256
-+
-+  /**
-+   * ME diamond size & shape
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int dia_size;
-+
-+  /**
-+   * amount of previous MV predictors (2a+1 x 2a+1 square)
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int last_predictor_count;
-+
-+  /**
-+   * motion estimation prepass comparison function
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int me_pre_cmp;
-+
-+  /**
-+   * ME prepass diamond size & shape
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int pre_dia_size;
-+
-+  /**
-+   * subpel ME quality
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int me_subpel_quality;
-+
-+  /**
-+   * maximum motion estimation search range in subpel units
-+   * If 0 then no limit.
-+   *
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int me_range;
-+
-+  /**
-+   * macroblock decision mode
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int mb_decision;
-+#define FF_MB_DECISION_SIMPLE 0  ///< uses mb_cmp
-+#define FF_MB_DECISION_BITS 1  ///< chooses the one which needs the fewest bits
-+#define FF_MB_DECISION_RD 2    ///< rate distortion
-+
-+  /**
-+   * custom intra quantization matrix
-+   * 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
-+   * 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;
-+
-+  /**
-+   * custom intra quantization matrix
-+   * - encoding: Set by user, can be NULL.
-+   * - decoding: unused.
-+   */
-+  uint16_t* chroma_intra_matrix;
-+
-+  /**
-+   * precision of the intra DC coefficient - 8
-+   * - encoding: Set by user.
-+   * - decoding: Set by libavcodec
-+   */
-+  int intra_dc_precision;
-+
-+  /**
-+   * minimum MB Lagrange multiplier
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int mb_lmin;
-+
-+  /**
-+   * maximum MB Lagrange multiplier
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int mb_lmax;
-+
-+  /**
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int bidir_refine;
-+
-+  /**
-+   * minimum GOP size
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int keyint_min;
-+
-+  /**
-+   * the number of pictures in a group of pictures, or 0 for intra_only
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int gop_size;
-+
-+  /**
-+   * Note: Value depends upon the compare function used for fullpel ME.
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int mv0_threshold;
-+
-+  /**
-+   * Number of slices.
-+   * Indicates number of picture subdivisions. Used for parallelized
-+   * decoding.
-+   * - encoding: Set by user
-+   * - decoding: unused
-+   */
-+  int slices;
-+
-+  /* audio only */
-+  int sample_rate;  ///< samples per second
-+
-+  /**
-+   * audio sample format
-+   * - encoding: Set by user.
-+   * - decoding: Set by libavcodec.
-+   */
-+  enum AVSampleFormat sample_fmt;  ///< sample format
-+
-+  /**
-+   * Audio channel layout.
-+   * - encoding: must be set by the caller, to one of AVCodec.ch_layouts.
-+   * - decoding: may be set by the caller if known e.g. from the container.
-+   *             The decoder can then override during decoding as needed.
-+   */
-+  AVChannelLayout ch_layout;
-+
-+  /* The following data should not be initialized. */
-+  /**
-+   * Number of samples per channel in an audio frame.
-+   *
-+   * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame
-+   *   except the last must contain exactly frame_size samples per channel.
-+   *   May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then
-+   * the frame size is not restricted.
-+   * - decoding: may be set by some decoders to indicate constant frame size
-+   */
-+  int frame_size;
-+
-+  /**
-+   * number of bytes per packet if constant and known or 0
-+   * Used by some WAV based audio codecs.
-+   */
-+  int block_align;
-+
-+  /**
-+   * Audio cutoff bandwidth (0 means "automatic")
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int cutoff;
-+
-+  /**
-+   * Type of service that the audio stream conveys.
-+   * - encoding: Set by user.
-+   * - decoding: Set by libavcodec.
-+   */
-+  enum AVAudioServiceType audio_service_type;
-+
-+  /**
-+   * desired sample format
-+   * - encoding: Not used.
-+   * - decoding: Set by user.
-+   * Decoder will decode to this format if it can.
-+   */
-+  enum AVSampleFormat request_sample_fmt;
-+
-+  /**
-+   * Audio only. The number of "priming" samples (padding) inserted by the
-+   * encoder at the beginning of the audio. I.e. this number of leading
-+   * decoded samples must be discarded by the caller to get the original audio
-+   * without leading padding.
-+   *
-+   * - decoding: unused
-+   * - encoding: Set by libavcodec. The timestamps on the output packets are
-+   *             adjusted by the encoder so that they always refer to the
-+   *             first sample of the data actually contained in the packet,
-+   *             including any added padding.  E.g. if the timebase is
-+   *             1/samplerate and the timestamp of the first input sample is
-+   *             0, the timestamp of the first output packet will be
-+   *             -initial_padding.
-+   */
-+  int initial_padding;
-+
-+  /**
-+   * Audio only. The amount of padding (in samples) appended by the encoder to
-+   * the end of the audio. I.e. this number of decoded samples must be
-+   * discarded by the caller from the end of the stream to get the original
-+   * audio without any trailing padding.
-+   *
-+   * - decoding: unused
-+   * - encoding: unused
-+   */
-+  int trailing_padding;
-+
-+  /**
-+   * Number of samples to skip after a discontinuity
-+   * - decoding: unused
-+   * - encoding: set by libavcodec
-+   */
-+  int seek_preroll;
-+
-+  /**
-+   * This callback is called at the beginning of each frame to get data
-+   * buffer(s) for it. There may be one contiguous buffer for all the data or
-+   * there may be a buffer per each data plane or anything in between. What
-+   * this means is, you may set however many entries in buf[] you feel
-+   * necessary. Each buffer must be reference-counted using the AVBuffer API
-+   * (see description of buf[] below).
-+   *
-+   * The following fields will be set in the frame before this callback is
-+   * called:
-+   * - format
-+   * - width, height (video only)
-+   * - sample_rate, channel_layout, nb_samples (audio only)
-+   * Their values may differ from the corresponding values in
-+   * AVCodecContext. This callback must use the frame values, not the codec
-+   * context values, to calculate the required buffer size.
-+   *
-+   * This callback must fill the following fields in the frame:
-+   * - data[]
-+   * - linesize[]
-+   * - extended_data:
-+   *   * if the data is planar audio with more than 8 channels, then this
-+   *     callback must allocate and fill extended_data to contain all pointers
-+   *     to all data planes. data[] must hold as many pointers as it can.
-+   *     extended_data must be allocated with av_malloc() and will be freed in
-+   *     av_frame_unref().
-+   *   * otherwise extended_data must point to data
-+   * - buf[] must contain one or more pointers to AVBufferRef structures. Each
-+   * of the frame's data and extended_data pointers must be contained in these.
-+   * That is, one AVBufferRef for each allocated chunk of memory, not
-+   * necessarily one AVBufferRef per data[] entry. See: av_buffer_create(),
-+   * av_buffer_alloc(), and av_buffer_ref().
-+   * - extended_buf and nb_extended_buf must be allocated with av_malloc() by
-+   *   this callback and filled with the extra buffers if there are more
-+   *   buffers than buf[] can hold. extended_buf will be freed in
-+   *   av_frame_unref().
-+   *
-+   * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call
-+   * avcodec_default_get_buffer2() instead of providing buffers allocated by
-+   * some other means.
-+   *
-+   * Each data plane must be aligned to the maximum required by the target
-+   * CPU.
-+   *
-+   * @see avcodec_default_get_buffer2()
-+   *
-+   * Video:
-+   *
-+   * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused
-+   * (read and/or written to if it is writable) later by libavcodec.
-+   *
-+   * avcodec_align_dimensions2() should be used to find the required width and
-+   * height, as they normally need to be rounded up to the next multiple of 16.
-+   *
-+   * Some decoders do not support linesizes changing between frames.
-+   *
-+   * If frame multithreading is used, this callback may be called from a
-+   * different thread, but not from more than one at once. Does not need to be
-+   * reentrant.
-+   *
-+   * @see avcodec_align_dimensions2()
-+   *
-+   * Audio:
-+   *
-+   * Decoders request a buffer of a particular size by setting
-+   * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may,
-+   * however, utilize only part of the buffer by setting AVFrame.nb_samples
-+   * to a smaller value in the output frame.
-+   *
-+   * As a convenience, av_samples_get_buffer_size() and
-+   * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2()
-+   * functions to find the required data size and to fill data pointers and
-+   * linesize. In AVFrame.linesize, only linesize[0] may be set for audio
-+   * since all planes must be the same size.
-+   *
-+   * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
-+   *
-+   * - encoding: unused
-+   * - decoding: Set by libavcodec, user can override.
-+   */
-+  int (*get_buffer2)(struct AVCodecContext* s, AVFrame* frame, int flags);
-+
-+  /* - encoding parameters */
-+  /**
-+   * number of bits the bitstream is allowed to diverge from the reference.
-+   *           the reference can be CBR (for CBR pass1) or VBR (for pass2)
-+   * - encoding: Set by user; unused for constant quantizer encoding.
-+   * - decoding: unused
-+   */
-+  int bit_rate_tolerance;
-+
-+  /**
-+   * Global quality for codecs which cannot change it per frame.
-+   * This should be proportional to MPEG-1/2/4 qscale.
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int global_quality;
-+
-+  /**
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int compression_level;
-+#define FF_COMPRESSION_DEFAULT -1
-+
-+  float qcompress;  ///< amount of qscale change between easy & hard scenes
-+                    ///< (0.0-1.0)
-+  float qblur;      ///< amount of qscale smoothing over time (0.0-1.0)
-+
-+  /**
-+   * minimum quantizer
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int qmin;
-+
-+  /**
-+   * maximum quantizer
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int qmax;
-+
-+  /**
-+   * maximum quantizer difference between frames
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int max_qdiff;
-+
-+  /**
-+   * decoder bitstream buffer size
-+   * - encoding: Set by user.
-+   * - decoding: May be set by libavcodec.
-+   */
-+  int rc_buffer_size;
-+
-+  /**
-+   * ratecontrol override, see RcOverride
-+   * - encoding: Allocated/set/freed by user.
-+   * - decoding: unused
-+   */
-+  int rc_override_count;
-+  RcOverride* rc_override;
-+
-+  /**
-+   * maximum bitrate
-+   * - encoding: Set by user.
-+   * - decoding: Set by user, may be overwritten by libavcodec.
-+   */
-+  int64_t rc_max_rate;
-+
-+  /**
-+   * minimum bitrate
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int64_t rc_min_rate;
-+
-+  /**
-+   * Ratecontrol attempt to use, at maximum, <value> of what can be used without
-+   * an underflow.
-+   * - encoding: Set by user.
-+   * - decoding: unused.
-+   */
-+  float rc_max_available_vbv_use;
-+
-+  /**
-+   * Ratecontrol attempt to use, at least, <value> times the amount needed to
-+   * prevent a vbv overflow.
-+   * - encoding: Set by user.
-+   * - decoding: unused.
-+   */
-+  float rc_min_vbv_overflow_use;
-+
-+  /**
-+   * Number of bits which should be loaded into the rc buffer before decoding
-+   * starts.
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int rc_initial_buffer_occupancy;
-+
-+  /**
-+   * trellis RD quantization
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int trellis;
-+
-+  /**
-+   * pass1 encoding statistics output buffer
-+   * - encoding: Set by libavcodec.
-+   * - decoding: unused
-+   */
-+  char* stats_out;
-+
-+  /**
-+   * pass2 encoding statistics input buffer
-+   * Concatenated stuff from stats_out of pass1 should be placed here.
-+   * - encoding: Allocated/set/freed by user.
-+   * - decoding: unused
-+   */
-+  char* stats_in;
-+
-+  /**
-+   * Work around bugs in encoders which sometimes cannot be detected
-+   * automatically.
-+   * - encoding: Set by user
-+   * - decoding: Set by user
-+   */
-+  int workaround_bugs;
-+#define FF_BUG_AUTODETECT 1  ///< autodetection
-+#define FF_BUG_XVID_ILACE 4
-+#define FF_BUG_UMP4 8
-+#define FF_BUG_NO_PADDING 16
-+#define FF_BUG_AMV 32
-+#define FF_BUG_QPEL_CHROMA 64
-+#define FF_BUG_STD_QPEL 128
-+#define FF_BUG_QPEL_CHROMA2 256
-+#define FF_BUG_DIRECT_BLOCKSIZE 512
-+#define FF_BUG_EDGE 1024
-+#define FF_BUG_HPEL_CHROMA 2048
-+#define FF_BUG_DC_CLIP 4096
-+#define FF_BUG_MS \
-+  8192  ///< Work around various bugs in Microsoft's broken decoders.
-+#define FF_BUG_TRUNCATED 16384
-+#define FF_BUG_IEDGE 32768
-+
-+  /**
-+   * strictly follow the standard (MPEG-4, ...).
-+   * - encoding: Set by user.
-+   * - decoding: Set by user.
-+   * Setting this to STRICT or higher means the encoder and decoder will
-+   * generally do stupid things, whereas setting it to unofficial or lower
-+   * will mean the encoder might produce output that is not supported by all
-+   * spec-compliant decoders. Decoders don't differentiate between normal,
-+   * unofficial and experimental (that is, they always try to decode things
-+   * when they can) unless they are explicitly asked to behave stupidly
-+   * (=strictly conform to the specs)
-+   * This may only be set to one of the FF_COMPLIANCE_* values in defs.h.
-+   */
-+  int strict_std_compliance;
-+
-+  /**
-+   * error concealment flags
-+   * - encoding: unused
-+   * - decoding: Set by user.
-+   */
-+  int error_concealment;
-+#define FF_EC_GUESS_MVS 1
-+#define FF_EC_DEBLOCK 2
-+#define FF_EC_FAVOR_INTER 256
-+
-+  /**
-+   * debug
-+   * - encoding: Set by user.
-+   * - decoding: Set by user.
-+   */
-+  int debug;
-+#define FF_DEBUG_PICT_INFO 1
-+#define FF_DEBUG_RC 2
-+#define FF_DEBUG_BITSTREAM 4
-+#define FF_DEBUG_MB_TYPE 8
-+#define FF_DEBUG_QP 16
-+#define FF_DEBUG_DCT_COEFF 0x00000040
-+#define FF_DEBUG_SKIP 0x00000080
-+#define FF_DEBUG_STARTCODE 0x00000100
-+#define FF_DEBUG_ER 0x00000400
-+#define FF_DEBUG_MMCO 0x00000800
-+#define FF_DEBUG_BUGS 0x00001000
-+#define FF_DEBUG_BUFFERS 0x00008000
-+#define FF_DEBUG_THREADS 0x00010000
-+#define FF_DEBUG_GREEN_MD 0x00800000
-+#define FF_DEBUG_NOMC 0x01000000
-+
-+  /**
-+   * Error recognition; may misdetect some more or less valid parts as errors.
-+   * This is a bitfield of the AV_EF_* values defined in defs.h.
-+   *
-+   * - encoding: Set by user.
-+   * - decoding: Set by user.
-+   */
-+  int err_recognition;
-+
-+  /**
-+   * Hardware accelerator in use
-+   * - encoding: unused.
-+   * - decoding: Set by libavcodec
-+   */
-+  const struct AVHWAccel* hwaccel;
-+
-+  /**
-+   * Legacy hardware accelerator context.
-+   *
-+   * For some hardware acceleration methods, the caller may use this field to
-+   * signal hwaccel-specific data to the codec. The struct pointed to by this
-+   * pointer is hwaccel-dependent and defined in the respective header. Please
-+   * refer to the FFmpeg HW accelerator documentation to know how to fill
-+   * this.
-+   *
-+   * In most cases this field is optional - the necessary information may also
-+   * be provided to libavcodec through @ref hw_frames_ctx or @ref
-+   * hw_device_ctx (see avcodec_get_hw_config()). However, in some cases it
-+   * may be the only method of signalling some (optional) information.
-+   *
-+   * The struct and its contents are owned by the caller.
-+   *
-+   * - encoding: May be set by the caller before avcodec_open2(). Must remain
-+   *             valid until avcodec_free_context().
-+   * - decoding: May be set by the caller in the get_format() callback.
-+   *             Must remain valid until the next get_format() call,
-+   *             or avcodec_free_context() (whichever comes first).
-+   */
-+  void* hwaccel_context;
-+
-+  /**
-+   * A reference to the AVHWFramesContext describing the input (for encoding)
-+   * or output (decoding) frames. The reference is set by the caller and
-+   * afterwards owned (and freed) by libavcodec - it should never be read by
-+   * the caller after being set.
-+   *
-+   * - decoding: This field should be set by the caller from the get_format()
-+   *             callback. The previous reference (if any) will always be
-+   *             unreffed by libavcodec before the get_format() call.
-+   *
-+   *             If the default get_buffer2() is used with a hwaccel pixel
-+   *             format, then this AVHWFramesContext will be used for
-+   *             allocating the frame buffers.
-+   *
-+   * - encoding: For hardware encoders configured to use a hwaccel pixel
-+   *             format, this field should be set by the caller to a reference
-+   *             to the AVHWFramesContext describing input frames.
-+   *             AVHWFramesContext.format must be equal to
-+   *             AVCodecContext.pix_fmt.
-+   *
-+   *             This field should be set before avcodec_open2() is called.
-+   */
-+  AVBufferRef* hw_frames_ctx;
-+
-+  /**
-+   * A reference to the AVHWDeviceContext describing the device which will
-+   * be used by a hardware encoder/decoder.  The reference is set by the
-+   * caller and afterwards owned (and freed) by libavcodec.
-+   *
-+   * This should be used if either the codec device does not require
-+   * hardware frames or any that are used are to be allocated internally by
-+   * libavcodec.  If the user wishes to supply any of the frames used as
-+   * encoder input or decoder output then hw_frames_ctx should be used
-+   * instead.  When hw_frames_ctx is set in get_format() for a decoder, this
-+   * field will be ignored while decoding the associated stream segment, but
-+   * may again be used on a following one after another get_format() call.
-+   *
-+   * For both encoders and decoders this field should be set before
-+   * avcodec_open2() is called and must not be written to thereafter.
-+   *
-+   * Note that some decoders may require this field to be set initially in
-+   * order to support hw_frames_ctx at all - in that case, all frames
-+   * contexts used must be created on the same device.
-+   */
-+  AVBufferRef* hw_device_ctx;
-+
-+  /**
-+   * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated
-+   * decoding (if active).
-+   * - encoding: unused
-+   * - decoding: Set by user (either before avcodec_open2(), or in the
-+   *             AVCodecContext.get_format callback)
-+   */
-+  int hwaccel_flags;
-+
-+  /**
-+   * Video decoding only.  Sets the number of extra hardware frames which
-+   * the decoder will allocate for use by the caller.  This must be set
-+   * before avcodec_open2() is called.
-+   *
-+   * Some hardware decoders require all frames that they will use for
-+   * output to be defined in advance before decoding starts.  For such
-+   * decoders, the hardware frame pool must therefore be of a fixed size.
-+   * The extra frames set here are on top of any number that the decoder
-+   * needs internally in order to operate normally (for example, frames
-+   * used as reference pictures).
-+   */
-+  int extra_hw_frames;
-+
-+  /**
-+   * error
-+   * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR.
-+   * - decoding: unused
-+   */
-+  uint64_t error[AV_NUM_DATA_POINTERS];
-+
-+  /**
-+   * DCT algorithm, see FF_DCT_* below
-+   * - encoding: Set by user.
-+   * - decoding: unused
-+   */
-+  int dct_algo;
-+#define FF_DCT_AUTO 0
-+#define FF_DCT_FASTINT 1
-+#define FF_DCT_INT 2
-+#define FF_DCT_MMX 3
-+#define FF_DCT_ALTIVEC 5
-+#define FF_DCT_FAAN 6
-+
-+  /**
-+   * IDCT algorithm, see FF_IDCT_* below.
-+   * - encoding: Set by user.
-+   * - decoding: Set by user.
-+   */
-+  int idct_algo;
-+#define FF_IDCT_AUTO 0
-+#define FF_IDCT_INT 1
-+#define FF_IDCT_SIMPLE 2
-+#define FF_IDCT_SIMPLEMMX 3
-+#define FF_IDCT_ARM 7
-+#define FF_IDCT_ALTIVEC 8
-+#define FF_IDCT_SIMPLEARM 10
-+#define FF_IDCT_XVID 14
-+#define FF_IDCT_SIMPLEARMV5TE 16
-+#define FF_IDCT_SIMPLEARMV6 17
-+#define FF_IDCT_FAAN 20
-+#define FF_IDCT_SIMPLENEON 22
-+#define FF_IDCT_SIMPLEAUTO 128
-+
-+  /**
-+   * bits per sample/pixel from the demuxer (needed for huffyuv).
-+   * - encoding: Set by libavcodec.
-+   * - decoding: Set by user.
-+   */
-+  int bits_per_coded_sample;
-+
-+  /**
-+   * Bits per sample/pixel of internal libavcodec pixel/sample format.
-+   * - encoding: set by user.
-+   * - decoding: set by libavcodec.
-+   */
-+  int bits_per_raw_sample;
-+
-+  /**
-+   * thread count
-+   * is used to decide how many independent tasks should be passed to execute()
-+   * - encoding: Set by user.
-+   * - decoding: Set by user.
-+   */
-+  int thread_count;
-+
-+  /**
-+   * Which multithreading methods to use.
-+   * Use of FF_THREAD_FRAME will increase decoding delay by one frame per
-+   * thread, so clients which cannot provide future frames should not use it.
-+   *
-+   * - encoding: Set by user, otherwise the default is used.
-+   * - decoding: Set by user, otherwise the default is used.
-+   */
-+  int thread_type;
-+#define FF_THREAD_FRAME 1  ///< Decode more than one frame at once
-+#define FF_THREAD_SLICE \
-+  2  ///< Decode more than one part of a single frame at once
-+
-+  /**
-+   * Which multithreading methods are in use by the codec.
-+   * - encoding: Set by libavcodec.
-+   * - decoding: Set by libavcodec.
-+   */
-+  int active_thread_type;
-+
-+  /**
-+   * The codec may call this to execute several independent things.
-+   * It will return only after finishing all tasks.
-+   * The user may replace this with some multithreaded implementation,
-+   * the default implementation will execute the parts serially.
-+   * @param count the number of things to execute
-+   * - encoding: Set by libavcodec, user can override.
-+   * - decoding: Set by libavcodec, user can override.
-+   */
-+  int (*execute)(struct AVCodecContext* c,
-+                 int (*func)(struct AVCodecContext* c2, void* arg), void* arg2,
-+                 int* ret, int count, int size);
-+
-+  /**
-+   * The codec may call this to execute several independent things.
-+   * It will return only after finishing all tasks.
-+   * The user may replace this with some multithreaded implementation,
-+   * the default implementation will execute the parts serially.
-+   * @param c context passed also to func
-+   * @param count the number of things to execute
-+   * @param arg2 argument passed unchanged to func
-+   * @param ret return values of executed functions, must have space for "count"
-+   * values. May be NULL.
-+   * @param func function that will be called count times, with jobnr from 0 to
-+   * count-1. threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS
-+   * and so that no two instances of func executing at the same time will have
-+   * the same threadnr.
-+   * @return always 0 currently, but code should handle a future improvement
-+   * where when any call to func returns < 0 no further calls to func may be
-+   * done and < 0 is returned.
-+   * - encoding: Set by libavcodec, user can override.
-+   * - decoding: Set by libavcodec, user can override.
-+   */
-+  int (*execute2)(struct AVCodecContext* c,
-+                  int (*func)(struct AVCodecContext* c2, void* arg, int jobnr,
-+                              int threadnr),
-+                  void* arg2, int* ret, int count);
-+
-+  /**
-+   * profile
-+   * - encoding: Set by user.
-+   * - decoding: Set by libavcodec.
-+   * See the AV_PROFILE_* defines in defs.h.
-+   */
-+  int profile;
-+#if FF_API_FF_PROFILE_LEVEL
-+  /** @deprecated The following defines are deprecated; use AV_PROFILE_*
-+   * in defs.h instead. */
-+#  define FF_PROFILE_UNKNOWN -99
-+#  define FF_PROFILE_RESERVED -100
-+
-+#  define FF_PROFILE_AAC_MAIN 0
-+#  define FF_PROFILE_AAC_LOW 1
-+#  define FF_PROFILE_AAC_SSR 2
-+#  define FF_PROFILE_AAC_LTP 3
-+#  define FF_PROFILE_AAC_HE 4
-+#  define FF_PROFILE_AAC_HE_V2 28
-+#  define FF_PROFILE_AAC_LD 22
-+#  define FF_PROFILE_AAC_ELD 38
-+#  define FF_PROFILE_MPEG2_AAC_LOW 128
-+#  define FF_PROFILE_MPEG2_AAC_HE 131
-+
-+#  define FF_PROFILE_DNXHD 0
-+#  define FF_PROFILE_DNXHR_LB 1
-+#  define FF_PROFILE_DNXHR_SQ 2
-+#  define FF_PROFILE_DNXHR_HQ 3
-+#  define FF_PROFILE_DNXHR_HQX 4
-+#  define FF_PROFILE_DNXHR_444 5
-+
-+#  define FF_PROFILE_DTS 20
-+#  define FF_PROFILE_DTS_ES 30
-+#  define FF_PROFILE_DTS_96_24 40
-+#  define FF_PROFILE_DTS_HD_HRA 50
-+#  define FF_PROFILE_DTS_HD_MA 60
-+#  define FF_PROFILE_DTS_EXPRESS 70
-+#  define FF_PROFILE_DTS_HD_MA_X 61
-+#  define FF_PROFILE_DTS_HD_MA_X_IMAX 62
-+
-+#  define FF_PROFILE_EAC3_DDP_ATMOS 30
-+
-+#  define FF_PROFILE_TRUEHD_ATMOS 30
-+
-+#  define FF_PROFILE_MPEG2_422 0
-+#  define FF_PROFILE_MPEG2_HIGH 1
-+#  define FF_PROFILE_MPEG2_SS 2
-+#  define FF_PROFILE_MPEG2_SNR_SCALABLE 3
-+#  define FF_PROFILE_MPEG2_MAIN 4
-+#  define FF_PROFILE_MPEG2_SIMPLE 5
-+
-+#  define FF_PROFILE_H264_CONSTRAINED (1 << 9)  // 8+1; constraint_set1_flag
-+#  define FF_PROFILE_H264_INTRA (1 << 11)       // 8+3; constraint_set3_flag
-+
-+#  define FF_PROFILE_H264_BASELINE 66
-+#  define FF_PROFILE_H264_CONSTRAINED_BASELINE \
-+    (66 | FF_PROFILE_H264_CONSTRAINED)
-+#  define FF_PROFILE_H264_MAIN 77
-+#  define FF_PROFILE_H264_EXTENDED 88
-+#  define FF_PROFILE_H264_HIGH 100
-+#  define FF_PROFILE_H264_HIGH_10 110
-+#  define FF_PROFILE_H264_HIGH_10_INTRA (110 | FF_PROFILE_H264_INTRA)
-+#  define FF_PROFILE_H264_MULTIVIEW_HIGH 118
-+#  define FF_PROFILE_H264_HIGH_422 122
-+#  define FF_PROFILE_H264_HIGH_422_INTRA (122 | FF_PROFILE_H264_INTRA)
-+#  define FF_PROFILE_H264_STEREO_HIGH 128
-+#  define FF_PROFILE_H264_HIGH_444 144
-+#  define FF_PROFILE_H264_HIGH_444_PREDICTIVE 244
-+#  define FF_PROFILE_H264_HIGH_444_INTRA (244 | FF_PROFILE_H264_INTRA)
-+#  define FF_PROFILE_H264_CAVLC_444 44
-+
-+#  define FF_PROFILE_VC1_SIMPLE 0
-+#  define FF_PROFILE_VC1_MAIN 1
-+#  define FF_PROFILE_VC1_COMPLEX 2
-+#  define FF_PROFILE_VC1_ADVANCED 3
-+
-+#  define FF_PROFILE_MPEG4_SIMPLE 0
-+#  define FF_PROFILE_MPEG4_SIMPLE_SCALABLE 1
-+#  define FF_PROFILE_MPEG4_CORE 2
-+#  define FF_PROFILE_MPEG4_MAIN 3
-+#  define FF_PROFILE_MPEG4_N_BIT 4
-+#  define FF_PROFILE_MPEG4_SCALABLE_TEXTURE 5
-+#  define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6
-+#  define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7
-+#  define FF_PROFILE_MPEG4_HYBRID 8
-+#  define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME 9
-+#  define FF_PROFILE_MPEG4_CORE_SCALABLE 10
-+#  define FF_PROFILE_MPEG4_ADVANCED_CODING 11
-+#  define FF_PROFILE_MPEG4_ADVANCED_CORE 12
-+#  define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
-+#  define FF_PROFILE_MPEG4_SIMPLE_STUDIO 14
-+#  define FF_PROFILE_MPEG4_ADVANCED_SIMPLE 15
-+
-+#  define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1
-+#  define FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2
-+#  define FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768
-+#  define FF_PROFILE_JPEG2000_DCINEMA_2K 3
-+#  define FF_PROFILE_JPEG2000_DCINEMA_4K 4
-+
-+#  define FF_PROFILE_VP9_0 0
-+#  define FF_PROFILE_VP9_1 1
-+#  define FF_PROFILE_VP9_2 2
-+#  define FF_PROFILE_VP9_3 3
-+
-+#  define FF_PROFILE_HEVC_MAIN 1
-+#  define FF_PROFILE_HEVC_MAIN_10 2
-+#  define FF_PROFILE_HEVC_MAIN_STILL_PICTURE 3
-+#  define FF_PROFILE_HEVC_REXT 4
-+#  define FF_PROFILE_HEVC_SCC 9
-+
-+#  define FF_PROFILE_VVC_MAIN_10 1
-+#  define FF_PROFILE_VVC_MAIN_10_444 33
-+
-+#  define FF_PROFILE_AV1_MAIN 0
-+#  define FF_PROFILE_AV1_HIGH 1
-+#  define FF_PROFILE_AV1_PROFESSIONAL 2
-+
-+#  define FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT 0xc0
-+#  define FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1
-+#  define FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT 0xc2
-+#  define FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS 0xc3
-+#  define FF_PROFILE_MJPEG_JPEG_LS 0xf7
-+
-+#  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
-+
-+#  define FF_PROFILE_KLVA_SYNC 0
-+#  define FF_PROFILE_KLVA_ASYNC 1
-+
-+#  define FF_PROFILE_EVC_BASELINE 0
-+#  define FF_PROFILE_EVC_MAIN 1
-+#endif
-+
-+  /**
-+   * Encoding level descriptor.
-+   * - encoding: Set by user, corresponds to a specific level defined by the
-+   *   codec, usually corresponding to the profile level, if not specified it
-+   *   is set to FF_LEVEL_UNKNOWN.
-+   * - decoding: Set by libavcodec.
-+   * See AV_LEVEL_* in defs.h.
-+   */
-+  int level;
-+#if FF_API_FF_PROFILE_LEVEL
-+  /** @deprecated The following define is deprecated; use AV_LEVEL_UNKOWN
-+   * in defs.h instead. */
-+#  define FF_LEVEL_UNKNOWN -99
-+#endif
-+
-+  /**
-+   * Properties of the stream that gets decoded
-+   * - encoding: unused
-+   * - decoding: set by libavcodec
-+   */
-+  unsigned properties;
-+#define FF_CODEC_PROPERTY_LOSSLESS 0x00000001
-+#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002
-+#define FF_CODEC_PROPERTY_FILM_GRAIN 0x00000004
-+
-+  /**
-+   * Skip loop filtering for selected frames.
-+   * - encoding: unused
-+   * - decoding: Set by user.
-+   */
-+  enum AVDiscard skip_loop_filter;
-+
-+  /**
-+   * Skip IDCT/dequantization for selected frames.
-+   * - encoding: unused
-+   * - decoding: Set by user.
-+   */
-+  enum AVDiscard skip_idct;
-+
-+  /**
-+   * Skip decoding for selected frames.
-+   * - encoding: unused
-+   * - decoding: Set by user.
-+   */
-+  enum AVDiscard skip_frame;
-+
-+  /**
-+   * Skip processing alpha if supported by codec.
-+   * Note that if the format uses pre-multiplied alpha (common with VP6,
-+   * and recommended due to better video quality/compression)
-+   * the image will look as if alpha-blended onto a black background.
-+   * However for formats that do not use pre-multiplied alpha
-+   * there might be serious artefacts (though e.g. libswscale currently
-+   * assumes pre-multiplied alpha anyway).
-+   *
-+   * - decoding: set by user
-+   * - encoding: unused
-+   */
-+  int skip_alpha;
-+
-+  /**
-+   * Number of macroblock rows at the top which are skipped.
-+   * - encoding: unused
-+   * - decoding: Set by user.
-+   */
-+  int skip_top;
-+
-+  /**
-+   * Number of macroblock rows at the bottom which are skipped.
-+   * - encoding: unused
-+   * - decoding: Set by user.
-+   */
-+  int skip_bottom;
-+
-+  /**
-+   * low resolution decoding, 1-> 1/2 size, 2->1/4 size
-+   * - encoding: unused
-+   * - decoding: Set by user.
-+   */
-+  int lowres;
-+
-+  /**
-+   * AVCodecDescriptor
-+   * - encoding: unused.
-+   * - decoding: set by libavcodec.
-+   */
-+  const struct AVCodecDescriptor* codec_descriptor;
-+
-+  /**
-+   * Character encoding of the input subtitles file.
-+   * - decoding: set by user
-+   * - encoding: unused
-+   */
-+  char* sub_charenc;
-+
-+  /**
-+   * Subtitles character encoding mode. Formats or codecs might be adjusting
-+   * this setting (if they are doing the conversion themselves for instance).
-+   * - decoding: set by libavcodec
-+   * - encoding: unused
-+   */
-+  int sub_charenc_mode;
-+#define FF_SUB_CHARENC_MODE_DO_NOTHING \
-+  -1  ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8,
-+      ///< or the codec is bitmap for instance)
-+#define FF_SUB_CHARENC_MODE_AUTOMATIC \
-+  0  ///< libavcodec will select the mode itself
-+#define FF_SUB_CHARENC_MODE_PRE_DECODER \
-+  1  ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the
-+     ///< decoder, requires iconv
-+#define FF_SUB_CHARENC_MODE_IGNORE \
-+  2  ///< neither convert the subtitles, nor check them for valid UTF-8
-+
-+  /**
-+   * Header containing style information for text subtitles.
-+   * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
-+   * [Script Info] and [V4+ Styles] section, plus the [Events] line and
-+   * the Format line following. It shouldn't include any Dialogue line.
-+   * - encoding: Set/allocated/freed by user (before avcodec_open2())
-+   * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
-+   */
-+  int subtitle_header_size;
-+  uint8_t* subtitle_header;
-+
-+  /**
-+   * dump format separator.
-+   * can be ", " or "\n      " or anything else
-+   * - encoding: Set by user.
-+   * - decoding: Set by user.
-+   */
-+  uint8_t* dump_separator;
-+
-+  /**
-+   * ',' separated list of allowed decoders.
-+   * If NULL then all are allowed
-+   * - encoding: unused
-+   * - decoding: set by user
-+   */
-+  char* codec_whitelist;
-+
-+  /**
-+   * Additional data associated with the entire coded stream.
-+   *
-+   * - decoding: may be set by user before calling avcodec_open2().
-+   * - encoding: may be set by libavcodec after avcodec_open2().
-+   */
-+  AVPacketSideData* coded_side_data;
-+  int nb_coded_side_data;
-+
-+  /**
-+   * 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;
-+
-+  /**
-+   * The number of pixels per image to maximally accept.
-+   *
-+   * - decoding: set by user
-+   * - encoding: set by user
-+   */
-+  int64_t max_pixels;
-+
-+  /**
-+   * Video decoding only. Certain video codecs support cropping, meaning that
-+   * only a sub-rectangle of the decoded frame is intended for display.  This
-+   * option controls how cropping is handled by libavcodec.
-+   *
-+   * When set to 1 (the default), libavcodec will apply cropping internally.
-+   * I.e. it will modify the output frame width/height fields and offset the
-+   * data pointers (only by as much as possible while preserving alignment, or
-+   * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that
-+   * the frames output by the decoder refer only to the cropped area. The
-+   * crop_* fields of the output frames will be zero.
-+   *
-+   * When set to 0, the width/height fields of the output frames will be set
-+   * to the coded dimensions and the crop_* fields will describe the cropping
-+   * rectangle. Applying the cropping is left to the caller.
-+   *
-+   * @warning When hardware acceleration with opaque output frames is used,
-+   * libavcodec is unable to apply cropping from the top/left border.
-+   *
-+   * @note when this option is set to zero, the width/height fields of the
-+   * AVCodecContext and output AVFrames have different meanings. The codec
-+   * context fields store display dimensions (with the coded dimensions in
-+   * coded_width/height), while the frame fields store the coded dimensions
-+   * (with the display dimensions being determined by the crop_* fields).
-+   */
-+  int apply_cropping;
-+
-+  /**
-+   * 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;
-+
-+  /**
-+   * This callback is called at the beginning of each packet to get a data
-+   * buffer for it.
-+   *
-+   * The following field will be set in the packet before this callback is
-+   * called:
-+   * - size
-+   * This callback must use the above value to calculate the required buffer
-+   * size, which must padded by at least AV_INPUT_BUFFER_PADDING_SIZE bytes.
-+   *
-+   * In some specific cases, the encoder may not use the entire buffer allocated
-+   * by this callback. This will be reflected in the size value in the packet
-+   * once returned by avcodec_receive_packet().
-+   *
-+   * This callback must fill the following fields in the packet:
-+   * - data: alignment requirements for AVPacket apply, if any. Some
-+   * architectures and encoders may benefit from having aligned data.
-+   * - buf: must contain a pointer to an AVBufferRef structure. The packet's
-+   *   data pointer must be contained in it. See: av_buffer_create(),
-+   * av_buffer_alloc(), and av_buffer_ref().
-+   *
-+   * If AV_CODEC_CAP_DR1 is not set then get_encode_buffer() must call
-+   * avcodec_default_get_encode_buffer() instead of providing a buffer allocated
-+   * by some other means.
-+   *
-+   * The flags field may contain a combination of AV_GET_ENCODE_BUFFER_FLAG_
-+   * flags. They may be used for example to hint what use the buffer may get
-+   * after being created. Implementations of this callback may ignore flags they
-+   * don't understand. If AV_GET_ENCODE_BUFFER_FLAG_REF is set in flags then the
-+   * packet may be reused (read and/or written to if it is writable) later by
-+   * libavcodec.
-+   *
-+   * This callback must be thread-safe, as when frame threading is used, it may
-+   * be called from multiple threads simultaneously.
-+   *
-+   * @see avcodec_default_get_encode_buffer()
-+   *
-+   * - encoding: Set by libavcodec, user can override.
-+   * - decoding: unused
-+   */
-+  int (*get_encode_buffer)(struct AVCodecContext* s, AVPacket* pkt, int flags);
-+
-+  /**
-+   * Frame counter, set by libavcodec.
-+   *
-+   * - decoding: total number of frames returned from the decoder so far.
-+   * - encoding: total number of frames passed to the encoder so far.
-+   *
-+   *   @note the counter is not incremented if encoding/decoding resulted in
-+   *   an error.
-+   */
-+  int64_t frame_num;
-+
-+  /**
-+   * Decoding only. May be set by the caller before avcodec_open2() to an
-+   * av_malloc()'ed array (or via AVOptions). Owned and freed by the decoder
-+   * afterwards.
-+   *
-+   * Side data attached to decoded frames may come from several sources:
-+   * 1. coded_side_data, which the decoder will for certain types translate
-+   *    from packet-type to frame-type and attach to frames;
-+   * 2. side data attached to an AVPacket sent for decoding (same
-+   *    considerations as above);
-+   * 3. extracted from the coded bytestream.
-+   * The first two cases are supplied by the caller and typically come from a
-+   * container.
-+   *
-+   * This array configures decoder behaviour in cases when side data of the
-+   * same type is present both in the coded bytestream and in the
-+   * user-supplied side data (items 1. and 2. above). In all cases, at most
-+   * one instance of each side data type will be attached to output frames. By
-+   * default it will be the bytestream side data. Adding an
-+   * AVPacketSideDataType value to this array will flip the preference for
-+   * this type, thus making the decoder prefer user-supplied side data over
-+   * bytestream. In case side data of the same type is present both in
-+   * coded_data and attacked to a packet, the packet instance always has
-+   * priority.
-+   *
-+   * The array may also contain a single -1, in which case the preference is
-+   * switched for all side data types.
-+   */
-+  int* side_data_prefer_packet;
-+  /**
-+   * Number of entries in side_data_prefer_packet.
-+   */
-+  unsigned nb_side_data_prefer_packet;
-+
-+  /**
-+   * Array containing static side data, such as HDR10 CLL / MDCV structures.
-+   * Side data entries should be allocated by usage of helpers defined in
-+   * libavutil/frame.h.
-+   *
-+   * - encoding: may be set by user before calling avcodec_open2() for
-+   *             encoder configuration. Afterwards owned and freed by the
-+   *             encoder.
-+   * - decoding: unused
-+   */
-+  AVFrameSideData** decoded_side_data;
-+  int nb_decoded_side_data;
-+} AVCodecContext;
-+
-+/**
-+ * @defgroup lavc_hwaccel AVHWAccel
-+ *
-+ * @note  Nothing in this structure should be accessed by the user.  At some
-+ *        point in future it will not be externally visible at all.
-+ *
-+ * @{
-+ */
-+typedef struct AVHWAccel {
-+  /**
-+   * Name of the hardware accelerated codec.
-+   * The name is globally unique among encoders and among decoders (but an
-+   * encoder and a decoder can share the same name).
-+   */
-+  const char* name;
-+
-+  /**
-+   * Type of codec implemented by the hardware accelerator.
-+   *
-+   * See AVMEDIA_TYPE_xxx
-+   */
-+  enum AVMediaType type;
-+
-+  /**
-+   * Codec implemented by the hardware accelerator.
-+   *
-+   * See AV_CODEC_ID_xxx
-+   */
-+  enum AVCodecID id;
-+
-+  /**
-+   * Supported pixel format.
-+   *
-+   * Only hardware accelerated formats are supported here.
-+   */
-+  enum AVPixelFormat pix_fmt;
-+
-+  /**
-+   * Hardware accelerated codec capabilities.
-+   * see AV_HWACCEL_CODEC_CAP_*
-+   */
-+  int capabilities;
-+} AVHWAccel;
-+
-+/**
-+ * HWAccel is experimental and is thus avoided in favor of non experimental
-+ * codecs
-+ */
-+#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200
-+
-+/**
-+ * Hardware acceleration should be used for decoding even if the codec level
-+ * used is unknown or higher than the maximum supported level reported by the
-+ * hardware driver.
-+ *
-+ * It's generally a good idea to pass this flag unless you have a specific
-+ * reason not to, as hardware tends to under-report supported levels.
-+ */
-+#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0)
-+
-+/**
-+ * Hardware acceleration can output YUV pixel formats with a different chroma
-+ * sampling than 4:2:0 and/or other than 8 bits per component.
-+ */
-+#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1)
-+
-+/**
-+ * Hardware acceleration should still be attempted for decoding when the
-+ * codec profile does not match the reported capabilities of the hardware.
-+ *
-+ * For example, this can be used to try to decode baseline profile H.264
-+ * streams in hardware - it will often succeed, because many streams marked
-+ * as baseline profile actually conform to constrained baseline profile.
-+ *
-+ * @warning If the stream is actually not supported then the behaviour is
-+ *          undefined, and may include returning entirely incorrect output
-+ *          while indicating success.
-+ */
-+#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2)
-+
-+/**
-+ * Some hardware decoders (namely nvdec) can either output direct decoder
-+ * surfaces, or make an on-device copy and return said copy.
-+ * There is a hard limit on how many decoder surfaces there can be, and it
-+ * cannot be accurately guessed ahead of time.
-+ * For some processing chains, this can be okay, but others will run into the
-+ * limit and in turn produce very confusing errors that require fine tuning of
-+ * more or less obscure options by the user, or in extreme cases cannot be
-+ * resolved at all without inserting an avfilter that forces a copy.
-+ *
-+ * Thus, the hwaccel will by default make a copy for safety and resilience.
-+ * If a users really wants to minimize the amount of copies, they can set this
-+ * flag and ensure their processing chain does not exhaust the surface pool.
-+ */
-+#define AV_HWACCEL_FLAG_UNSAFE_OUTPUT (1 << 3)
-+
-+/**
-+ * @}
-+ */
-+
-+enum AVSubtitleType {
-+  SUBTITLE_NONE,
-+
-+  SUBTITLE_BITMAP,  ///< A bitmap, pict will be set
-+
-+  /**
-+   * Plain text, the text field must be set by the decoder and is
-+   * authoritative. ass and pict fields may contain approximations.
-+   */
-+  SUBTITLE_TEXT,
-+
-+  /**
-+   * Formatted text, the ass field must be set by the decoder and is
-+   * authoritative. pict and text fields may contain approximations.
-+   */
-+  SUBTITLE_ASS,
-+};
-+
-+#define AV_SUBTITLE_FLAG_FORCED 0x00000001
-+
-+typedef struct AVSubtitleRect {
-+  int x;          ///< top left corner  of pict, undefined when pict is not set
-+  int y;          ///< top left corner  of pict, undefined when pict is not set
-+  int w;          ///< width            of pict, undefined when pict is not set
-+  int h;          ///< height           of pict, undefined when pict is not set
-+  int nb_colors;  ///< number of colors in pict, undefined when pict is not set
-+
-+  /**
-+   * data+linesize for the bitmap of this subtitle.
-+   * Can be set for text/ass as well once they are rendered.
-+   */
-+  uint8_t* data[4];
-+  int linesize[4];
-+
-+  int flags;
-+  enum AVSubtitleType type;
-+
-+  char* text;  ///< 0 terminated plain UTF-8 text
-+
-+  /**
-+   * 0 terminated ASS/SSA compatible event line.
-+   * The presentation of this is unaffected by the other values in this
-+   * struct.
-+   */
-+  char* ass;
-+} AVSubtitleRect;
-+
-+typedef struct AVSubtitle {
-+  uint16_t format;             /* 0 = graphics */
-+  uint32_t start_display_time; /* relative to packet pts, in ms */
-+  uint32_t end_display_time;   /* relative to packet pts, in ms */
-+  unsigned num_rects;
-+  AVSubtitleRect** rects;
-+  int64_t pts;  ///< Same as packet pts, in AV_TIME_BASE
-+} AVSubtitle;
-+
-+/**
-+ * Return the LIBAVCODEC_VERSION_INT constant.
-+ */
-+unsigned avcodec_version(void);
-+
-+/**
-+ * Return the libavcodec build-time configuration.
-+ */
-+const char* avcodec_configuration(void);
-+
-+/**
-+ * Return the libavcodec license.
-+ */
-+const char* avcodec_license(void);
-+
-+/**
-+ * Allocate an AVCodecContext and set its fields to default values. The
-+ * resulting struct should be freed with avcodec_free_context().
-+ *
-+ * @param codec if non-NULL, allocate private data and initialize defaults
-+ *              for the given codec. It is illegal to then call avcodec_open2()
-+ *              with a different codec.
-+ *              If NULL, then the codec-specific defaults won't be initialized,
-+ *              which may result in suboptimal default settings (this is
-+ *              important mainly for encoders, e.g. libx264).
-+ *
-+ * @return An AVCodecContext filled with default values or NULL on failure.
-+ */
-+AVCodecContext* avcodec_alloc_context3(const AVCodec* codec);
-+
-+/**
-+ * Free the codec context and everything associated with it and write NULL to
-+ * the provided pointer.
-+ */
-+void avcodec_free_context(AVCodecContext** avctx);
-+
-+/**
-+ * Get the AVClass for AVCodecContext. It can be used in combination with
-+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
-+ *
-+ * @see av_opt_find().
-+ */
-+const AVClass* avcodec_get_class(void);
-+
-+/**
-+ * Get the AVClass for AVSubtitleRect. It can be used in combination with
-+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
-+ *
-+ * @see av_opt_find().
-+ */
-+const AVClass* avcodec_get_subtitle_rect_class(void);
-+
-+/**
-+ * Fill the parameters struct based on the values from the supplied codec
-+ * context. Any allocated fields in par are freed and replaced with duplicates
-+ * of the corresponding fields in codec.
-+ *
-+ * @return >= 0 on success, a negative AVERROR code on failure
-+ */
-+int avcodec_parameters_from_context(struct AVCodecParameters* par,
-+                                    const AVCodecContext* codec);
-+
-+/**
-+ * Fill the codec context based on the values from the supplied codec
-+ * parameters. Any allocated fields in codec that have a corresponding field in
-+ * par are freed and replaced with duplicates of the corresponding field in par.
-+ * Fields in codec that do not have a counterpart in par are not touched.
-+ *
-+ * @return >= 0 on success, a negative AVERROR code on failure.
-+ */
-+int avcodec_parameters_to_context(AVCodecContext* codec,
-+                                  const struct AVCodecParameters* par);
-+
-+/**
-+ * Initialize the AVCodecContext to use the given AVCodec. Prior to using this
-+ * function the context has to be allocated with avcodec_alloc_context3().
-+ *
-+ * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
-+ * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
-+ * retrieving a codec.
-+ *
-+ * Depending on the codec, you might need to set options in the codec context
-+ * also for decoding (e.g. width, height, or the pixel or audio sample format in
-+ * the case the information is not available in the bitstream, as when decoding
-+ * raw audio or video).
-+ *
-+ * Options in the codec context can be set either by setting them in the options
-+ * AVDictionary, or by setting the values in the context itself, directly or by
-+ * using the av_opt_set() API before calling this function.
-+ *
-+ * Example:
-+ * @code
-+ * av_dict_set(&opts, "b", "2.5M", 0);
-+ * codec = avcodec_find_decoder(AV_CODEC_ID_H264);
-+ * if (!codec)
-+ *     exit(1);
-+ *
-+ * context = avcodec_alloc_context3(codec);
-+ *
-+ * if (avcodec_open2(context, codec, opts) < 0)
-+ *     exit(1);
-+ * @endcode
-+ *
-+ * In the case AVCodecParameters are available (e.g. when demuxing a stream
-+ * using libavformat, and accessing the AVStream contained in the demuxer), the
-+ * codec parameters can be copied to the codec context using
-+ * avcodec_parameters_to_context(), as in the following example:
-+ *
-+ * @code
-+ * AVStream *stream = ...;
-+ * context = avcodec_alloc_context3(codec);
-+ * if (avcodec_parameters_to_context(context, stream->codecpar) < 0)
-+ *     exit(1);
-+ * if (avcodec_open2(context, codec, NULL) < 0)
-+ *     exit(1);
-+ * @endcode
-+ *
-+ * @note Always call this function before using decoding routines (such as
-+ * @ref avcodec_receive_frame()).
-+ *
-+ * @param avctx The context to initialize.
-+ * @param codec The codec to open this context for. If a non-NULL codec has been
-+ *              previously passed to avcodec_alloc_context3() or
-+ *              for this context, then this parameter MUST be either NULL or
-+ *              equal to the previously passed codec.
-+ * @param options A dictionary filled with AVCodecContext and codec-private
-+ *                options, which are set on top of the options already set in
-+ *                avctx, can be NULL. On return this object will be filled with
-+ *                options that were not found in the avctx codec context.
-+ *
-+ * @return zero on success, a negative value on error
-+ * @see avcodec_alloc_context3(), avcodec_find_decoder(),
-+ * avcodec_find_encoder(), av_dict_set(), av_opt_set(), av_opt_find(),
-+ * avcodec_parameters_to_context()
-+ */
-+int avcodec_open2(AVCodecContext* avctx, const AVCodec* codec,
-+                  AVDictionary** options);
-+
-+#if FF_API_AVCODEC_CLOSE
-+/**
-+ * Close a given AVCodecContext and free all the data associated with it
-+ * (but not the AVCodecContext itself).
-+ *
-+ * Calling this function on an AVCodecContext that hasn't been opened will free
-+ * the codec-specific data allocated in avcodec_alloc_context3() with a non-NULL
-+ * codec. Subsequent calls will do nothing.
-+ *
-+ * @deprecated Do not use this function. Use avcodec_free_context() to destroy a
-+ * codec context (either open or closed). Opening and closing a codec context
-+ * multiple times is not supported anymore -- use multiple codec contexts
-+ * instead.
-+ */
-+attribute_deprecated int avcodec_close(AVCodecContext* avctx);
-+#endif
-+
-+/**
-+ * Free all allocated data in the given subtitle struct.
-+ *
-+ * @param sub AVSubtitle to free.
-+ */
-+void avsubtitle_free(AVSubtitle* sub);
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * @addtogroup lavc_decoding
-+ * @{
-+ */
-+
-+/**
-+ * The default callback for AVCodecContext.get_buffer2(). It is made public so
-+ * it can be called by custom get_buffer2() implementations for decoders without
-+ * AV_CODEC_CAP_DR1 set.
-+ */
-+int avcodec_default_get_buffer2(AVCodecContext* s, AVFrame* frame, int flags);
-+
-+/**
-+ * The default callback for AVCodecContext.get_encode_buffer(). It is made
-+ * public so it can be called by custom get_encode_buffer() implementations for
-+ * encoders without AV_CODEC_CAP_DR1 set.
-+ */
-+int avcodec_default_get_encode_buffer(AVCodecContext* s, AVPacket* pkt,
-+                                      int flags);
-+
-+/**
-+ * Modify width and height values so that they will result in a memory
-+ * buffer that is acceptable for the codec if you do not use any horizontal
-+ * padding.
-+ *
-+ * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened.
-+ */
-+void avcodec_align_dimensions(AVCodecContext* s, int* width, int* height);
-+
-+/**
-+ * Modify width and height values so that they will result in a memory
-+ * buffer that is acceptable for the codec if you also ensure that all
-+ * line sizes are a multiple of the respective linesize_align[i].
-+ *
-+ * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened.
-+ */
-+void avcodec_align_dimensions2(AVCodecContext* s, int* width, int* height,
-+                               int linesize_align[AV_NUM_DATA_POINTERS]);
-+
-+/**
-+ * Decode a subtitle message.
-+ * Return a negative value on error, otherwise return the number of bytes used.
-+ * 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 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.
-+ *
-+ * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between
-+ * input and output. This means that for some packets they will not immediately
-+ * produce decoded output and need to be flushed at the end of decoding to get
-+ * all the decoded data. Flushing is done by calling this function with packets
-+ * with avpkt->data set to NULL and avpkt->size set to 0 until it stops
-+ * returning subtitles. It is safe to flush even those decoders that are not
-+ * marked with AV_CODEC_CAP_DELAY, then no subtitles will be returned.
-+ *
-+ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2()
-+ * 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, 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.
-+ */
-+int avcodec_decode_subtitle2(AVCodecContext* avctx, AVSubtitle* sub,
-+                             int* got_sub_ptr, const AVPacket* avpkt);
-+
-+/**
-+ * Supply raw packet data as input to a decoder.
-+ *
-+ * Internally, this call will copy relevant AVCodecContext fields, which can
-+ * influence decoding per-packet, and apply them when the packet is actually
-+ * decoded. (For example AVCodecContext.skip_frame, which might direct the
-+ * decoder to drop the frame contained by the packet sent with this function.)
-+ *
-+ * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE
-+ *          larger than the actual read bytes because some optimized bitstream
-+ *          readers read 32 or 64 bits at once and could read over the end.
-+ *
-+ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2()
-+ *       before packets may be fed to the decoder.
-+ *
-+ * @param avctx codec context
-+ * @param[in] avpkt The input AVPacket. Usually, this will be a single video
-+ *                  frame, or several complete audio frames.
-+ *                  Ownership of the packet remains with the caller, and the
-+ *                  decoder will not write to the packet. The decoder may create
-+ *                  a reference to the packet data (or copy it if the packet is
-+ *                  not reference-counted).
-+ *                  Unlike with older APIs, the packet is always fully consumed,
-+ *                  and if it contains multiple frames (e.g. some audio codecs),
-+ *                  will require you to call avcodec_receive_frame() multiple
-+ *                  times afterwards before you can send a new packet.
-+ *                  It can be NULL (or an AVPacket with data set to NULL and
-+ *                  size set to 0); in this case, it is considered a flush
-+ *                  packet, which signals the end of the stream. Sending the
-+ *                  first flush packet will return success. Subsequent ones are
-+ *                  unnecessary and will return AVERROR_EOF. If the decoder
-+ *                  still has frames buffered, it will return them after sending
-+ *                  a flush packet.
-+ *
-+ * @retval 0                 success
-+ * @retval AVERROR(EAGAIN)   input is not accepted in the current state - user
-+ *                           must read output with avcodec_receive_frame() (once
-+ *                           all output is read, the packet should be resent,
-+ *                           and the call will not fail with EAGAIN).
-+ * @retval AVERROR_EOF       the decoder has been flushed, and no new packets
-+ * can be sent to it (also returned if more than 1 flush packet is sent)
-+ * @retval AVERROR(EINVAL)   codec not opened, it is an encoder, or requires
-+ * flush
-+ * @retval AVERROR(ENOMEM)   failed to add packet to internal queue, or similar
-+ * @retval "another negative error code" legitimate decoding errors
-+ */
-+int avcodec_send_packet(AVCodecContext* avctx, const AVPacket* avpkt);
-+
-+/**
-+ * Return decoded output data from a decoder or encoder (when the
-+ * @ref AV_CODEC_FLAG_RECON_FRAME flag is used).
-+ *
-+ * @param avctx codec context
-+ * @param frame This will be set to a reference-counted video or audio
-+ *              frame (depending on the decoder type) allocated by the
-+ *              codec. Note that the function will always call
-+ *              av_frame_unref(frame) before doing anything else.
-+ *
-+ * @retval 0                success, a frame was returned
-+ * @retval AVERROR(EAGAIN)  output is not available in this state - user must
-+ *                          try to send new input
-+ * @retval AVERROR_EOF      the codec has been fully flushed, and there will be
-+ *                          no more output frames
-+ * @retval AVERROR(EINVAL)  codec not opened, or it is an encoder without the
-+ *                          @ref AV_CODEC_FLAG_RECON_FRAME flag enabled
-+ * @retval "other negative error code" legitimate decoding errors
-+ */
-+int avcodec_receive_frame(AVCodecContext* avctx, AVFrame* frame);
-+
-+/**
-+ * Supply a raw video or audio frame to the encoder. Use
-+ * avcodec_receive_packet() to retrieve buffered output packets.
-+ *
-+ * @param avctx     codec context
-+ * @param[in] frame AVFrame containing the raw audio or video frame to be
-+ * encoded. Ownership of the frame remains with the caller, and the encoder will
-+ * not write to the frame. The encoder may create a reference to the frame data
-+ * (or copy it if the frame is not reference-counted). It can be NULL, in which
-+ * case it is considered a flush packet.  This signals the end of the stream. If
-+ * the encoder still has packets buffered, it will return them after this call.
-+ * Once flushing mode has been entered, additional flush packets are ignored,
-+ * and sending frames will return AVERROR_EOF.
-+ *
-+ *                  For audio:
-+ *                  If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame
-+ *                  can have any number of samples.
-+ *                  If it is not set, frame->nb_samples must be equal to
-+ *                  avctx->frame_size for all frames except the last.
-+ *                  The final frame may be smaller than avctx->frame_size.
-+ * @retval 0                 success
-+ * @retval AVERROR(EAGAIN)   input is not accepted in the current state - user
-+ * must read output with avcodec_receive_packet() (once all output is read, the
-+ * packet should be resent, and the call will not fail with EAGAIN).
-+ * @retval AVERROR_EOF       the encoder has been flushed, and no new frames can
-+ *                           be sent to it
-+ * @retval AVERROR(EINVAL)   codec not opened, it is a decoder, or requires
-+ * flush
-+ * @retval AVERROR(ENOMEM)   failed to add packet to internal queue, or similar
-+ * @retval "another negative error code" legitimate encoding errors
-+ */
-+int avcodec_send_frame(AVCodecContext* avctx, const AVFrame* frame);
-+
-+/**
-+ * Read encoded data from the encoder.
-+ *
-+ * @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_packet_unref(avpkt) before doing anything else.
-+ * @retval 0               success
-+ * @retval AVERROR(EAGAIN) output is not available in the current state - user
-+ * must try to send input
-+ * @retval AVERROR_EOF     the encoder has been fully flushed, and there will be
-+ * no more output packets
-+ * @retval AVERROR(EINVAL) codec not opened, or it is a decoder
-+ * @retval "another negative error code" legitimate encoding errors
-+ */
-+int avcodec_receive_packet(AVCodecContext* avctx, AVPacket* avpkt);
-+
-+/**
-+ * Create and return a AVHWFramesContext with values adequate for hardware
-+ * decoding. This is meant to get called from the get_format callback, and is
-+ * a helper for preparing a AVHWFramesContext for AVCodecContext.hw_frames_ctx.
-+ * This API is for decoding with certain hardware acceleration modes/APIs only.
-+ *
-+ * The returned AVHWFramesContext is not initialized. The caller must do this
-+ * with av_hwframe_ctx_init().
-+ *
-+ * Calling this function is not a requirement, but makes it simpler to avoid
-+ * codec or hardware API specific details when manually allocating frames.
-+ *
-+ * Alternatively to this, an API user can set AVCodecContext.hw_device_ctx,
-+ * which sets up AVCodecContext.hw_frames_ctx fully automatically, and makes
-+ * it unnecessary to call this function or having to care about
-+ * AVHWFramesContext initialization at all.
-+ *
-+ * There are a number of requirements for calling this function:
-+ *
-+ * - It must be called from get_format with the same avctx parameter that was
-+ *   passed to get_format. Calling it outside of get_format is not allowed, and
-+ *   can trigger undefined behavior.
-+ * - The function is not always supported (see description of return values).
-+ *   Even if this function returns successfully, hwaccel initialization could
-+ *   fail later. (The degree to which implementations check whether the stream
-+ *   is actually supported varies. Some do this check only after the user's
-+ *   get_format callback returns.)
-+ * - The hw_pix_fmt must be one of the choices suggested by get_format. If the
-+ *   user decides to use a AVHWFramesContext prepared with this API function,
-+ *   the user must return the same hw_pix_fmt from get_format.
-+ * - The device_ref passed to this function must support the given hw_pix_fmt.
-+ * - After calling this API function, it is the user's responsibility to
-+ *   initialize the AVHWFramesContext (returned by the out_frames_ref
-+ * parameter), and to set AVCodecContext.hw_frames_ctx to it. If done, this must
-+ * be done before returning from get_format (this is implied by the normal
-+ *   AVCodecContext.hw_frames_ctx API rules).
-+ * - The AVHWFramesContext parameters may change every time time get_format is
-+ *   called. Also, AVCodecContext.hw_frames_ctx is reset before get_format. So
-+ *   you are inherently required to go through this process again on every
-+ *   get_format call.
-+ * - It is perfectly possible to call this function without actually using
-+ *   the resulting AVHWFramesContext. One use-case might be trying to reuse a
-+ *   previously initialized AVHWFramesContext, and calling this API function
-+ *   only to test whether the required frame parameters have changed.
-+ * - Fields that use dynamically allocated values of any kind must not be set
-+ *   by the user unless setting them is explicitly allowed by the documentation.
-+ *   If the user sets AVHWFramesContext.free and AVHWFramesContext.user_opaque,
-+ *   the new free callback must call the potentially set previous free callback.
-+ *   This API call may set any dynamically allocated fields, including the free
-+ *   callback.
-+ *
-+ * The function will set at least the following fields on AVHWFramesContext
-+ * (potentially more, depending on hwaccel API):
-+ *
-+ * - All fields set by av_hwframe_ctx_alloc().
-+ * - Set the format field to hw_pix_fmt.
-+ * - Set the sw_format field to the most suited and most versatile format. (An
-+ *   implication is that this will prefer generic formats over opaque formats
-+ *   with arbitrary restrictions, if possible.)
-+ * - Set the width/height fields to the coded frame size, rounded up to the
-+ *   API-specific minimum alignment.
-+ * - Only _if_ the hwaccel requires a pre-allocated pool: set the
-+ * initial_pool_size field to the number of maximum reference surfaces possible
-+ * with the codec, plus 1 surface for the user to work (meaning the user can
-+ * safely reference at most 1 decoded surface at a time), plus additional
-+ * buffering introduced by frame threading. If the hwaccel does not require
-+ * pre-allocation, the field is left to 0, and the decoder will allocate new
-+ * surfaces on demand during decoding.
-+ * - Possibly AVHWFramesContext.hwctx fields, depending on the underlying
-+ *   hardware API.
-+ *
-+ * Essentially, out_frames_ref returns the same as av_hwframe_ctx_alloc(), but
-+ * with basic frame parameters set.
-+ *
-+ * The function is stateless, and does not change the AVCodecContext or the
-+ * device_ref AVHWDeviceContext.
-+ *
-+ * @param avctx The context which is currently calling get_format, and which
-+ *              implicitly contains all state needed for filling the returned
-+ *              AVHWFramesContext properly.
-+ * @param device_ref A reference to the AVHWDeviceContext describing the device
-+ *                   which will be used by the hardware decoder.
-+ * @param hw_pix_fmt The hwaccel format you are going to return from get_format.
-+ * @param out_frames_ref On success, set to a reference to an _uninitialized_
-+ *                       AVHWFramesContext, created from the given device_ref.
-+ *                       Fields will be set to values required for decoding.
-+ *                       Not changed if an error is returned.
-+ * @return zero on success, a negative value on error. The following error codes
-+ *         have special semantics:
-+ *      AVERROR(ENOENT): the decoder does not support this functionality. Setup
-+ *                       is always manual, or it is a decoder which does not
-+ *                       support setting AVCodecContext.hw_frames_ctx at all,
-+ *                       or it is a software format.
-+ *      AVERROR(EINVAL): it is known that hardware decoding is not supported for
-+ *                       this configuration, or the device_ref is not supported
-+ *                       for the hwaccel referenced by hw_pix_fmt.
-+ */
-+int avcodec_get_hw_frames_parameters(AVCodecContext* avctx,
-+                                     AVBufferRef* device_ref,
-+                                     enum AVPixelFormat hw_pix_fmt,
-+                                     AVBufferRef** out_frames_ref);
-+
-+/**
-+ * @defgroup lavc_parsing Frame parsing
-+ * @{
-+ */
-+
-+enum AVPictureStructure {
-+  AV_PICTURE_STRUCTURE_UNKNOWN,       ///< unknown
-+  AV_PICTURE_STRUCTURE_TOP_FIELD,     ///< coded as top field
-+  AV_PICTURE_STRUCTURE_BOTTOM_FIELD,  ///< coded as bottom field
-+  AV_PICTURE_STRUCTURE_FRAME,         ///< coded as frame
-+};
-+
-+typedef struct AVCodecParserContext {
-+  void* priv_data;
-+  const struct AVCodecParser* parser;
-+  int64_t frame_offset;      /* offset of the current frame */
-+  int64_t cur_offset;        /* current offset
-+                                (incremented by each av_parser_parse()) */
-+  int64_t next_frame_offset; /* offset of the next frame */
-+  /* video info */
-+  int pict_type; /* XXX: Put it back in AVCodecContext. */
-+  /**
-+   * This field is used for proper frame duration computation in lavf.
-+   * It signals, how much longer the frame duration of the current frame
-+   * is compared to normal frame duration.
-+   *
-+   * frame_duration = (1 + repeat_pict) * time_base
-+   *
-+   * It is used by codecs like H.264 to display telecined material.
-+   */
-+  int repeat_pict; /* XXX: Put it back in AVCodecContext. */
-+  int64_t pts;     /* pts of the current frame */
-+  int64_t dts;     /* dts of the current frame */
-+
-+  /* private data */
-+  int64_t last_pts;
-+  int64_t last_dts;
-+  int fetch_timestamp;
-+
-+#define AV_PARSER_PTS_NB 4
-+  int cur_frame_start_index;
-+  int64_t cur_frame_offset[AV_PARSER_PTS_NB];
-+  int64_t cur_frame_pts[AV_PARSER_PTS_NB];
-+  int64_t cur_frame_dts[AV_PARSER_PTS_NB];
-+
-+  int flags;
-+#define PARSER_FLAG_COMPLETE_FRAMES 0x0001
-+#define PARSER_FLAG_ONCE 0x0002
-+/// Set if the parser has a valid file offset
-+#define PARSER_FLAG_FETCHED_OFFSET 0x0004
-+#define PARSER_FLAG_USE_CODEC_TS 0x1000
-+
-+  int64_t offset;  ///< byte offset from starting packet start
-+  int64_t cur_frame_end[AV_PARSER_PTS_NB];
-+
-+  /**
-+   * Set by parser to 1 for key frames and 0 for non-key frames.
-+   * It is initialized to -1, so if the parser doesn't set this flag,
-+   * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames
-+   * will be used.
-+   */
-+  int key_frame;
-+
-+  // Timestamp generation support:
-+  /**
-+   * Synchronization point for start of timestamp generation.
-+   *
-+   * Set to >0 for sync point, 0 for no sync point and <0 for undefined
-+   * (default).
-+   *
-+   * For example, this corresponds to presence of H.264 buffering period
-+   * SEI message.
-+   */
-+  int dts_sync_point;
-+
-+  /**
-+   * Offset of the current timestamp against last timestamp sync point in
-+   * units of AVCodecContext.time_base.
-+   *
-+   * Set to INT_MIN when dts_sync_point unused. Otherwise, it must
-+   * contain a valid timestamp offset.
-+   *
-+   * Note that the timestamp of sync point has usually a nonzero
-+   * dts_ref_dts_delta, which refers to the previous sync point. Offset of
-+   * the next frame after timestamp sync point will be usually 1.
-+   *
-+   * For example, this corresponds to H.264 cpb_removal_delay.
-+   */
-+  int dts_ref_dts_delta;
-+
-+  /**
-+   * Presentation delay of current frame in units of AVCodecContext.time_base.
-+   *
-+   * Set to INT_MIN when dts_sync_point unused. Otherwise, it must
-+   * contain valid non-negative timestamp delta (presentation time of a frame
-+   * must not lie in the past).
-+   *
-+   * This delay represents the difference between decoding and presentation
-+   * time of the frame.
-+   *
-+   * For example, this corresponds to H.264 dpb_output_delay.
-+   */
-+  int pts_dts_delta;
-+
-+  /**
-+   * Position of the packet in file.
-+   *
-+   * Analogous to cur_frame_pts/dts
-+   */
-+  int64_t cur_frame_pos[AV_PARSER_PTS_NB];
-+
-+  /**
-+   * Byte position of currently parsed frame in stream.
-+   */
-+  int64_t pos;
-+
-+  /**
-+   * Previous frame byte position.
-+   */
-+  int64_t last_pos;
-+
-+  /**
-+   * Duration of the current frame.
-+   * For audio, this is in units of 1 / AVCodecContext.sample_rate.
-+   * For all other types, this is in units of AVCodecContext.time_base.
-+   */
-+  int duration;
-+
-+  enum AVFieldOrder field_order;
-+
-+  /**
-+   * Indicate whether a picture is coded as a frame, top field or bottom field.
-+   *
-+   * For example, H.264 field_pic_flag equal to 0 corresponds to
-+   * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag
-+   * equal to 1 and bottom_field_flag equal to 0 corresponds to
-+   * AV_PICTURE_STRUCTURE_TOP_FIELD.
-+   */
-+  enum AVPictureStructure picture_structure;
-+
-+  /**
-+   * Picture number incremented in presentation or output order.
-+   * This field may be reinitialized at the first picture of a new sequence.
-+   *
-+   * For example, this corresponds to H.264 PicOrderCnt.
-+   */
-+  int output_picture_number;
-+
-+  /**
-+   * Dimensions of the decoded video intended for presentation.
-+   */
-+  int width;
-+  int height;
-+
-+  /**
-+   * Dimensions of the coded video.
-+   */
-+  int coded_width;
-+  int coded_height;
-+
-+  /**
-+   * The format of the coded data, corresponds to enum AVPixelFormat for video
-+   * and for enum AVSampleFormat for audio.
-+   *
-+   * Note that a decoder can have considerable freedom in how exactly it
-+   * decodes the data, so the format reported here might be different from the
-+   * one returned by a decoder.
-+   */
-+  int format;
-+} AVCodecParserContext;
-+
-+typedef struct AVCodecParser {
-+  int codec_ids[7]; /* several codec IDs are permitted */
-+  int priv_data_size;
-+  int (*parser_init)(AVCodecParserContext* s);
-+  /* This callback never returns an error, a negative value means that
-+   * the frame start was in a previous packet. */
-+  int (*parser_parse)(AVCodecParserContext* s, AVCodecContext* avctx,
-+                      const uint8_t** poutbuf, int* poutbuf_size,
-+                      const uint8_t* buf, int buf_size);
-+  void (*parser_close)(AVCodecParserContext* s);
-+  int (*split)(AVCodecContext* avctx, const uint8_t* buf, int buf_size);
-+} AVCodecParser;
-+
-+/**
-+ * Iterate over all registered codec parsers.
-+ *
-+ * @param opaque a pointer where libavcodec will store the iteration state. Must
-+ *               point to NULL to start the iteration.
-+ *
-+ * @return the next registered codec parser or NULL when the iteration is
-+ *         finished
-+ */
-+const AVCodecParser* av_parser_iterate(void** opaque);
-+
-+AVCodecParserContext* av_parser_init(int codec_id);
-+
-+/**
-+ * Parse a packet.
-+ *
-+ * @param s             parser context.
-+ * @param avctx         codec context.
-+ * @param poutbuf       set to pointer to parsed buffer or NULL if not yet
-+ finished.
-+ * @param poutbuf_size  set to size of parsed buffer or zero if not yet
-+ finished.
-+ * @param buf           input buffer.
-+ * @param buf_size      buffer size in bytes without the padding. I.e. the full
-+ buffer size is assumed to be buf_size + AV_INPUT_BUFFER_PADDING_SIZE. To signal
-+ EOF, this should be 0 (so that the last frame can be output).
-+ * @param pts           input presentation timestamp.
-+ * @param dts           input decoding timestamp.
-+ * @param pos           input byte position in stream.
-+ * @return the number of bytes of the input bitstream used.
-+ *
-+ * Example:
-+ * @code
-+ *   while(in_len){
-+ *       len = av_parser_parse2(myparser, AVCodecContext, &data, &size,
-+ *                                        in_data, in_len,
-+ *                                        pts, dts, pos);
-+ *       in_data += len;
-+ *       in_len  -= len;
-+ *
-+ *       if(size)
-+ *          decode_frame(data, size);
-+ *   }
-+ * @endcode
-+ */
-+int av_parser_parse2(AVCodecParserContext* s, AVCodecContext* avctx,
-+                     uint8_t** poutbuf, int* poutbuf_size, const uint8_t* buf,
-+                     int buf_size, int64_t pts, int64_t dts, int64_t pos);
-+
-+void av_parser_close(AVCodecParserContext* s);
-+
-+/**
-+ * @}
-+ * @}
-+ */
-+
-+/**
-+ * @addtogroup lavc_encoding
-+ * @{
-+ */
-+
-+int avcodec_encode_subtitle(AVCodecContext* avctx, uint8_t* buf, int buf_size,
-+                            const AVSubtitle* sub);
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * @defgroup lavc_misc Utility functions
-+ * @ingroup libavc
-+ *
-+ * Miscellaneous utility functions related to both encoding and decoding
-+ * (or neither).
-+ * @{
-+ */
-+
-+/**
-+ * @defgroup lavc_misc_pixfmt Pixel formats
-+ *
-+ * Functions for working with pixel formats.
-+ * @{
-+ */
-+
-+/**
-+ * Return a value representing the fourCC code associated to the
-+ * pixel format pix_fmt, or 0 if no associated fourCC code can be
-+ * found.
-+ */
-+unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt);
-+
-+/**
-+ * Find the best pixel format to convert to given a certain source pixel
-+ * format.  When converting from one pixel format to another, information loss
-+ * may occur.  For example, when converting from RGB24 to GRAY, the color
-+ * information will be lost. Similarly, other losses occur when converting from
-+ * some formats to other formats. avcodec_find_best_pix_fmt_of_2() searches
-+ * which of the given pixel formats should be used to suffer the least amount of
-+ * loss. The pixel formats from which it chooses one, are determined by the
-+ * pix_fmt_list parameter.
-+ *
-+ *
-+ * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to
-+ * choose from
-+ * @param[in] src_pix_fmt source pixel format
-+ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
-+ * @param[out] loss_ptr Combination of flags informing you what kind of losses
-+ * will occur.
-+ * @return The best pixel format to convert to or -1 if none was found.
-+ */
-+enum AVPixelFormat avcodec_find_best_pix_fmt_of_list(
-+    const enum AVPixelFormat* pix_fmt_list, enum AVPixelFormat src_pix_fmt,
-+    int has_alpha, int* loss_ptr);
-+
-+enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext* s,
-+                                              const enum AVPixelFormat* fmt);
-+
-+/**
-+ * @}
-+ */
-+
-+void avcodec_string(char* buf, int buf_size, AVCodecContext* enc, int encode);
-+
-+int avcodec_default_execute(AVCodecContext* c,
-+                            int (*func)(AVCodecContext* c2, void* arg2),
-+                            void* arg, int* ret, int count, int size);
-+int avcodec_default_execute2(AVCodecContext* c,
-+                             int (*func)(AVCodecContext* c2, void* arg2, int,
-+                                         int),
-+                             void* arg, int* ret, int count);
-+// FIXME func typedef
-+
-+/**
-+ * Fill AVFrame audio data and linesize pointers.
-+ *
-+ * The buffer buf must be a preallocated buffer with a size big enough
-+ * to contain the specified samples amount. The filled AVFrame data
-+ * pointers will point to this buffer.
-+ *
-+ * AVFrame extended_data channel pointers are allocated if necessary for
-+ * planar audio.
-+ *
-+ * @param frame       the AVFrame
-+ *                    frame->nb_samples must be set prior to calling the
-+ *                    function. This function fills in frame->data,
-+ *                    frame->extended_data, frame->linesize[0].
-+ * @param nb_channels channel count
-+ * @param sample_fmt  sample format
-+ * @param buf         buffer to use for frame data
-+ * @param buf_size    size of buffer
-+ * @param align       plane size sample alignment (0 = default)
-+ * @return            >=0 on success, negative error code on failure
-+ * @todo return the size in bytes required to store the samples in
-+ * case of success, at the next libavutil bump
-+ */
-+int avcodec_fill_audio_frame(AVFrame* frame, int nb_channels,
-+                             enum AVSampleFormat sample_fmt, const uint8_t* buf,
-+                             int buf_size, int align);
-+
-+/**
-+ * Reset the internal codec state / flush internal buffers. Should be called
-+ * e.g. when seeking or when switching to a different stream.
-+ *
-+ * @note for decoders, this function just releases any references the decoder
-+ * might keep internally, but the caller's references remain 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);
-+
-+/**
-+ * Return audio frame duration.
-+ *
-+ * @param avctx        codec context
-+ * @param frame_bytes  size of the frame, or 0 if unknown
-+ * @return             frame duration, in samples, if known. 0 if not able to
-+ *                     determine.
-+ */
-+int av_get_audio_frame_duration(AVCodecContext* avctx, int frame_bytes);
-+
-+/* memory */
-+
-+/**
-+ * Same behaviour av_fast_malloc but the buffer has additional
-+ * AV_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0.
-+ *
-+ * In addition the whole buffer will initially and after resizes
-+ * be 0-initialized so that no uninitialized data will ever appear.
-+ */
-+void av_fast_padded_malloc(void* ptr, unsigned int* size, size_t min_size);
-+
-+/**
-+ * Same behaviour av_fast_padded_malloc except that buffer will always
-+ * be 0-initialized after call.
-+ */
-+void av_fast_padded_mallocz(void* ptr, unsigned int* size, size_t min_size);
-+
-+/**
-+ * @return a positive value if s is open (i.e. avcodec_open2() was called on it
-+ * with no corresponding avcodec_close()), 0 otherwise.
-+ */
-+int avcodec_is_open(AVCodecContext* s);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVCODEC_AVCODEC_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/avdct.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/avdct.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/avdct.h
-@@ -0,0 +1,85 @@
-+/*
-+ * 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_AVDCT_H
-+#define AVCODEC_AVDCT_H
-+
-+#include "libavutil/opt.h"
-+
-+/**
-+ * AVDCT context.
-+ * @note function pointers can be NULL if the specific features have been
-+ *       disabled at build time.
-+ */
-+typedef struct AVDCT {
-+  const AVClass* av_class;
-+
-+  void (*idct)(int16_t* block /* align 16 */);
-+
-+  /**
-+   * IDCT input permutation.
-+   * Several optimized IDCTs need a permutated input (relative to the
-+   * normal order of the reference IDCT).
-+   * This permutation must be performed before the idct_put/add.
-+   * Note, normally this can be merged with the zigzag/alternate scan<br>
-+   * An example to avoid confusion:
-+   * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...)
-+   * - (x -> reference DCT -> reference IDCT -> x)
-+   * - (x -> reference DCT -> simple_mmx_perm = idct_permutation
-+   *    -> simple_idct_mmx -> x)
-+   * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant
-+   *    -> simple_idct_mmx -> ...)
-+   */
-+  uint8_t idct_permutation[64];
-+
-+  void (*fdct)(int16_t* block /* align 16 */);
-+
-+  /**
-+   * DCT algorithm.
-+   * must use AVOptions to set this field.
-+   */
-+  int dct_algo;
-+
-+  /**
-+   * IDCT algorithm.
-+   * must use AVOptions to set this field.
-+   */
-+  int idct_algo;
-+
-+  void (*get_pixels)(int16_t* block /* align 16 */,
-+                     const uint8_t* pixels /* align 8 */, ptrdiff_t line_size);
-+
-+  int bits_per_sample;
-+
-+  void (*get_pixels_unaligned)(int16_t* block /* align 16 */,
-+                               const uint8_t* pixels, ptrdiff_t line_size);
-+} AVDCT;
-+
-+/**
-+ * Allocates a AVDCT context.
-+ * This needs to be initialized with avcodec_dct_init() after optionally
-+ * configuring it with AVOptions.
-+ *
-+ * To free it use av_free()
-+ */
-+AVDCT* avcodec_dct_alloc(void);
-+int avcodec_dct_init(AVDCT*);
-+
-+const AVClass* avcodec_dct_get_class(void);
-+
-+#endif /* AVCODEC_AVDCT_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/bsf.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/bsf.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/bsf.h
-@@ -0,0 +1,335 @@
-+/*
-+ * Bitstream filters 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_BSF_H
-+#define AVCODEC_BSF_H
-+
-+#include "libavutil/dict.h"
-+#include "libavutil/log.h"
-+#include "libavutil/rational.h"
-+
-+#include "codec_id.h"
-+#include "codec_par.h"
-+#include "packet.h"
-+
-+/**
-+ * @defgroup lavc_bsf Bitstream filters
-+ * @ingroup libavc
-+ *
-+ * Bitstream filters transform encoded media data without decoding it. This
-+ * allows e.g. manipulating various header values. Bitstream filters operate on
-+ * @ref AVPacket "AVPackets".
-+ *
-+ * The bitstream filtering API is centered around two structures:
-+ * AVBitStreamFilter and AVBSFContext. The former represents a bitstream filter
-+ * in abstract, the latter a specific filtering process. Obtain an
-+ * AVBitStreamFilter using av_bsf_get_by_name() or av_bsf_iterate(), then pass
-+ * it to av_bsf_alloc() to create an AVBSFContext. Fill in the user-settable
-+ * AVBSFContext fields, as described in its documentation, then call
-+ * av_bsf_init() to prepare the filter context for use.
-+ *
-+ * Submit packets for filtering using av_bsf_send_packet(), obtain filtered
-+ * results with av_bsf_receive_packet(). When no more input packets will be
-+ * sent, submit a NULL AVPacket to signal the end of the stream to the filter.
-+ * av_bsf_receive_packet() will then return trailing packets, if any are
-+ * produced by the filter.
-+ *
-+ * Finally, free the filter context with av_bsf_free().
-+ * @{
-+ */
-+
-+/**
-+ * The bitstream filter state.
-+ *
-+ * This struct must be allocated with av_bsf_alloc() and freed with
-+ * av_bsf_free().
-+ *
-+ * The fields in the struct will only be changed (by the caller or by the
-+ * filter) as described in their documentation, and are to be considered
-+ * immutable otherwise.
-+ */
-+typedef struct AVBSFContext {
-+  /**
-+   * A class for logging and AVOptions
-+   */
-+  const AVClass* av_class;
-+
-+  /**
-+   * The bitstream filter this context is an instance of.
-+   */
-+  const struct AVBitStreamFilter* filter;
-+
-+  /**
-+   * Opaque filter-specific private data. If filter->priv_class is non-NULL,
-+   * this is an AVOptions-enabled struct.
-+   */
-+  void* priv_data;
-+
-+  /**
-+   * Parameters of the input stream. This field is allocated in
-+   * av_bsf_alloc(), it needs to be filled by the caller before
-+   * av_bsf_init().
-+   */
-+  AVCodecParameters* par_in;
-+
-+  /**
-+   * Parameters of the output stream. This field is allocated in
-+   * av_bsf_alloc(), it is set by the filter in av_bsf_init().
-+   */
-+  AVCodecParameters* par_out;
-+
-+  /**
-+   * The timebase used for the timestamps of the input packets. Set by the
-+   * caller before av_bsf_init().
-+   */
-+  AVRational time_base_in;
-+
-+  /**
-+   * The timebase used for the timestamps of the output packets. Set by the
-+   * filter in av_bsf_init().
-+   */
-+  AVRational time_base_out;
-+} AVBSFContext;
-+
-+typedef struct AVBitStreamFilter {
-+  const char* name;
-+
-+  /**
-+   * A list of codec ids supported by the filter, terminated by
-+   * AV_CODEC_ID_NONE.
-+   * May be NULL, in that case the bitstream filter works with any codec id.
-+   */
-+  const enum AVCodecID* codec_ids;
-+
-+  /**
-+   * A class for the private data, used to declare bitstream filter private
-+   * AVOptions. This field is NULL for bitstream filters that do not declare
-+   * any options.
-+   *
-+   * If this field is non-NULL, the first member of the filter private data
-+   * must be a pointer to AVClass, which will be set by libavcodec generic
-+   * code to this class.
-+   */
-+  const AVClass* priv_class;
-+} AVBitStreamFilter;
-+
-+/**
-+ * @return a bitstream filter with the specified name or NULL if no such
-+ *         bitstream filter exists.
-+ */
-+const AVBitStreamFilter* av_bsf_get_by_name(const char* name);
-+
-+/**
-+ * Iterate over all registered bitstream filters.
-+ *
-+ * @param opaque a pointer where libavcodec will store the iteration state. Must
-+ *               point to NULL to start the iteration.
-+ *
-+ * @return the next registered bitstream filter or NULL when the iteration is
-+ *         finished
-+ */
-+const AVBitStreamFilter* av_bsf_iterate(void** opaque);
-+
-+/**
-+ * Allocate a context for a given bitstream filter. The caller must fill in the
-+ * context parameters as described in the documentation and then call
-+ * av_bsf_init() before sending any data to the filter.
-+ *
-+ * @param filter the filter for which to allocate an instance.
-+ * @param[out] ctx a pointer into which the pointer to the newly-allocated
-+ * context will be written. It must be freed with av_bsf_free() after the
-+ *                 filtering is done.
-+ *
-+ * @return 0 on success, a negative AVERROR code on failure
-+ */
-+int av_bsf_alloc(const AVBitStreamFilter* filter, AVBSFContext** ctx);
-+
-+/**
-+ * Prepare the filter for use, after all the parameters and options have been
-+ * set.
-+ *
-+ * @param ctx a AVBSFContext previously allocated with av_bsf_alloc()
-+ */
-+int av_bsf_init(AVBSFContext* ctx);
-+
-+/**
-+ * Submit a packet for filtering.
-+ *
-+ * After sending each packet, the filter must be completely drained by calling
-+ * av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or
-+ * AVERROR_EOF.
-+ *
-+ * @param ctx an initialized AVBSFContext
-+ * @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. 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.
-+ *  - AVERROR(EAGAIN) if packets need to be retrieved from the filter (using
-+ *    av_bsf_receive_packet()) before new input can be consumed.
-+ *  - Another negative AVERROR value if an error occurs.
-+ */
-+int av_bsf_send_packet(AVBSFContext* ctx, AVPacket* pkt);
-+
-+/**
-+ * Retrieve a filtered packet.
-+ *
-+ * @param ctx an initialized AVBSFContext
-+ * @param[out] pkt this struct will be filled with the contents of the filtered
-+ *                 packet. It is owned by the caller and must be freed using
-+ *                 av_packet_unref() when it is no longer needed.
-+ *                 This parameter should be "clean" (i.e. freshly allocated
-+ *                 with av_packet_alloc() or unreffed with av_packet_unref())
-+ *                 when this function is called. If this function returns
-+ *                 successfully, the contents of pkt will be completely
-+ *                 overwritten by the returned data. On failure, pkt is not
-+ *                 touched.
-+ *
-+ * @return
-+ *  - 0 on success.
-+ *  - AVERROR(EAGAIN) if more packets need to be sent to the filter (using
-+ *    av_bsf_send_packet()) to get more output.
-+ *  - AVERROR_EOF if there will be no further output from the filter.
-+ *  - Another negative AVERROR value if an error occurs.
-+ *
-+ * @note one input packet may result in several output packets, so after sending
-+ * a packet with av_bsf_send_packet(), this function needs to be called
-+ * repeatedly until it stops returning 0. It is also possible for a filter to
-+ * output fewer packets than were sent to it, so this function may return
-+ * AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call.
-+ */
-+int av_bsf_receive_packet(AVBSFContext* ctx, AVPacket* pkt);
-+
-+/**
-+ * Reset the internal bitstream filter state. Should be called e.g. when
-+ * seeking.
-+ */
-+void av_bsf_flush(AVBSFContext* ctx);
-+
-+/**
-+ * Free a bitstream filter context and everything associated with it; write NULL
-+ * into the supplied pointer.
-+ */
-+void av_bsf_free(AVBSFContext** ctx);
-+
-+/**
-+ * Get the AVClass for AVBSFContext. It can be used in combination with
-+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
-+ *
-+ * @see av_opt_find().
-+ */
-+const AVClass* av_bsf_get_class(void);
-+
-+/**
-+ * Structure for chain/list of bitstream filters.
-+ * Empty list can be allocated by av_bsf_list_alloc().
-+ */
-+typedef struct AVBSFList AVBSFList;
-+
-+/**
-+ * Allocate empty list of bitstream filters.
-+ * The list must be later freed by av_bsf_list_free()
-+ * or finalized by av_bsf_list_finalize().
-+ *
-+ * @return Pointer to @ref AVBSFList on success, NULL in case of failure
-+ */
-+AVBSFList* av_bsf_list_alloc(void);
-+
-+/**
-+ * Free list of bitstream filters.
-+ *
-+ * @param lst Pointer to pointer returned by av_bsf_list_alloc()
-+ */
-+void av_bsf_list_free(AVBSFList** lst);
-+
-+/**
-+ * Append bitstream filter to the list of bitstream filters.
-+ *
-+ * @param lst List to append to
-+ * @param bsf Filter context to be appended
-+ *
-+ * @return >=0 on success, negative AVERROR in case of failure
-+ */
-+int av_bsf_list_append(AVBSFList* lst, AVBSFContext* bsf);
-+
-+/**
-+ * Construct new bitstream filter context given it's name and options
-+ * and append it to the list of bitstream filters.
-+ *
-+ * @param lst      List to append to
-+ * @param bsf_name Name of the bitstream filter
-+ * @param options  Options for the bitstream filter, can be set to NULL
-+ *
-+ * @return >=0 on success, negative AVERROR in case of failure
-+ */
-+int av_bsf_list_append2(AVBSFList* lst, const char* bsf_name,
-+                        AVDictionary** options);
-+/**
-+ * Finalize list of bitstream filters.
-+ *
-+ * This function will transform @ref AVBSFList to single @ref AVBSFContext,
-+ * so the whole chain of bitstream filters can be treated as single filter
-+ * freshly allocated by av_bsf_alloc().
-+ * If the call is successful, @ref AVBSFList structure is freed and lst
-+ * will be set to NULL. In case of failure, caller is responsible for
-+ * freeing the structure by av_bsf_list_free()
-+ *
-+ * @param      lst Filter list structure to be transformed
-+ * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext
-+ * structure representing the chain of bitstream filters
-+ *
-+ * @return >=0 on success, negative AVERROR in case of failure
-+ */
-+int av_bsf_list_finalize(AVBSFList** lst, AVBSFContext** bsf);
-+
-+/**
-+ * Parse string describing list of bitstream filters and create single
-+ * @ref AVBSFContext describing the whole chain of bitstream filters.
-+ * Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext
-+ * freshly allocated by av_bsf_alloc().
-+ *
-+ * @param      str String describing chain of bitstream filters in format
-+ *                 `bsf1[=opt1=val1:opt2=val2][,bsf2]`
-+ * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext
-+ * structure representing the chain of bitstream filters
-+ *
-+ * @return >=0 on success, negative AVERROR in case of failure
-+ */
-+int av_bsf_list_parse_str(const char* str, AVBSFContext** bsf);
-+
-+/**
-+ * Get null/pass-through bitstream filter.
-+ *
-+ * @param[out] bsf Pointer to be set to new instance of pass-through bitstream
-+ * filter
-+ *
-+ * @return
-+ */
-+int av_bsf_get_null_filter(AVBSFContext** bsf);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif  // AVCODEC_BSF_H
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec.h
-@@ -0,0 +1,382 @@
-+/*
-+ * AVCodec 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_H
-+#define AVCODEC_CODEC_H
-+
-+#include <stdint.h>
-+
-+#include "libavutil/avutil.h"
-+#include "libavutil/hwcontext.h"
-+#include "libavutil/log.h"
-+#include "libavutil/pixfmt.h"
-+#include "libavutil/rational.h"
-+#include "libavutil/samplefmt.h"
-+
-+#include "libavcodec/codec_id.h"
-+#include "libavcodec/version_major.h"
-+
-+/**
-+ * @addtogroup lavc_core
-+ * @{
-+ */
-+
-+/**
-+ * Decoder can use draw_horiz_band callback.
-+ */
-+#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0)
-+/**
-+ * Codec uses get_buffer() or get_encode_buffer() for allocating buffers and
-+ * supports custom allocators.
-+ * If not set, it might not use get_buffer() or get_encode_buffer() at all, or
-+ * use operations that assume the buffer was allocated by
-+ * avcodec_default_get_buffer2 or avcodec_default_get_encode_buffer.
-+ */
-+#define AV_CODEC_CAP_DR1 (1 << 1)
-+/**
-+ * Encoder or decoder requires flushing with NULL input at the end in order to
-+ * give the complete and correct output.
-+ *
-+ * NOTE: If this flag is not set, the codec is guaranteed to never be fed with
-+ *       with NULL data. The user can still send NULL data to the public encode
-+ *       or decode function, but libavcodec will not pass it along to the codec
-+ *       unless this flag is set.
-+ *
-+ * Decoders:
-+ * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL,
-+ * avpkt->size=0 at the end to get the delayed data until the decoder no longer
-+ * returns frames.
-+ *
-+ * Encoders:
-+ * The encoder needs to be fed with NULL data at the end of encoding until the
-+ * encoder no longer returns data.
-+ *
-+ * NOTE: For encoders implementing the AVCodec.encode2() function, setting this
-+ *       flag also means that the encoder must set the pts and duration for
-+ *       each output packet. If this flag is not set, the pts and duration will
-+ *       be determined by libavcodec from the input frame.
-+ */
-+#define AV_CODEC_CAP_DELAY (1 << 5)
-+/**
-+ * Codec can be fed a final frame with a smaller size.
-+ * This can be used to prevent truncation of the last audio samples.
-+ */
-+#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6)
-+
-+#if FF_API_SUBFRAMES
-+/**
-+ * Codec can output multiple frames per AVPacket
-+ * Normally demuxers return one frame at a time, demuxers which do not do
-+ * are connected to a parser to split what they return into proper frames.
-+ * This flag is reserved to the very rare category of codecs which have a
-+ * bitstream that cannot be split into frames without timeconsuming
-+ * operations like full decoding. Demuxers carrying such bitstreams thus
-+ * may return multiple frames in a packet. This has many disadvantages like
-+ * prohibiting stream copy in many cases thus it should only be considered
-+ * as a last resort.
-+ */
-+#  define AV_CODEC_CAP_SUBFRAMES (1 << 8)
-+#endif
-+
-+/**
-+ * Codec is experimental and is thus avoided in favor of non experimental
-+ * encoders
-+ */
-+#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9)
-+/**
-+ * Codec should fill in channel configuration and samplerate instead of
-+ * container
-+ */
-+#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10)
-+/**
-+ * Codec supports frame-level multithreading.
-+ */
-+#define AV_CODEC_CAP_FRAME_THREADS (1 << 12)
-+/**
-+ * Codec supports slice-based (or partition-based) multithreading.
-+ */
-+#define AV_CODEC_CAP_SLICE_THREADS (1 << 13)
-+/**
-+ * Codec supports changed parameters at any point.
-+ */
-+#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14)
-+/**
-+ * Codec supports multithreading through a method other than slice- or
-+ * frame-level multithreading. Typically this marks wrappers around
-+ * multithreading-capable external libraries.
-+ */
-+#define AV_CODEC_CAP_OTHER_THREADS (1 << 15)
-+/**
-+ * Audio encoder supports receiving a different number of samples in each call.
-+ */
-+#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16)
-+/**
-+ * Decoder is not a preferred choice for probing.
-+ * This indicates that the decoder is not a good choice for probing.
-+ * It could for example be an expensive to spin up hardware decoder,
-+ * or it could simply not provide a lot of useful information about
-+ * the stream.
-+ * A decoder marked with this flag should only be used as last resort
-+ * choice for probing.
-+ */
-+#define AV_CODEC_CAP_AVOID_PROBING (1 << 17)
-+
-+/**
-+ * Codec is backed by a hardware implementation. Typically used to
-+ * identify a non-hwaccel hardware decoder. For information about hwaccels, use
-+ * avcodec_get_hw_config() instead.
-+ */
-+#define AV_CODEC_CAP_HARDWARE (1 << 18)
-+
-+/**
-+ * Codec is potentially backed by a hardware implementation, but not
-+ * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the
-+ * implementation provides some sort of internal fallback.
-+ */
-+#define AV_CODEC_CAP_HYBRID (1 << 19)
-+
-+/**
-+ * This encoder can reorder user opaque values from input AVFrames and return
-+ * them with corresponding output packets.
-+ * @see AV_CODEC_FLAG_COPY_OPAQUE
-+ */
-+#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)
-+
-+/**
-+ * The encoder is able to output reconstructed frame data, i.e. raw frames that
-+ * would be produced by decoding the encoded bitstream.
-+ *
-+ * Reconstructed frame output is enabled by the AV_CODEC_FLAG_RECON_FRAME flag.
-+ */
-+#define AV_CODEC_CAP_ENCODER_RECON_FRAME (1 << 22)
-+
-+/**
-+ * AVProfile.
-+ */
-+typedef struct AVProfile {
-+  int profile;
-+  const char* name;  ///< short name for the profile
-+} AVProfile;
-+
-+/**
-+ * AVCodec.
-+ */
-+typedef struct AVCodec {
-+  /**
-+   * Name of the codec implementation.
-+   * The name is globally unique among encoders and among decoders (but an
-+   * encoder and a decoder can share the same name).
-+   * This is the primary way to find a codec from the user perspective.
-+   */
-+  const char* name;
-+  /**
-+   * Descriptive name for the codec, meant to be more human readable than name.
-+   * You should use the NULL_IF_CONFIG_SMALL() macro to define it.
-+   */
-+  const char* long_name;
-+  enum AVMediaType type;
-+  enum AVCodecID id;
-+  /**
-+   * Codec capabilities.
-+   * see AV_CODEC_CAP_*
-+   */
-+  int capabilities;
-+  uint8_t max_lowres;  ///< maximum value for lowres supported by the decoder
-+  const AVRational*
-+      supported_framerates;  ///< array of supported framerates, or NULL if any,
-+                             ///< array is terminated by {0,0}
-+  const enum AVPixelFormat*
-+      pix_fmts;  ///< array of supported pixel formats, or NULL if unknown,
-+                 ///< array is terminated by -1
-+  const int*
-+      supported_samplerates;  ///< array of supported audio samplerates, or NULL
-+                              ///< if unknown, array is terminated by 0
-+  const enum AVSampleFormat*
-+      sample_fmts;  ///< array of supported sample formats, or NULL if unknown,
-+                    ///< array is terminated by -1
-+  const AVClass* priv_class;  ///< AVClass for the private context
-+  const AVProfile*
-+      profiles;  ///< array of recognized profiles, or NULL if unknown, array is
-+                 ///< terminated by {AV_PROFILE_UNKNOWN}
-+
-+  /**
-+   * Group name of the codec implementation.
-+   * This is a short symbolic name of the wrapper backing this codec. A
-+   * wrapper uses some kind of external implementation for the codec, such
-+   * as an external library, or a codec implementation provided by the OS or
-+   * the hardware.
-+   * If this field is NULL, this is a builtin, libavcodec native codec.
-+   * If non-NULL, this will be the suffix in AVCodec.name in most cases
-+   * (usually AVCodec.name will be of the form "<codec_name>_<wrapper_name>").
-+   */
-+  const char* wrapper_name;
-+
-+  /**
-+   * Array of supported channel layouts, terminated with a zeroed layout.
-+   */
-+  const AVChannelLayout* ch_layouts;
-+} AVCodec;
-+
-+/**
-+ * Iterate over all registered codecs.
-+ *
-+ * @param opaque a pointer where libavcodec will store the iteration state. Must
-+ *               point to NULL to start the iteration.
-+ *
-+ * @return the next registered codec or NULL when the iteration is
-+ *         finished
-+ */
-+const AVCodec* av_codec_iterate(void** opaque);
-+
-+/**
-+ * Find a registered decoder with a matching codec ID.
-+ *
-+ * @param id AVCodecID of the requested decoder
-+ * @return A decoder if one was found, NULL otherwise.
-+ */
-+const AVCodec* avcodec_find_decoder(enum AVCodecID id);
-+
-+/**
-+ * Find a registered decoder with the specified name.
-+ *
-+ * @param name name of the requested decoder
-+ * @return A decoder if one was found, NULL otherwise.
-+ */
-+const AVCodec* avcodec_find_decoder_by_name(const char* name);
-+
-+/**
-+ * Find a registered encoder with a matching codec ID.
-+ *
-+ * @param id AVCodecID of the requested encoder
-+ * @return An encoder if one was found, NULL otherwise.
-+ */
-+const AVCodec* avcodec_find_encoder(enum AVCodecID id);
-+
-+/**
-+ * Find a registered encoder with the specified name.
-+ *
-+ * @param name name of the requested encoder
-+ * @return An encoder if one was found, NULL otherwise.
-+ */
-+const AVCodec* avcodec_find_encoder_by_name(const char* name);
-+/**
-+ * @return a non-zero number if codec is an encoder, zero otherwise
-+ */
-+int av_codec_is_encoder(const AVCodec* codec);
-+
-+/**
-+ * @return a non-zero number if codec is a decoder, zero otherwise
-+ */
-+int av_codec_is_decoder(const AVCodec* codec);
-+
-+/**
-+ * Return a name for the specified profile, if available.
-+ *
-+ * @param codec the codec that is searched for the given profile
-+ * @param profile the profile value for which a name is requested
-+ * @return A name for the profile if found, NULL otherwise.
-+ */
-+const char* av_get_profile_name(const AVCodec* codec, int profile);
-+
-+enum {
-+  /**
-+   * The codec supports this format via the hw_device_ctx interface.
-+   *
-+   * When selecting this format, AVCodecContext.hw_device_ctx should
-+   * have been set to a device of the specified type before calling
-+   * avcodec_open2().
-+   */
-+  AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX = 0x01,
-+  /**
-+   * The codec supports this format via the hw_frames_ctx interface.
-+   *
-+   * When selecting this format for a decoder,
-+   * AVCodecContext.hw_frames_ctx should be set to a suitable frames
-+   * context inside the get_format() callback.  The frames context
-+   * must have been created on a device of the specified type.
-+   *
-+   * When selecting this format for an encoder,
-+   * AVCodecContext.hw_frames_ctx should be set to the context which
-+   * will be used for the input frames before calling avcodec_open2().
-+   */
-+  AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02,
-+  /**
-+   * The codec supports this format by some internal method.
-+   *
-+   * This format can be selected without any additional configuration -
-+   * no device or frames context is required.
-+   */
-+  AV_CODEC_HW_CONFIG_METHOD_INTERNAL = 0x04,
-+  /**
-+   * The codec supports this format by some ad-hoc method.
-+   *
-+   * Additional settings and/or function calls are required.  See the
-+   * codec-specific documentation for details.  (Methods requiring
-+   * this sort of configuration are deprecated and others should be
-+   * used in preference.)
-+   */
-+  AV_CODEC_HW_CONFIG_METHOD_AD_HOC = 0x08,
-+};
-+
-+typedef struct AVCodecHWConfig {
-+  /**
-+   * For decoders, a hardware pixel format which that decoder may be
-+   * able to decode to if suitable hardware is available.
-+   *
-+   * For encoders, a pixel format which the encoder may be able to
-+   * accept.  If set to AV_PIX_FMT_NONE, this applies to all pixel
-+   * formats supported by the codec.
-+   */
-+  enum AVPixelFormat pix_fmt;
-+  /**
-+   * Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible
-+   * setup methods which can be used with this configuration.
-+   */
-+  int methods;
-+  /**
-+   * The device type associated with the configuration.
-+   *
-+   * Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and
-+   * AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused.
-+   */
-+  enum AVHWDeviceType device_type;
-+} AVCodecHWConfig;
-+
-+/**
-+ * Retrieve supported hardware configurations for a codec.
-+ *
-+ * Values of index from zero to some maximum return the indexed configuration
-+ * descriptor; all other values return NULL.  If the codec does not support
-+ * any hardware configurations then it will always return NULL.
-+ */
-+const AVCodecHWConfig* avcodec_get_hw_config(const AVCodec* codec, int index);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVCODEC_CODEC_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec_desc.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec_desc.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec_desc.h
-@@ -0,0 +1,134 @@
-+/*
-+ * 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 AV_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)
-+
-+/**
-+ * Video codec supports separate coding of fields in interlaced frames.
-+ */
-+#define AV_CODEC_PROP_FIELDS (1 << 4)
-+
-+/**
-+ * 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/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec_id.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec_id.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec_id.h
-@@ -0,0 +1,676 @@
-+/*
-+ * 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
-+
-+#include "libavutil/avutil.h"
-+#include "libavutil/samplefmt.h"
-+
-+#include "version_major.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_PGX,
-+  AV_CODEC_ID_AVS3,
-+  AV_CODEC_ID_MSP2,
-+  AV_CODEC_ID_VVC,
-+#define AV_CODEC_ID_H266 AV_CODEC_ID_VVC
-+  AV_CODEC_ID_Y41P,
-+  AV_CODEC_ID_AVRP,
-+  AV_CODEC_ID_012V,
-+  AV_CODEC_ID_AVUI,
-+  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,
-+  AV_CODEC_ID_NOTCHLC,
-+  AV_CODEC_ID_PFM,
-+  AV_CODEC_ID_MOBICLIP,
-+  AV_CODEC_ID_PHOTOCD,
-+  AV_CODEC_ID_IPU,
-+  AV_CODEC_ID_ARGO,
-+  AV_CODEC_ID_CRI,
-+  AV_CODEC_ID_SIMBIOSIS_IMX,
-+  AV_CODEC_ID_SGA_VIDEO,
-+  AV_CODEC_ID_GEM,
-+  AV_CODEC_ID_VBN,
-+  AV_CODEC_ID_JPEGXL,
-+  AV_CODEC_ID_QOI,
-+  AV_CODEC_ID_PHM,
-+  AV_CODEC_ID_RADIANCE_HDR,
-+  AV_CODEC_ID_WBMP,
-+  AV_CODEC_ID_MEDIA100,
-+  AV_CODEC_ID_VQC,
-+  AV_CODEC_ID_PDV,
-+  AV_CODEC_ID_EVC,
-+  AV_CODEC_ID_RTV1,
-+  AV_CODEC_ID_VMIX,
-+  AV_CODEC_ID_LEAD,
-+
-+  /* 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,
-+  AV_CODEC_ID_PCM_S64BE,
-+  AV_CODEC_ID_PCM_F16LE,
-+  AV_CODEC_ID_PCM_F24LE,
-+  AV_CODEC_ID_PCM_VIDC,
-+  AV_CODEC_ID_PCM_SGA,
-+
-+  /* 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,
-+  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,
-+  AV_CODEC_ID_ADPCM_IMA_CUNNING,
-+  AV_CODEC_ID_ADPCM_IMA_MOFLEX,
-+  AV_CODEC_ID_ADPCM_IMA_ACORN,
-+  AV_CODEC_ID_ADPCM_XMD,
-+
-+  /* 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,
-+  AV_CODEC_ID_GREMLIN_DPCM,
-+  AV_CODEC_ID_DERF_DPCM,
-+  AV_CODEC_ID_WADY_DPCM,
-+  AV_CODEC_ID_CBD2_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,
-+  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,
-+  AV_CODEC_ID_FASTAUDIO,
-+  AV_CODEC_ID_MSNSIREN,
-+  AV_CODEC_ID_DFPWM,
-+  AV_CODEC_ID_BONK,
-+  AV_CODEC_ID_MISC4,
-+  AV_CODEC_ID_APAC,
-+  AV_CODEC_ID_FTR,
-+  AV_CODEC_ID_WAVARC,
-+  AV_CODEC_ID_RKA,
-+  AV_CODEC_ID_AC4,
-+  AV_CODEC_ID_OSQ,
-+  AV_CODEC_ID_QOA,
-+  AV_CODEC_ID_LC3,
-+
-+  /* 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,
-+  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,
-+  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_SMPTE_2038,
-+
-+  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
-+  /**
-+   * Dummy null video codec, useful mainly for development and debugging.
-+   * Null encoder/decoder discard all input and never return any output.
-+   */
-+  AV_CODEC_ID_VNULL,
-+  /**
-+   * Dummy null audio codec, useful mainly for development and debugging.
-+   * Null encoder/decoder discard all input and never return any output.
-+   */
-+  AV_CODEC_ID_ANULL,
-+};
-+
-+/**
-+ * Get the type of the given codec.
-+ */
-+enum AVMediaType avcodec_get_type(enum AVCodecID codec_id);
-+
-+/**
-+ * Get the name of a codec.
-+ * @return  a static string identifying the codec; never NULL
-+ */
-+const char* avcodec_get_name(enum AVCodecID id);
-+
-+/**
-+ * Return codec bits per sample.
-+ *
-+ * @param[in] codec_id the codec
-+ * @return Number of bits per sample or zero if unknown for the given codec.
-+ */
-+int av_get_bits_per_sample(enum AVCodecID codec_id);
-+
-+/**
-+ * Return codec bits per sample.
-+ * Only return non-zero if the bits per sample is exactly correct, not an
-+ * approximation.
-+ *
-+ * @param[in] codec_id the codec
-+ * @return Number of bits per sample or zero if unknown for the given codec.
-+ */
-+int av_get_exact_bits_per_sample(enum AVCodecID codec_id);
-+
-+/**
-+ * Return a name for the specified profile, if available.
-+ *
-+ * @param codec_id the ID of the codec to which the requested profile belongs
-+ * @param profile the profile value for which a name is requested
-+ * @return A name for the profile if found, NULL otherwise.
-+ *
-+ * @note unlike av_get_profile_name(), which searches a list of profiles
-+ *       supported by a specific decoder or encoder implementation, this
-+ *       function searches the list of profiles from the AVCodecDescriptor
-+ */
-+const char* avcodec_profile_name(enum AVCodecID codec_id, int profile);
-+
-+/**
-+ * Return the PCM codec associated with a sample format.
-+ * @param be  endianness, 0 for little, 1 for big,
-+ *            -1 (or anything else) for native
-+ * @return  AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE
-+ */
-+enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif  // AVCODEC_CODEC_ID_H
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec_par.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec_par.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/codec_par.h
-@@ -0,0 +1,250 @@
-+/*
-+ * Codec parameters 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_PAR_H
-+#define AVCODEC_CODEC_PAR_H
-+
-+#include <stdint.h>
-+
-+#include "libavutil/avutil.h"
-+#include "libavutil/channel_layout.h"
-+#include "libavutil/rational.h"
-+#include "libavutil/pixfmt.h"
-+
-+#include "codec_id.h"
-+#include "defs.h"
-+#include "packet.h"
-+
-+/**
-+ * @addtogroup lavc_core
-+ * @{
-+ */
-+
-+/**
-+ * This struct describes the properties of an encoded stream.
-+ *
-+ * sizeof(AVCodecParameters) is not a part of the public ABI, this struct must
-+ * be allocated with avcodec_parameters_alloc() and freed with
-+ * avcodec_parameters_free().
-+ */
-+typedef struct AVCodecParameters {
-+  /**
-+   * General type of the encoded data.
-+   */
-+  enum AVMediaType codec_type;
-+  /**
-+   * Specific type of the encoded data (the codec used).
-+   */
-+  enum AVCodecID codec_id;
-+  /**
-+   * Additional information about the codec (corresponds to the AVI FOURCC).
-+   */
-+  uint32_t codec_tag;
-+
-+  /**
-+   * Extra binary data needed for initializing the decoder, codec-dependent.
-+   *
-+   * Must be allocated with av_malloc() and will be freed by
-+   * avcodec_parameters_free(). The allocated size of extradata must be at
-+   * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding
-+   * bytes zeroed.
-+   */
-+  uint8_t* extradata;
-+  /**
-+   * Size of the extradata content in bytes.
-+   */
-+  int extradata_size;
-+
-+  /**
-+   * Additional data associated with the entire stream.
-+   *
-+   * Should be allocated with av_packet_side_data_new() or
-+   * av_packet_side_data_add(), and will be freed by avcodec_parameters_free().
-+   */
-+  AVPacketSideData* coded_side_data;
-+
-+  /**
-+   * Amount of entries in @ref coded_side_data.
-+   */
-+  int nb_coded_side_data;
-+
-+  /**
-+   * - video: the pixel format, the value corresponds to enum AVPixelFormat.
-+   * - audio: the sample format, the value corresponds to enum AVSampleFormat.
-+   */
-+  int format;
-+
-+  /**
-+   * The average bitrate of the encoded data (in bits per second).
-+   */
-+  int64_t bit_rate;
-+
-+  /**
-+   * The number of bits per sample in the codedwords.
-+   *
-+   * This is basically the bitrate per sample. It is mandatory for a bunch of
-+   * formats to actually decode them. It's the number of bits for one sample in
-+   * the actual coded bitstream.
-+   *
-+   * This could be for example 4 for ADPCM
-+   * For PCM formats this matches bits_per_raw_sample
-+   * Can be 0
-+   */
-+  int bits_per_coded_sample;
-+
-+  /**
-+   * This is the number of valid bits in each output sample. If the
-+   * sample format has more bits, the least significant bits are additional
-+   * padding bits, which are always 0. Use right shifts to reduce the sample
-+   * to its actual size. For example, audio formats with 24 bit samples will
-+   * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32.
-+   * To get the original sample use "(int32_t)sample >> 8"."
-+   *
-+   * For ADPCM this might be 12 or 16 or similar
-+   * Can be 0
-+   */
-+  int bits_per_raw_sample;
-+
-+  /**
-+   * Codec-specific bitstream restrictions that the stream conforms to.
-+   */
-+  int profile;
-+  int level;
-+
-+  /**
-+   * Video only. The dimensions of the video frame in pixels.
-+   */
-+  int width;
-+  int height;
-+
-+  /**
-+   * Video only. The aspect ratio (width / height) which a single pixel
-+   * should have when displayed.
-+   *
-+   * When the aspect ratio is unknown / undefined, the numerator should be
-+   * set to 0 (the denominator may have any value).
-+   */
-+  AVRational sample_aspect_ratio;
-+
-+  /**
-+   * Video only. Number of frames per second, for streams with constant frame
-+   * durations. Should be set to { 0, 1 } when some frames have differing
-+   * durations or if the value is not known.
-+   *
-+   * @note This field correponds to values that are stored in codec-level
-+   * headers and is typically overridden by container/transport-layer
-+   * timestamps, when available. It should thus be used only as a last resort,
-+   * when no higher-level timing information is available.
-+   */
-+  AVRational framerate;
-+
-+  /**
-+   * Video only. The order of the fields in interlaced video.
-+   */
-+  enum AVFieldOrder field_order;
-+
-+  /**
-+   * Video only. Additional colorspace characteristics.
-+   */
-+  enum AVColorRange color_range;
-+  enum AVColorPrimaries color_primaries;
-+  enum AVColorTransferCharacteristic color_trc;
-+  enum AVColorSpace color_space;
-+  enum AVChromaLocation chroma_location;
-+
-+  /**
-+   * Video only. Number of delayed frames.
-+   */
-+  int video_delay;
-+
-+  /**
-+   * Audio only. The channel layout and number of channels.
-+   */
-+  AVChannelLayout ch_layout;
-+  /**
-+   * Audio only. The number of audio samples per second.
-+   */
-+  int sample_rate;
-+  /**
-+   * Audio only. The number of bytes per coded audio frame, required by some
-+   * formats.
-+   *
-+   * Corresponds to nBlockAlign in WAVEFORMATEX.
-+   */
-+  int block_align;
-+  /**
-+   * Audio only. Audio frame size, if known. Required by some formats to be
-+   * static.
-+   */
-+  int frame_size;
-+
-+  /**
-+   * Audio only. The amount of padding (in samples) inserted by the encoder at
-+   * the beginning of the audio. I.e. this number of leading decoded samples
-+   * must be discarded by the caller to get the original audio without leading
-+   * padding.
-+   */
-+  int initial_padding;
-+  /**
-+   * Audio only. The amount of padding (in samples) appended by the encoder to
-+   * the end of the audio. I.e. this number of decoded samples must be
-+   * discarded by the caller from the end of the stream to get the original
-+   * audio without any trailing padding.
-+   */
-+  int trailing_padding;
-+  /**
-+   * Audio only. Number of samples to skip after a discontinuity.
-+   */
-+  int seek_preroll;
-+} AVCodecParameters;
-+
-+/**
-+ * Allocate a new AVCodecParameters and set its fields to default values
-+ * (unknown/invalid/0). The returned struct must be freed with
-+ * avcodec_parameters_free().
-+ */
-+AVCodecParameters* avcodec_parameters_alloc(void);
-+
-+/**
-+ * Free an AVCodecParameters instance and everything associated with it and
-+ * write NULL to the supplied pointer.
-+ */
-+void avcodec_parameters_free(AVCodecParameters** par);
-+
-+/**
-+ * Copy the contents of src to dst. Any allocated fields in dst are freed and
-+ * replaced with newly allocated duplicates of the corresponding fields in src.
-+ *
-+ * @return >= 0 on success, a negative AVERROR code on failure.
-+ */
-+int avcodec_parameters_copy(AVCodecParameters* dst,
-+                            const AVCodecParameters* src);
-+
-+/**
-+ * This function is the same as av_get_audio_frame_duration(), except it works
-+ * with AVCodecParameters instead of an AVCodecContext.
-+ */
-+int av_get_audio_frame_duration2(AVCodecParameters* par, int frame_bytes);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif  // AVCODEC_CODEC_PAR_H
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/defs.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/defs.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/defs.h
-@@ -0,0 +1,344 @@
-+/*
-+ *
-+ * 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_DEFS_H
-+#define AVCODEC_DEFS_H
-+
-+/**
-+ * @file
-+ * @ingroup libavc
-+ * Misc types and constants that do not belong anywhere else.
-+ */
-+
-+#include <stdint.h>
-+#include <stdlib.h>
-+
-+/**
-+ * @ingroup lavc_decoding
-+ * Required number of additionally allocated bytes at the end of the input
-+ * bitstream for decoding. This is mainly needed because some optimized
-+ * bitstream readers read 32 or 64 bit at once and could read over the end.<br>
-+ * Note: If the first 23 bits of the additional bytes are not 0, then damaged
-+ * MPEG bitstreams could cause overread and segfault.
-+ */
-+#define AV_INPUT_BUFFER_PADDING_SIZE 64
-+
-+/**
-+ * Verify checksums embedded in the bitstream (could be of either encoded or
-+ * decoded data, depending on the format) and print an error message on
-+ * mismatch. If AV_EF_EXPLODE is also set, a mismatching checksum will result in
-+ * the decoder/demuxer returning an error.
-+ */
-+#define AV_EF_CRCCHECK (1 << 0)
-+#define AV_EF_BITSTREAM (1 << 1)  ///< detect bitstream specification deviations
-+#define AV_EF_BUFFER (1 << 2)     ///< detect improper bitstream length
-+#define AV_EF_EXPLODE (1 << 3)    ///< abort decoding on minor error detection
-+
-+#define AV_EF_IGNORE_ERR (1 << 15)  ///< ignore errors and continue
-+#define AV_EF_CAREFUL \
-+  (1 << 16)  ///< consider things that violate the spec, are fast to calculate
-+             ///< and have not been seen in the wild as errors
-+#define AV_EF_COMPLIANT \
-+  (1 << 17)  ///< consider all spec non compliances as errors
-+#define AV_EF_AGGRESSIVE \
-+  (1 << 18)  ///< consider things that a sane encoder/muxer should not do as an
-+             ///< error
-+
-+#define FF_COMPLIANCE_VERY_STRICT \
-+  2  ///< Strictly conform to an older more strict version of the spec or
-+     ///< reference software.
-+#define FF_COMPLIANCE_STRICT \
-+  1  ///< Strictly conform to all the things in the spec no matter what
-+     ///< consequences.
-+#define FF_COMPLIANCE_NORMAL 0
-+#define FF_COMPLIANCE_UNOFFICIAL -1  ///< Allow unofficial extensions
-+#define FF_COMPLIANCE_EXPERIMENTAL \
-+  -2  ///< Allow nonstandardized experimental things.
-+
-+#define AV_PROFILE_UNKNOWN -99
-+#define AV_PROFILE_RESERVED -100
-+
-+#define AV_PROFILE_AAC_MAIN 0
-+#define AV_PROFILE_AAC_LOW 1
-+#define AV_PROFILE_AAC_SSR 2
-+#define AV_PROFILE_AAC_LTP 3
-+#define AV_PROFILE_AAC_HE 4
-+#define AV_PROFILE_AAC_HE_V2 28
-+#define AV_PROFILE_AAC_LD 22
-+#define AV_PROFILE_AAC_ELD 38
-+#define AV_PROFILE_MPEG2_AAC_LOW 128
-+#define AV_PROFILE_MPEG2_AAC_HE 131
-+
-+#define AV_PROFILE_DNXHD 0
-+#define AV_PROFILE_DNXHR_LB 1
-+#define AV_PROFILE_DNXHR_SQ 2
-+#define AV_PROFILE_DNXHR_HQ 3
-+#define AV_PROFILE_DNXHR_HQX 4
-+#define AV_PROFILE_DNXHR_444 5
-+
-+#define AV_PROFILE_DTS 20
-+#define AV_PROFILE_DTS_ES 30
-+#define AV_PROFILE_DTS_96_24 40
-+#define AV_PROFILE_DTS_HD_HRA 50
-+#define AV_PROFILE_DTS_HD_MA 60
-+#define AV_PROFILE_DTS_EXPRESS 70
-+#define AV_PROFILE_DTS_HD_MA_X 61
-+#define AV_PROFILE_DTS_HD_MA_X_IMAX 62
-+
-+#define AV_PROFILE_EAC3_DDP_ATMOS 30
-+
-+#define AV_PROFILE_TRUEHD_ATMOS 30
-+
-+#define AV_PROFILE_MPEG2_422 0
-+#define AV_PROFILE_MPEG2_HIGH 1
-+#define AV_PROFILE_MPEG2_SS 2
-+#define AV_PROFILE_MPEG2_SNR_SCALABLE 3
-+#define AV_PROFILE_MPEG2_MAIN 4
-+#define AV_PROFILE_MPEG2_SIMPLE 5
-+
-+#define AV_PROFILE_H264_CONSTRAINED (1 << 9)  // 8+1; constraint_set1_flag
-+#define AV_PROFILE_H264_INTRA (1 << 11)       // 8+3; constraint_set3_flag
-+
-+#define AV_PROFILE_H264_BASELINE 66
-+#define AV_PROFILE_H264_CONSTRAINED_BASELINE (66 | AV_PROFILE_H264_CONSTRAINED)
-+#define AV_PROFILE_H264_MAIN 77
-+#define AV_PROFILE_H264_EXTENDED 88
-+#define AV_PROFILE_H264_HIGH 100
-+#define AV_PROFILE_H264_HIGH_10 110
-+#define AV_PROFILE_H264_HIGH_10_INTRA (110 | AV_PROFILE_H264_INTRA)
-+#define AV_PROFILE_H264_MULTIVIEW_HIGH 118
-+#define AV_PROFILE_H264_HIGH_422 122
-+#define AV_PROFILE_H264_HIGH_422_INTRA (122 | AV_PROFILE_H264_INTRA)
-+#define AV_PROFILE_H264_STEREO_HIGH 128
-+#define AV_PROFILE_H264_HIGH_444 144
-+#define AV_PROFILE_H264_HIGH_444_PREDICTIVE 244
-+#define AV_PROFILE_H264_HIGH_444_INTRA (244 | AV_PROFILE_H264_INTRA)
-+#define AV_PROFILE_H264_CAVLC_444 44
-+
-+#define AV_PROFILE_VC1_SIMPLE 0
-+#define AV_PROFILE_VC1_MAIN 1
-+#define AV_PROFILE_VC1_COMPLEX 2
-+#define AV_PROFILE_VC1_ADVANCED 3
-+
-+#define AV_PROFILE_MPEG4_SIMPLE 0
-+#define AV_PROFILE_MPEG4_SIMPLE_SCALABLE 1
-+#define AV_PROFILE_MPEG4_CORE 2
-+#define AV_PROFILE_MPEG4_MAIN 3
-+#define AV_PROFILE_MPEG4_N_BIT 4
-+#define AV_PROFILE_MPEG4_SCALABLE_TEXTURE 5
-+#define AV_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION 6
-+#define AV_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE 7
-+#define AV_PROFILE_MPEG4_HYBRID 8
-+#define AV_PROFILE_MPEG4_ADVANCED_REAL_TIME 9
-+#define AV_PROFILE_MPEG4_CORE_SCALABLE 10
-+#define AV_PROFILE_MPEG4_ADVANCED_CODING 11
-+#define AV_PROFILE_MPEG4_ADVANCED_CORE 12
-+#define AV_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
-+#define AV_PROFILE_MPEG4_SIMPLE_STUDIO 14
-+#define AV_PROFILE_MPEG4_ADVANCED_SIMPLE 15
-+
-+#define AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0 1
-+#define AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1 2
-+#define AV_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION 32768
-+#define AV_PROFILE_JPEG2000_DCINEMA_2K 3
-+#define AV_PROFILE_JPEG2000_DCINEMA_4K 4
-+
-+#define AV_PROFILE_VP9_0 0
-+#define AV_PROFILE_VP9_1 1
-+#define AV_PROFILE_VP9_2 2
-+#define AV_PROFILE_VP9_3 3
-+
-+#define AV_PROFILE_HEVC_MAIN 1
-+#define AV_PROFILE_HEVC_MAIN_10 2
-+#define AV_PROFILE_HEVC_MAIN_STILL_PICTURE 3
-+#define AV_PROFILE_HEVC_REXT 4
-+#define AV_PROFILE_HEVC_SCC 9
-+
-+#define AV_PROFILE_VVC_MAIN_10 1
-+#define AV_PROFILE_VVC_MAIN_10_444 33
-+
-+#define AV_PROFILE_AV1_MAIN 0
-+#define AV_PROFILE_AV1_HIGH 1
-+#define AV_PROFILE_AV1_PROFESSIONAL 2
-+
-+#define AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT 0xc0
-+#define AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1
-+#define AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT 0xc2
-+#define AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS 0xc3
-+#define AV_PROFILE_MJPEG_JPEG_LS 0xf7
-+
-+#define AV_PROFILE_SBC_MSBC 1
-+
-+#define AV_PROFILE_PRORES_PROXY 0
-+#define AV_PROFILE_PRORES_LT 1
-+#define AV_PROFILE_PRORES_STANDARD 2
-+#define AV_PROFILE_PRORES_HQ 3
-+#define AV_PROFILE_PRORES_4444 4
-+#define AV_PROFILE_PRORES_XQ 5
-+
-+#define AV_PROFILE_ARIB_PROFILE_A 0
-+#define AV_PROFILE_ARIB_PROFILE_C 1
-+
-+#define AV_PROFILE_KLVA_SYNC 0
-+#define AV_PROFILE_KLVA_ASYNC 1
-+
-+#define AV_PROFILE_EVC_BASELINE 0
-+#define AV_PROFILE_EVC_MAIN 1
-+
-+#define AV_LEVEL_UNKNOWN -99
-+
-+enum AVFieldOrder {
-+  AV_FIELD_UNKNOWN,
-+  AV_FIELD_PROGRESSIVE,
-+  AV_FIELD_TT,  ///< Top coded_first, top displayed first
-+  AV_FIELD_BB,  ///< Bottom coded first, bottom displayed first
-+  AV_FIELD_TB,  ///< Top coded first, bottom displayed first
-+  AV_FIELD_BT,  ///< Bottom coded first, top displayed first
-+};
-+
-+/**
-+ * @ingroup lavc_decoding
-+ */
-+enum AVDiscard {
-+  /* We leave some space between them for extensions (drop some
-+   * keyframes for intra-only or drop just some bidir frames). */
-+  AVDISCARD_NONE = -16,  ///< discard nothing
-+  AVDISCARD_DEFAULT =
-+      0,                 ///< discard useless packets like 0 size packets in avi
-+  AVDISCARD_NONREF = 8,  ///< discard all non reference
-+  AVDISCARD_BIDIR = 16,  ///< discard all bidirectional frames
-+  AVDISCARD_NONINTRA = 24,  ///< discard all non intra frames
-+  AVDISCARD_NONKEY = 32,    ///< discard all frames except keyframes
-+  AVDISCARD_ALL = 48,       ///< discard all
-+};
-+
-+enum AVAudioServiceType {
-+  AV_AUDIO_SERVICE_TYPE_MAIN = 0,
-+  AV_AUDIO_SERVICE_TYPE_EFFECTS = 1,
-+  AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2,
-+  AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED = 3,
-+  AV_AUDIO_SERVICE_TYPE_DIALOGUE = 4,
-+  AV_AUDIO_SERVICE_TYPE_COMMENTARY = 5,
-+  AV_AUDIO_SERVICE_TYPE_EMERGENCY = 6,
-+  AV_AUDIO_SERVICE_TYPE_VOICE_OVER = 7,
-+  AV_AUDIO_SERVICE_TYPE_KARAOKE = 8,
-+  AV_AUDIO_SERVICE_TYPE_NB,  ///< Not part of ABI
-+};
-+
-+/**
-+ * Pan Scan area.
-+ * This specifies the area which should be displayed.
-+ * Note there may be multiple such areas for one frame.
-+ */
-+typedef struct AVPanScan {
-+  /**
-+   * id
-+   * - encoding: Set by user.
-+   * - decoding: Set by libavcodec.
-+   */
-+  int id;
-+
-+  /**
-+   * width and height in 1/16 pel
-+   * - encoding: Set by user.
-+   * - decoding: Set by libavcodec.
-+   */
-+  int width;
-+  int height;
-+
-+  /**
-+   * position of the top left corner in 1/16 pel for up to 3 fields/frames
-+   * - encoding: Set by user.
-+   * - decoding: Set by libavcodec.
-+   */
-+  int16_t position[3][2];
-+} AVPanScan;
-+
-+/**
-+ * This structure describes the bitrate properties of an encoded bitstream. It
-+ * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD
-+ * parameters for H.264/HEVC.
-+ */
-+typedef struct AVCPBProperties {
-+  /**
-+   * Maximum bitrate of the stream, in bits per second.
-+   * Zero if unknown or unspecified.
-+   */
-+  int64_t max_bitrate;
-+  /**
-+   * Minimum bitrate of the stream, in bits per second.
-+   * Zero if unknown or unspecified.
-+   */
-+  int64_t min_bitrate;
-+  /**
-+   * Average bitrate of the stream, in bits per second.
-+   * Zero if unknown or unspecified.
-+   */
-+  int64_t avg_bitrate;
-+
-+  /**
-+   * The size of the buffer to which the ratecontrol is applied, in bits.
-+   * Zero if unknown or unspecified.
-+   */
-+  int64_t buffer_size;
-+
-+  /**
-+   * The delay between the time the packet this structure is associated with
-+   * is received and the time when it should be decoded, in periods of a 27MHz
-+   * clock.
-+   *
-+   * UINT64_MAX when unknown or unspecified.
-+   */
-+  uint64_t vbv_delay;
-+} AVCPBProperties;
-+
-+/**
-+ * Allocate a CPB properties structure and initialize its fields to default
-+ * values.
-+ *
-+ * @param size if non-NULL, the size of the allocated struct will be written
-+ *             here. This is useful for embedding it in side data.
-+ *
-+ * @return the newly allocated struct or NULL on failure
-+ */
-+AVCPBProperties* av_cpb_properties_alloc(size_t* size);
-+
-+/**
-+ * 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;
-+
-+/**
-+ * Encode extradata length to a buffer. Used by xiph codecs.
-+ *
-+ * @param s buffer to write to; must be at least (v/255+1) bytes long
-+ * @param v size of extradata in bytes
-+ * @return number of bytes written to the buffer.
-+ */
-+unsigned int av_xiphlacing(unsigned char* s, unsigned int v);
-+
-+#endif  // AVCODEC_DEFS_H
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/packet.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/packet.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/packet.h
-@@ -0,0 +1,871 @@
-+/*
-+ * 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 "libavutil/version.h"
-+
-+#include "libavcodec/version_major.h"
-+
-+/**
-+ * @defgroup lavc_packet_side_data AVPacketSideData
-+ *
-+ * Types and functions for working with AVPacketSideData.
-+ * @{
-+ */
-+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=main/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,
-+
-+  /**
-+   * Timecode which conforms to SMPTE ST 12-1:2014. 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 documentation
-+   * of av_timecode_get_smpte_from_framenum() function in libavutil/timecode.h.
-+   */
-+  AV_PKT_DATA_S12M_TIMECODE,
-+
-+  /**
-+   * HDR10+ dynamic metadata associated with a video frame. The metadata is in
-+   * the form of the AVDynamicHDRPlus struct and contains
-+   * information for color volume transform - application 4 of
-+   * SMPTE 2094-40:2016 standard.
-+   */
-+  AV_PKT_DATA_DYNAMIC_HDR10_PLUS,
-+
-+  /**
-+   * IAMF Mix Gain Parameter Data associated with the audio frame. This metadata
-+   * is in the form of the AVIAMFParamDefinition struct and contains information
-+   * defined in sections 3.6.1 and 3.8.1 of the Immersive Audio Model and
-+   * Formats standard.
-+   */
-+  AV_PKT_DATA_IAMF_MIX_GAIN_PARAM,
-+
-+  /**
-+   * IAMF Demixing Info Parameter Data associated with the audio frame. This
-+   * metadata is in the form of the AVIAMFParamDefinition struct and contains
-+   * information defined in sections 3.6.1 and 3.8.2 of the Immersive Audio
-+   * Model and Formats standard.
-+   */
-+  AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM,
-+
-+  /**
-+   * IAMF Recon Gain Info Parameter Data associated with the audio frame. This
-+   * metadata is in the form of the AVIAMFParamDefinition struct and contains
-+   * information defined in sections 3.6.1 and 3.8.3 of the Immersive Audio
-+   * Model and Formats standard.
-+   */
-+  AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM,
-+
-+  /**
-+   * Ambient viewing environment metadata, as defined by H.274. This metadata
-+   * should be associated with a video stream and contains data in the form
-+   * of the AVAmbientViewingEnvironment struct.
-+   */
-+  AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT,
-+
-+  /**
-+   * 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
-+};
-+
-+#if FF_API_QUALITY_FACTOR
-+#  define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS  // DEPRECATED
-+#endif
-+
-+/**
-+ * This structure stores auxiliary information for decoding, presenting, or
-+ * otherwise processing the coded stream. It is typically exported by demuxers
-+ * and encoders and can be fed to decoders and muxers either in a per packet
-+ * basis, or as global side data (applying to the entire coded stream).
-+ *
-+ * Global side data is handled as follows:
-+ * - During demuxing, it may be exported through
-+ *   @ref AVStream.codecpar.side_data "AVStream's codec parameters", which can
-+ *   then be passed as input to decoders through the
-+ *   @ref AVCodecContext.coded_side_data "decoder context's side data", for
-+ *   initialization.
-+ * - For muxing, it can be fed through @ref AVStream.codecpar.side_data
-+ *   "AVStream's codec parameters", typically  the output of encoders through
-+ *   the @ref AVCodecContext.coded_side_data "encoder context's side data", for
-+ *   initialization.
-+ *
-+ * Packet specific side data is handled as follows:
-+ * - During demuxing, it may be exported through @ref AVPacket.side_data
-+ *   "AVPacket's side data", which can then be passed as input to decoders.
-+ * - For muxing, it can be fed through @ref AVPacket.side_data "AVPacket's
-+ *   side data", typically the output of encoders.
-+ *
-+ * Different modules may accept or export different types of side data
-+ * depending on media type and codec. Refer to @ref AVPacketSideDataType for a
-+ * list of defined types and where they may be found or used.
-+ */
-+typedef struct AVPacketSideData {
-+  uint8_t* data;
-+  size_t size;
-+  enum AVPacketSideDataType type;
-+} AVPacketSideData;
-+
-+/**
-+ * Allocate a new packet side data.
-+ *
-+ * @param sd    pointer to an array of side data to which the side data should
-+ *              be added. *sd may be NULL, in which case the array will be
-+ *              initialized.
-+ * @param nb_sd pointer to an integer containing the number of entries in
-+ *              the array. The integer value will be increased by 1 on success.
-+ * @param type  side data type
-+ * @param size  desired side data size
-+ * @param flags currently unused. Must be zero
-+ *
-+ * @return pointer to freshly allocated side data on success, or NULL otherwise.
-+ */
-+AVPacketSideData* av_packet_side_data_new(AVPacketSideData** psd, int* pnb_sd,
-+                                          enum AVPacketSideDataType type,
-+                                          size_t size, int flags);
-+
-+/**
-+ * Wrap existing data as packet side data.
-+ *
-+ * @param sd    pointer to an array of side data to which the side data should
-+ *              be added. *sd may be NULL, in which case the array will be
-+ *              initialized
-+ * @param nb_sd pointer to an integer containing the number of entries in
-+ *              the array. The integer value will be increased by 1 on success.
-+ * @param type  side data type
-+ * @param data  a data array. It must be allocated with the av_malloc() family
-+ *              of functions. The ownership of the data is transferred to the
-+ *              side data array on success
-+ * @param size  size of the data array
-+ * @param flags currently unused. Must be zero
-+ *
-+ * @return pointer to freshly allocated side data on success, or NULL otherwise
-+ *         On failure, the side data array is unchanged and the data remains
-+ *         owned by the caller.
-+ */
-+AVPacketSideData* av_packet_side_data_add(AVPacketSideData** sd, int* nb_sd,
-+                                          enum AVPacketSideDataType type,
-+                                          void* data, size_t size, int flags);
-+
-+/**
-+ * Get side information from a side data array.
-+ *
-+ * @param sd    the array from which the side data should be fetched
-+ * @param nb_sd value containing the number of entries in the array.
-+ * @param type  desired side information type
-+ *
-+ * @return pointer to side data if present or NULL otherwise
-+ */
-+const AVPacketSideData* av_packet_side_data_get(const AVPacketSideData* sd,
-+                                                int nb_sd,
-+                                                enum AVPacketSideDataType type);
-+
-+/**
-+ * Remove side data of the given type from a side data array.
-+ *
-+ * @param sd    the array from which the side data should be removed
-+ * @param nb_sd pointer to an integer containing the number of entries in
-+ *              the array. Will be reduced by the amount of entries removed
-+ *              upon return
-+ * @param type  side information type
-+ */
-+void av_packet_side_data_remove(AVPacketSideData* sd, int* nb_sd,
-+                                enum AVPacketSideDataType type);
-+
-+/**
-+ * Convenience function to free all the side data stored in an array, and
-+ * the array itself.
-+ *
-+ * @param sd    pointer to array of side data to free. Will be set to NULL
-+ *              upon return.
-+ * @param nb_sd pointer to an integer containing the number of entries in
-+ *              the array. Will be set to 0 upon return.
-+ */
-+void av_packet_side_data_free(AVPacketSideData** sd, int* nb_sd);
-+
-+const char* av_packet_side_data_name(enum AVPacketSideDataType type);
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * @defgroup lavc_packet AVPacket
-+ *
-+ * Types and functions for working with AVPacket.
-+ * @{
-+ */
-+
-+/**
-+ * 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).
-+ *
-+ * 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().
-+ *
-+ * sizeof(AVPacket) being a part of the public ABI is deprecated. once
-+ * av_init_packet() is removed, new packets will only be able to be allocated
-+ * with av_packet_alloc(), and new fields may be added to the end of the struct
-+ * with a minor bump.
-+ *
-+ * @see av_packet_alloc
-+ * @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
-+
-+  /**
-+   * for some private data of the user
-+   */
-+  void* opaque;
-+
-+  /**
-+   * AVBufferRef for free use by the API user. FFmpeg will never check the
-+   * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when
-+   * the packet is unreferenced. av_packet_copy_props() calls create a new
-+   * reference with av_buffer_ref() for the target packet's opaque_ref field.
-+   *
-+   * This is unrelated to the opaque field, although it serves a similar
-+   * purpose.
-+   */
-+  AVBufferRef* opaque_ref;
-+
-+  /**
-+   * Time base of the packet's timestamps.
-+   * In the future, this field may be set on packets output by encoders or
-+   * demuxers, but its value will be by default ignored on input to decoders
-+   * or muxers.
-+   */
-+  AVRational time_base;
-+} AVPacket;
-+
-+#if FF_API_INIT_PACKET
-+attribute_deprecated typedef struct AVPacketList {
-+  AVPacket pkt;
-+  struct AVPacketList* next;
-+} AVPacketList;
-+#endif
-+
-+#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_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);
-+
-+#if FF_API_INIT_PACKET
-+/**
-+ * 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
-+ *
-+ * @see av_packet_alloc
-+ * @see av_packet_unref
-+ *
-+ * @deprecated This function is deprecated. Once it's removed,
-+               sizeof(AVPacket) will not be a part of the ABI anymore.
-+ */
-+attribute_deprecated void av_init_packet(AVPacket* pkt);
-+#endif
-+
-+/**
-+ * 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);
-+
-+/**
-+ * 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,
-+                                 size_t 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,
-+                               size_t size);
-+
-+/**
-+ * Get side information from packet.
-+ *
-+ * @param pkt packet
-+ * @param type desired side information type
-+ * @param size If supplied, *size will be set to the size of the side data
-+ *             or to zero if the desired side data is not present.
-+ * @return pointer to data if present or NULL otherwise
-+ */
-+uint8_t* av_packet_get_side_data(const AVPacket* pkt,
-+                                 enum AVPacketSideDataType type, size_t* size);
-+
-+/**
-+ * 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, size_t* 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, size_t 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/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/vdpau.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/vdpau.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/vdpau.h
-@@ -0,0 +1,168 @@
-+/*
-+ * The Video Decode and Presentation API for UNIX (VDPAU) is used for
-+ * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1.
-+ *
-+ * Copyright (C) 2008 NVIDIA
-+ *
-+ * 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_VDPAU_H
-+#define AVCODEC_VDPAU_H
-+
-+/**
-+ * @file
-+ * @ingroup lavc_codec_hwaccel_vdpau
-+ * Public libavcodec VDPAU header.
-+ */
-+
-+/**
-+ * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer
-+ * @ingroup lavc_codec_hwaccel
-+ *
-+ * VDPAU hardware acceleration has two modules
-+ * - VDPAU decoding
-+ * - VDPAU presentation
-+ *
-+ * The VDPAU decoding module parses all headers using FFmpeg
-+ * parsing mechanisms and uses VDPAU for the actual decoding.
-+ *
-+ * As per the current implementation, the actual decoding
-+ * and rendering (API calls) are done as part of the VDPAU
-+ * presentation (vo_vdpau.c) module.
-+ *
-+ * @{
-+ */
-+
-+#include <vdpau/vdpau.h>
-+
-+#include "libavutil/avconfig.h"
-+#include "libavutil/attributes.h"
-+
-+#include "avcodec.h"
-+
-+struct AVCodecContext;
-+struct AVFrame;
-+
-+typedef int (*AVVDPAU_Render2)(struct AVCodecContext*, struct AVFrame*,
-+                               const VdpPictureInfo*, uint32_t,
-+                               const VdpBitstreamBuffer*);
-+
-+/**
-+ * This structure is used to share data between the libavcodec library and
-+ * the client video application.
-+ * This structure will be allocated and stored in AVCodecContext.hwaccel_context
-+ * by av_vdpau_bind_context(). Members can be set by the user once
-+ * during initialization or through each AVCodecContext.get_buffer()
-+ * function call. In any case, they must be valid prior to calling
-+ * decoding functions.
-+ *
-+ * The size of this structure is not a part of the public ABI and must not
-+ * be used outside of libavcodec.
-+ */
-+typedef struct AVVDPAUContext {
-+  /**
-+   * VDPAU decoder handle
-+   *
-+   * Set by user.
-+   */
-+  VdpDecoder decoder;
-+
-+  /**
-+   * VDPAU decoder render callback
-+   *
-+   * Set by the user.
-+   */
-+  VdpDecoderRender* render;
-+
-+  AVVDPAU_Render2 render2;
-+} AVVDPAUContext;
-+
-+#if FF_API_VDPAU_ALLOC_GET_SET
-+/**
-+ * @brief allocation function for AVVDPAUContext
-+ *
-+ * Allows extending the struct without breaking API/ABI
-+ * @deprecated use av_vdpau_bind_context() instead
-+ */
-+attribute_deprecated AVVDPAUContext* av_alloc_vdpaucontext(void);
-+
-+/**
-+ * @deprecated render2 is public and can be accessed directly
-+ */
-+attribute_deprecated AVVDPAU_Render2
-+av_vdpau_hwaccel_get_render2(const AVVDPAUContext*);
-+/**
-+ * @deprecated render2 is public and can be accessed directly
-+ */
-+attribute_deprecated void av_vdpau_hwaccel_set_render2(AVVDPAUContext*,
-+                                                       AVVDPAU_Render2);
-+#endif
-+
-+/**
-+ * Associate a VDPAU device with a codec context for hardware acceleration.
-+ * This function is meant to be called from the get_format() codec callback,
-+ * or earlier. It can also be called after avcodec_flush_buffers() to change
-+ * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent
-+ * display preemption).
-+ *
-+ * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes
-+ * successfully.
-+ *
-+ * @param avctx decoding context whose get_format() callback is invoked
-+ * @param device VDPAU device handle to use for hardware acceleration
-+ * @param get_proc_address VDPAU device driver
-+ * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags
-+ *
-+ * @return 0 on success, an AVERROR code on failure.
-+ */
-+int av_vdpau_bind_context(AVCodecContext* avctx, VdpDevice device,
-+                          VdpGetProcAddress* get_proc_address, unsigned flags);
-+
-+/**
-+ * Gets the parameters to create an adequate VDPAU video surface for the codec
-+ * context using VDPAU hardware decoding acceleration.
-+ *
-+ * @note Behavior is undefined if the context was not successfully bound to a
-+ * VDPAU device using av_vdpau_bind_context().
-+ *
-+ * @param avctx the codec context being used for decoding the stream
-+ * @param type storage space for the VDPAU video surface chroma type
-+ *              (or NULL to ignore)
-+ * @param width storage space for the VDPAU video surface pixel width
-+ *              (or NULL to ignore)
-+ * @param height storage space for the VDPAU video surface pixel height
-+ *              (or NULL to ignore)
-+ *
-+ * @return 0 on success, a negative AVERROR code on failure.
-+ */
-+int av_vdpau_get_surface_parameters(AVCodecContext* avctx, VdpChromaType* type,
-+                                    uint32_t* width, uint32_t* height);
-+
-+#if FF_API_VDPAU_ALLOC_GET_SET
-+/**
-+ * Allocate an AVVDPAUContext.
-+ *
-+ * @return Newly-allocated AVVDPAUContext or NULL on failure.
-+ * @deprecated use av_vdpau_bind_context() instead
-+ */
-+attribute_deprecated AVVDPAUContext* av_vdpau_alloc_context(void);
-+#endif
-+
-+/** @} */
-+
-+#endif /* AVCODEC_VDPAU_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/version.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/version.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/version.h
-@@ -0,0 +1,45 @@
-+/*
-+ * 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_VERSION_H
-+#define AVCODEC_VERSION_H
-+
-+/**
-+ * @file
-+ * @ingroup libavc
-+ * Libavcodec version macros.
-+ */
-+
-+#include "libavutil/version.h"
-+
-+#include "version_major.h"
-+
-+#define LIBAVCODEC_VERSION_MINOR 5
-+#define LIBAVCODEC_VERSION_MICRO 101
-+
-+#define LIBAVCODEC_VERSION_INT                                       \
-+  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, LIBAVCODEC_VERSION_MINOR, \
-+                 LIBAVCODEC_VERSION_MICRO)
-+#define LIBAVCODEC_VERSION                                       \
-+  AV_VERSION(LIBAVCODEC_VERSION_MAJOR, LIBAVCODEC_VERSION_MINOR, \
-+             LIBAVCODEC_VERSION_MICRO)
-+#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
-+
-+#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
-+
-+#endif /* AVCODEC_VERSION_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/version_major.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/version_major.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavcodec/version_major.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 AVCODEC_VERSION_MAJOR_H
-+#define AVCODEC_VERSION_MAJOR_H
-+
-+/**
-+ * @file
-+ * @ingroup libavc
-+ * Libavcodec version macros.
-+ */
-+
-+#define LIBAVCODEC_VERSION_MAJOR 61
-+
-+/**
-+ * FF_API_* defines may be placed below to indicate public API that will be
-+ * dropped at a future version bump. The defines themselves are not part of
-+ * the public API and may change, break or disappear at any time.
-+ *
-+ * @note, when bumping the major version it is recommended to manually
-+ * disable each FF_API_* in its own commit instead of disabling them all
-+ * at once through the bump. This improves the git bisect-ability of the change.
-+ */
-+
-+#define FF_API_INIT_PACKET (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_SUBFRAMES (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_TICKS_PER_FRAME (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_DROPCHANGED (LIBAVCODEC_VERSION_MAJOR < 62)
-+
-+#define FF_API_AVFFT (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_FF_PROFILE_LEVEL (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_AVCODEC_CLOSE (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_BUFFER_MIN_SIZE (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_VDPAU_ALLOC_GET_SET (LIBAVCODEC_VERSION_MAJOR < 62)
-+#define FF_API_QUALITY_FACTOR (LIBAVCODEC_VERSION_MAJOR < 62)
-+
-+#endif /* AVCODEC_VERSION_MAJOR_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/attributes.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/attributes.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/attributes.h
-@@ -0,0 +1,173 @@
-+/*
-+ * copyright (c) 2006 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 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
-+ * Macro definitions for various function/variable attributes
-+ */
-+
-+#ifndef AVUTIL_ATTRIBUTES_H
-+#define AVUTIL_ATTRIBUTES_H
-+
-+#ifdef __GNUC__
-+#  define AV_GCC_VERSION_AT_LEAST(x, y) \
-+    (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y))
-+#  define AV_GCC_VERSION_AT_MOST(x, y) \
-+    (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y))
-+#else
-+#  define AV_GCC_VERSION_AT_LEAST(x, y) 0
-+#  define AV_GCC_VERSION_AT_MOST(x, y) 0
-+#endif
-+
-+#ifdef __has_builtin
-+#  define AV_HAS_BUILTIN(x) __has_builtin(x)
-+#else
-+#  define AV_HAS_BUILTIN(x) 0
-+#endif
-+
-+#ifndef av_always_inline
-+#  if AV_GCC_VERSION_AT_LEAST(3, 1)
-+#    define av_always_inline __attribute__((always_inline)) inline
-+#  elif defined(_MSC_VER)
-+#    define av_always_inline __forceinline
-+#  else
-+#    define av_always_inline inline
-+#  endif
-+#endif
-+
-+#ifndef av_extern_inline
-+#  if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__)
-+#    define av_extern_inline extern inline
-+#  else
-+#    define av_extern_inline inline
-+#  endif
-+#endif
-+
-+#if AV_GCC_VERSION_AT_LEAST(3, 4)
-+#  define av_warn_unused_result __attribute__((warn_unused_result))
-+#else
-+#  define av_warn_unused_result
-+#endif
-+
-+#if AV_GCC_VERSION_AT_LEAST(3, 1)
-+#  define av_noinline __attribute__((noinline))
-+#elif defined(_MSC_VER)
-+#  define av_noinline __declspec(noinline)
-+#else
-+#  define av_noinline
-+#endif
-+
-+#if AV_GCC_VERSION_AT_LEAST(3, 1) || defined(__clang__)
-+#  define av_pure __attribute__((pure))
-+#else
-+#  define av_pure
-+#endif
-+
-+#if AV_GCC_VERSION_AT_LEAST(2, 6) || defined(__clang__)
-+#  define av_const __attribute__((const))
-+#else
-+#  define av_const
-+#endif
-+
-+#if AV_GCC_VERSION_AT_LEAST(4, 3) || defined(__clang__)
-+#  define av_cold __attribute__((cold))
-+#else
-+#  define av_cold
-+#endif
-+
-+#if AV_GCC_VERSION_AT_LEAST(4, 1) && !defined(__llvm__)
-+#  define av_flatten __attribute__((flatten))
-+#else
-+#  define av_flatten
-+#endif
-+
-+#if AV_GCC_VERSION_AT_LEAST(3, 1)
-+#  define attribute_deprecated __attribute__((deprecated))
-+#elif defined(_MSC_VER)
-+#  define attribute_deprecated __declspec(deprecated)
-+#else
-+#  define attribute_deprecated
-+#endif
-+
-+/**
-+ * Disable warnings about deprecated features
-+ * This is useful for sections of code kept for backward compatibility and
-+ * scheduled for removal.
-+ */
-+#ifndef AV_NOWARN_DEPRECATED
-+#  if AV_GCC_VERSION_AT_LEAST(4, 6) || defined(__clang__)
-+#    define AV_NOWARN_DEPRECATED(code)                                    \
-+      _Pragma("GCC diagnostic push")                                      \
-+          _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") \
-+              code _Pragma("GCC diagnostic pop")
-+#  elif defined(_MSC_VER)
-+#    define AV_NOWARN_DEPRECATED(code)                                \
-+      __pragma(warning(push)) __pragma(warning(disable : 4996)) code; \
-+      __pragma(warning(pop))
-+#  else
-+#    define AV_NOWARN_DEPRECATED(code) code
-+#  endif
-+#endif
-+
-+#if defined(__GNUC__) || defined(__clang__)
-+#  define av_unused __attribute__((unused))
-+#else
-+#  define av_unused
-+#endif
-+
-+/**
-+ * Mark a variable as used and prevent the compiler from optimizing it
-+ * away.  This is useful for variables accessed only from inline
-+ * assembler without the compiler being aware.
-+ */
-+#if AV_GCC_VERSION_AT_LEAST(3, 1) || defined(__clang__)
-+#  define av_used __attribute__((used))
-+#else
-+#  define av_used
-+#endif
-+
-+#if AV_GCC_VERSION_AT_LEAST(3, 3) || defined(__clang__)
-+#  define av_alias __attribute__((may_alias))
-+#else
-+#  define av_alias
-+#endif
-+
-+#if (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER)
-+#  define av_uninit(x) x = x
-+#else
-+#  define av_uninit(x) x
-+#endif
-+
-+#if defined(__GNUC__) || defined(__clang__)
-+#  define av_builtin_constant_p __builtin_constant_p
-+#  define av_printf_format(fmtpos, attrpos) \
-+    __attribute__((__format__(__printf__, fmtpos, attrpos)))
-+#else
-+#  define av_builtin_constant_p(x) 0
-+#  define av_printf_format(fmtpos, attrpos)
-+#endif
-+
-+#if AV_GCC_VERSION_AT_LEAST(2, 5) || defined(__clang__)
-+#  define av_noreturn __attribute__((noreturn))
-+#else
-+#  define av_noreturn
-+#endif
-+
-+#endif /* AVUTIL_ATTRIBUTES_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/avconfig.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/avconfig.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/avconfig.h
-@@ -0,0 +1,6 @@
-+/* Generated by ffmpeg configure */
-+#ifndef AVUTIL_AVCONFIG_H
-+#define AVUTIL_AVCONFIG_H
-+#define AV_HAVE_BIGENDIAN 0
-+#define AV_HAVE_FAST_UNALIGNED 1
-+#endif /* AVUTIL_AVCONFIG_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/avutil.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/avutil.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/avutil.h
-@@ -0,0 +1,363 @@
-+/*
-+ * copyright (c) 2006 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 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_AVUTIL_H
-+#define AVUTIL_AVUTIL_H
-+
-+/**
-+ * @file
-+ * @ingroup lavu
-+ * Convenience header that includes @ref lavu "libavutil"'s core.
-+ */
-+
-+/**
-+ * @mainpage
-+ *
-+ * @section ffmpeg_intro Introduction
-+ *
-+ * This document describes the usage of the different libraries
-+ * provided by FFmpeg.
-+ *
-+ * @li @ref libavc "libavcodec" encoding/decoding library
-+ * @li @ref lavfi "libavfilter" graph-based frame editing library
-+ * @li @ref libavf "libavformat" I/O and muxing/demuxing library
-+ * @li @ref lavd "libavdevice" special devices muxing/demuxing library
-+ * @li @ref lavu "libavutil" common utility library
-+ * @li @ref lswr "libswresample" audio resampling, format conversion and mixing
-+ * @li @ref lpp  "libpostproc" post processing library
-+ * @li @ref libsws "libswscale" color conversion and scaling library
-+ *
-+ * @section ffmpeg_versioning Versioning and compatibility
-+ *
-+ * Each of the FFmpeg libraries contains a version.h header, which defines a
-+ * major, minor and micro version number with the
-+ * <em>LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO}</em> macros. The major version
-+ * number is incremented with backward incompatible changes - e.g. removing
-+ * parts of the public API, reordering public struct members, etc. The minor
-+ * version number is incremented for backward compatible API changes or major
-+ * new features - e.g. adding a new public function or a new decoder. The micro
-+ * version number is incremented for smaller changes that a calling program
-+ * might still want to check for - e.g. changing behavior in a previously
-+ * unspecified situation.
-+ *
-+ * FFmpeg guarantees backward API and ABI compatibility for each library as long
-+ * as its major version number is unchanged. This means that no public symbols
-+ * will be removed or renamed. Types and names of the public struct members and
-+ * values of public macros and enums will remain the same (unless they were
-+ * explicitly declared as not part of the public API). Documented behavior will
-+ * not change.
-+ *
-+ * In other words, any correct program that works with a given FFmpeg snapshot
-+ * should work just as well without any changes with any later snapshot with the
-+ * same major versions. This applies to both rebuilding the program against new
-+ * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program
-+ * links against.
-+ *
-+ * However, new public symbols may be added and new members may be appended to
-+ * public structs whose size is not part of public ABI (most public structs in
-+ * FFmpeg). New macros and enum values may be added. Behavior in undocumented
-+ * situations may change slightly (and be documented). All those are accompanied
-+ * by an entry in doc/APIchanges and incrementing either the minor or micro
-+ * version number.
-+ */
-+
-+/**
-+ * @defgroup lavu libavutil
-+ * Common code shared across all FFmpeg libraries.
-+ *
-+ * @note
-+ * libavutil is designed to be modular. In most cases, in order to use the
-+ * functions provided by one component of libavutil you must explicitly include
-+ * the specific header containing that feature. If you are only using
-+ * media-related components, you could simply include libavutil/avutil.h, which
-+ * brings in most of the "core" components.
-+ *
-+ * @{
-+ *
-+ * @defgroup lavu_crypto Crypto and Hashing
-+ *
-+ * @{
-+ * @}
-+ *
-+ * @defgroup lavu_math Mathematics
-+ * @{
-+ *
-+ * @}
-+ *
-+ * @defgroup lavu_string String Manipulation
-+ *
-+ * @{
-+ *
-+ * @}
-+ *
-+ * @defgroup lavu_mem Memory Management
-+ *
-+ * @{
-+ *
-+ * @}
-+ *
-+ * @defgroup lavu_data Data Structures
-+ * @{
-+ *
-+ * @}
-+ *
-+ * @defgroup lavu_video Video related
-+ *
-+ * @{
-+ *
-+ * @}
-+ *
-+ * @defgroup lavu_audio Audio related
-+ *
-+ * @{
-+ *
-+ * @}
-+ *
-+ * @defgroup lavu_error Error Codes
-+ *
-+ * @{
-+ *
-+ * @}
-+ *
-+ * @defgroup lavu_log Logging Facility
-+ *
-+ * @{
-+ *
-+ * @}
-+ *
-+ * @defgroup lavu_misc Other
-+ *
-+ * @{
-+ *
-+ * @defgroup preproc_misc Preprocessor String Macros
-+ *
-+ * @{
-+ *
-+ * @}
-+ *
-+ * @defgroup version_utils Library Version Macros
-+ *
-+ * @{
-+ *
-+ * @}
-+ */
-+
-+/**
-+ * @addtogroup lavu_ver
-+ * @{
-+ */
-+
-+/**
-+ * Return the LIBAVUTIL_VERSION_INT constant.
-+ */
-+unsigned avutil_version(void);
-+
-+/**
-+ * Return an informative version string. This usually is the actual release
-+ * version number or a git commit description. This string has no fixed format
-+ * and can change any time. It should never be parsed by code.
-+ */
-+const char* av_version_info(void);
-+
-+/**
-+ * Return the libavutil build-time configuration.
-+ */
-+const char* avutil_configuration(void);
-+
-+/**
-+ * Return the libavutil license.
-+ */
-+const char* avutil_license(void);
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * @addtogroup lavu_media Media Type
-+ * @brief Media Type
-+ */
-+
-+enum AVMediaType {
-+  AVMEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATA
-+  AVMEDIA_TYPE_VIDEO,
-+  AVMEDIA_TYPE_AUDIO,
-+  AVMEDIA_TYPE_DATA,  ///< Opaque data information usually continuous
-+  AVMEDIA_TYPE_SUBTITLE,
-+  AVMEDIA_TYPE_ATTACHMENT,  ///< Opaque data information usually sparse
-+  AVMEDIA_TYPE_NB
-+};
-+
-+/**
-+ * Return a string describing the media_type enum, NULL if media_type
-+ * is unknown.
-+ */
-+const char* av_get_media_type_string(enum AVMediaType media_type);
-+
-+/**
-+ * @defgroup lavu_const Constants
-+ * @{
-+ *
-+ * @defgroup lavu_enc Encoding specific
-+ *
-+ * @note those definition should move to avcodec
-+ * @{
-+ */
-+
-+#define FF_LAMBDA_SHIFT 7
-+#define FF_LAMBDA_SCALE (1 << FF_LAMBDA_SHIFT)
-+#define FF_QP2LAMBDA 118  ///< factor to convert from H.263 QP to lambda
-+#define FF_LAMBDA_MAX (256 * 128 - 1)
-+
-+#define FF_QUALITY_SCALE FF_LAMBDA_SCALE  // FIXME maybe remove
-+
-+/**
-+ * @}
-+ * @defgroup lavu_time Timestamp specific
-+ *
-+ * FFmpeg internal timebase and timestamp definitions
-+ *
-+ * @{
-+ */
-+
-+/**
-+ * @brief Undefined timestamp value
-+ *
-+ * Usually reported by demuxer that work on containers that do not provide
-+ * either pts or dts.
-+ */
-+
-+#define AV_NOPTS_VALUE ((int64_t)UINT64_C(0x8000000000000000))
-+
-+/**
-+ * Internal time base represented as integer
-+ */
-+
-+#define AV_TIME_BASE 1000000
-+
-+/**
-+ * Internal time base represented as fractional value
-+ */
-+
-+#ifdef __cplusplus
-+/* ISO C++ forbids compound-literals. */
-+#  define AV_TIME_BASE_Q av_make_q(1, AV_TIME_BASE)
-+#else
-+#  define AV_TIME_BASE_Q \
-+    (AVRational) { 1, AV_TIME_BASE }
-+#endif
-+
-+/**
-+ * @}
-+ * @}
-+ * @defgroup lavu_picture Image related
-+ *
-+ * AVPicture types, pixel formats and basic image planes manipulation.
-+ *
-+ * @{
-+ */
-+
-+enum AVPictureType {
-+  AV_PICTURE_TYPE_NONE = 0,  ///< Undefined
-+  AV_PICTURE_TYPE_I,         ///< Intra
-+  AV_PICTURE_TYPE_P,         ///< Predicted
-+  AV_PICTURE_TYPE_B,         ///< Bi-dir predicted
-+  AV_PICTURE_TYPE_S,         ///< S(GMC)-VOP MPEG-4
-+  AV_PICTURE_TYPE_SI,        ///< Switching Intra
-+  AV_PICTURE_TYPE_SP,        ///< Switching Predicted
-+  AV_PICTURE_TYPE_BI,        ///< BI type
-+};
-+
-+/**
-+ * Return a single letter to describe the given picture type
-+ * pict_type.
-+ *
-+ * @param[in] pict_type the picture type @return a single character
-+ * representing the picture type, '?' if pict_type is unknown
-+ */
-+char av_get_picture_type_char(enum AVPictureType pict_type);
-+
-+/**
-+ * @}
-+ */
-+
-+#include "common.h"
-+#include "rational.h"
-+#include "version.h"
-+#include "macros.h"
-+#include "mathematics.h"
-+#include "log.h"
-+#include "pixfmt.h"
-+
-+/**
-+ * Return x default pointer in case p is NULL.
-+ */
-+static inline void* av_x_if_null(const void* p, const void* x) {
-+  return (void*)(intptr_t)(p ? p : x);
-+}
-+
-+/**
-+ * Compute the length of an integer list.
-+ *
-+ * @param elsize  size in bytes of each list element (only 1, 2, 4 or 8)
-+ * @param term    list terminator (usually 0 or -1)
-+ * @param list    pointer to the list
-+ * @return  length of the list, in elements, not counting the terminator
-+ */
-+unsigned av_int_list_length_for_size(unsigned elsize, const void* list,
-+                                     uint64_t term) av_pure;
-+
-+/**
-+ * Compute the length of an integer list.
-+ *
-+ * @param term  list terminator (usually 0 or -1)
-+ * @param list  pointer to the list
-+ * @return  length of the list, in elements, not counting the terminator
-+ */
-+#define av_int_list_length(list, term) \
-+  av_int_list_length_for_size(sizeof(*(list)), list, term)
-+
-+/**
-+ * Return the fractional representation of the internal time base.
-+ */
-+AVRational av_get_time_base_q(void);
-+
-+#define AV_FOURCC_MAX_STRING_SIZE 32
-+
-+#define av_fourcc2str(fourcc) \
-+  av_fourcc_make_string((char[AV_FOURCC_MAX_STRING_SIZE]){0}, fourcc)
-+
-+/**
-+ * Fill the provided buffer with a string containing a FourCC (four-character
-+ * code) representation.
-+ *
-+ * @param buf    a buffer with size in bytes of at least
-+ * AV_FOURCC_MAX_STRING_SIZE
-+ * @param fourcc the fourcc to represent
-+ * @return the buffer in input
-+ */
-+char* av_fourcc_make_string(char* buf, uint32_t fourcc);
-+
-+/**
-+ * @}
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_AVUTIL_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/buffer.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/buffer.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/buffer.h
-@@ -0,0 +1,324 @@
-+/*
-+ * 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
-+ * @ingroup lavu_buffer
-+ * refcounted data buffer API
-+ */
-+
-+#ifndef AVUTIL_BUFFER_H
-+#define AVUTIL_BUFFER_H
-+
-+#include <stddef.h>
-+#include <stdint.h>
-+
-+/**
-+ * @defgroup lavu_buffer AVBuffer
-+ * @ingroup lavu_data
-+ *
-+ * @{
-+ * AVBuffer is an API for reference-counted data buffers.
-+ *
-+ * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer
-+ * represents the data buffer itself; it is opaque and not meant to be accessed
-+ * by the caller directly, but only through AVBufferRef. However, the caller may
-+ * e.g. compare two AVBuffer pointers to check whether two different references
-+ * are describing the same data buffer. AVBufferRef represents a single
-+ * reference to an AVBuffer and it is the object that may be manipulated by the
-+ * caller directly.
-+ *
-+ * There are two functions provided for creating a new AVBuffer with a single
-+ * reference -- av_buffer_alloc() to just allocate a new buffer, and
-+ * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing
-+ * reference, additional references may be created with av_buffer_ref().
-+ * Use av_buffer_unref() to free a reference (this will automatically free the
-+ * data once all the references are freed).
-+ *
-+ * The convention throughout this API and the rest of FFmpeg is such that the
-+ * buffer is considered writable if there exists only one reference to it (and
-+ * it has not been marked as read-only). The av_buffer_is_writable() function is
-+ * provided to check whether this is true and av_buffer_make_writable() will
-+ * automatically create a new writable buffer when necessary.
-+ * Of course nothing prevents the calling code from violating this convention,
-+ * however that is safe only when all the existing references are under its
-+ * control.
-+ *
-+ * @note Referencing and unreferencing the buffers is thread-safe and thus
-+ * may be done from multiple threads simultaneously without any need for
-+ * additional locking.
-+ *
-+ * @note Two different references to the same buffer can point to different
-+ * parts of the buffer (i.e. their AVBufferRef.data will not be equal).
-+ */
-+
-+/**
-+ * A reference counted buffer type. It is opaque and is meant to be used through
-+ * references (AVBufferRef).
-+ */
-+typedef struct AVBuffer AVBuffer;
-+
-+/**
-+ * A reference to a data buffer.
-+ *
-+ * The size of this struct is not a part of the public ABI and it is not meant
-+ * to be allocated directly.
-+ */
-+typedef struct AVBufferRef {
-+  AVBuffer* buffer;
-+
-+  /**
-+   * The data buffer. It is considered writable if and only if
-+   * this is the only reference to the buffer, in which case
-+   * av_buffer_is_writable() returns 1.
-+   */
-+  uint8_t* data;
-+  /**
-+   * Size of data in bytes.
-+   */
-+  size_t size;
-+} AVBufferRef;
-+
-+/**
-+ * Allocate an AVBuffer of the given size using av_malloc().
-+ *
-+ * @return an AVBufferRef of given size or NULL when out of memory
-+ */
-+AVBufferRef* av_buffer_alloc(size_t size);
-+
-+/**
-+ * Same as av_buffer_alloc(), except the returned buffer will be initialized
-+ * to zero.
-+ */
-+AVBufferRef* av_buffer_allocz(size_t size);
-+
-+/**
-+ * Always treat the buffer as read-only, even when it has only one
-+ * reference.
-+ */
-+#define AV_BUFFER_FLAG_READONLY (1 << 0)
-+
-+/**
-+ * Create an AVBuffer from an existing array.
-+ *
-+ * If this function is successful, data is owned by the AVBuffer. The caller may
-+ * only access data through the returned AVBufferRef and references derived from
-+ * it.
-+ * If this function fails, data is left untouched.
-+ * @param data   data array
-+ * @param size   size of data in bytes
-+ * @param free   a callback for freeing this buffer's data
-+ * @param opaque parameter to be got for processing or passed to free
-+ * @param flags  a combination of AV_BUFFER_FLAG_*
-+ *
-+ * @return an AVBufferRef referring to data on success, NULL on failure.
-+ */
-+AVBufferRef* av_buffer_create(uint8_t* data, size_t size,
-+                              void (*free)(void* opaque, uint8_t* data),
-+                              void* opaque, int flags);
-+
-+/**
-+ * Default free callback, which calls av_free() on the buffer data.
-+ * This function is meant to be passed to av_buffer_create(), not called
-+ * directly.
-+ */
-+void av_buffer_default_free(void* opaque, uint8_t* data);
-+
-+/**
-+ * Create a new reference to an AVBuffer.
-+ *
-+ * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on
-+ * failure.
-+ */
-+AVBufferRef* av_buffer_ref(const AVBufferRef* buf);
-+
-+/**
-+ * Free a given reference and automatically free the buffer if there are no more
-+ * references to it.
-+ *
-+ * @param buf the reference to be freed. The pointer is set to NULL on return.
-+ */
-+void av_buffer_unref(AVBufferRef** buf);
-+
-+/**
-+ * @return 1 if the caller may write to the data referred to by buf (which is
-+ * true if and only if buf is the only reference to the underlying AVBuffer).
-+ * Return 0 otherwise.
-+ * A positive answer is valid until av_buffer_ref() is called on buf.
-+ */
-+int av_buffer_is_writable(const AVBufferRef* buf);
-+
-+/**
-+ * @return the opaque parameter set by av_buffer_create.
-+ */
-+void* av_buffer_get_opaque(const AVBufferRef* buf);
-+
-+int av_buffer_get_ref_count(const AVBufferRef* buf);
-+
-+/**
-+ * Create a writable reference from a given buffer reference, avoiding data copy
-+ * if possible.
-+ *
-+ * @param buf buffer reference to make writable. On success, buf is either left
-+ *            untouched, or it is unreferenced and a new writable AVBufferRef is
-+ *            written in its place. On failure, buf is left untouched.
-+ * @return 0 on success, a negative AVERROR on failure.
-+ */
-+int av_buffer_make_writable(AVBufferRef** buf);
-+
-+/**
-+ * Reallocate a given buffer.
-+ *
-+ * @param buf  a buffer reference to reallocate. On success, buf will be
-+ *             unreferenced and a new reference with the required size will be
-+ *             written in its place. On failure buf will be left untouched. *buf
-+ *             may be NULL, then a new buffer is allocated.
-+ * @param size required new buffer size.
-+ * @return 0 on success, a negative AVERROR on failure.
-+ *
-+ * @note the buffer is actually reallocated with av_realloc() only if it was
-+ * initially allocated through av_buffer_realloc(NULL) and there is only one
-+ * reference to it (i.e. the one passed to this function). In all other cases
-+ * a new buffer is allocated and the data is copied.
-+ */
-+int av_buffer_realloc(AVBufferRef** buf, size_t size);
-+
-+/**
-+ * Ensure dst refers to the same data as src.
-+ *
-+ * When *dst is already equivalent to src, do nothing. Otherwise unreference dst
-+ * and replace it with a new reference to src.
-+ *
-+ * @param dst Pointer to either a valid buffer reference or NULL. On success,
-+ *            this will point to a buffer reference equivalent to src. On
-+ *            failure, dst will be left untouched.
-+ * @param src A buffer reference to replace dst with. May be NULL, then this
-+ *            function is equivalent to av_buffer_unref(dst).
-+ * @return 0 on success
-+ *         AVERROR(ENOMEM) on memory allocation failure.
-+ */
-+int av_buffer_replace(AVBufferRef** dst, const AVBufferRef* src);
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * @defgroup lavu_bufferpool AVBufferPool
-+ * @ingroup lavu_data
-+ *
-+ * @{
-+ * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers.
-+ *
-+ * Frequently allocating and freeing large buffers may be slow. AVBufferPool is
-+ * meant to solve this in cases when the caller needs a set of buffers of the
-+ * same size (the most obvious use case being buffers for raw video or audio
-+ * frames).
-+ *
-+ * At the beginning, the user must call av_buffer_pool_init() to create the
-+ * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to
-+ * get a reference to a new buffer, similar to av_buffer_alloc(). This new
-+ * reference works in all aspects the same way as the one created by
-+ * av_buffer_alloc(). However, when the last reference to this buffer is
-+ * unreferenced, it is returned to the pool instead of being freed and will be
-+ * reused for subsequent av_buffer_pool_get() calls.
-+ *
-+ * When the caller is done with the pool and no longer needs to allocate any new
-+ * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable.
-+ * Once all the buffers are released, it will automatically be freed.
-+ *
-+ * Allocating and releasing buffers with this API is thread-safe as long as
-+ * either the default alloc callback is used, or the user-supplied one is
-+ * thread-safe.
-+ */
-+
-+/**
-+ * The buffer pool. This structure is opaque and not meant to be accessed
-+ * directly. It is allocated with av_buffer_pool_init() and freed with
-+ * av_buffer_pool_uninit().
-+ */
-+typedef struct AVBufferPool AVBufferPool;
-+
-+/**
-+ * Allocate and initialize a buffer pool.
-+ *
-+ * @param size size of each buffer in this pool
-+ * @param alloc a function that will be used to allocate new buffers when the
-+ * pool is empty. May be NULL, then the default allocator will be used
-+ * (av_buffer_alloc()).
-+ * @return newly created buffer pool on success, NULL on error.
-+ */
-+AVBufferPool* av_buffer_pool_init(size_t size,
-+                                  AVBufferRef* (*alloc)(size_t size));
-+
-+/**
-+ * Allocate and initialize a buffer pool with a more complex allocator.
-+ *
-+ * @param size size of each buffer in this pool
-+ * @param opaque arbitrary user data used by the allocator
-+ * @param alloc a function that will be used to allocate new buffers when the
-+ *              pool is empty. May be NULL, then the default allocator will be
-+ *              used (av_buffer_alloc()).
-+ * @param pool_free a function that will be called immediately before the pool
-+ *                  is freed. I.e. after av_buffer_pool_uninit() is called
-+ *                  by the caller and all the frames are returned to the pool
-+ *                  and freed. It is intended to uninitialize the user opaque
-+ *                  data. May be NULL.
-+ * @return newly created buffer pool on success, NULL on error.
-+ */
-+AVBufferPool* av_buffer_pool_init2(size_t size, void* opaque,
-+                                   AVBufferRef* (*alloc)(void* opaque,
-+                                                         size_t size),
-+                                   void (*pool_free)(void* opaque));
-+
-+/**
-+ * Mark the pool as being available for freeing. It will actually be freed only
-+ * once all the allocated buffers associated with the pool are released. Thus it
-+ * is safe to call this function while some of the allocated buffers are still
-+ * in use.
-+ *
-+ * @param pool pointer to the pool to be freed. It will be set to NULL.
-+ */
-+void av_buffer_pool_uninit(AVBufferPool** pool);
-+
-+/**
-+ * Allocate a new AVBuffer, reusing an old buffer from the pool when available.
-+ * This function may be called simultaneously from multiple threads.
-+ *
-+ * @return a reference to the new buffer on success, NULL on error.
-+ */
-+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(const AVBufferRef* ref);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_BUFFER_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/channel_layout.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/channel_layout.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/channel_layout.h
-@@ -0,0 +1,804 @@
-+/*
-+ * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
-+ * Copyright (c) 2008 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
-+ */
-+
-+#ifndef AVUTIL_CHANNEL_LAYOUT_H
-+#define AVUTIL_CHANNEL_LAYOUT_H
-+
-+#include <stdint.h>
-+#include <stdlib.h>
-+
-+#include "version.h"
-+#include "attributes.h"
-+
-+/**
-+ * @file
-+ * @ingroup lavu_audio_channels
-+ * Public libavutil channel layout APIs header.
-+ */
-+
-+/**
-+ * @defgroup lavu_audio_channels Audio channels
-+ * @ingroup lavu_audio
-+ *
-+ * Audio channel layout utility functions
-+ *
-+ * @{
-+ */
-+
-+enum AVChannel {
-+  ///< Invalid channel index
-+  AV_CHAN_NONE = -1,
-+  AV_CHAN_FRONT_LEFT,
-+  AV_CHAN_FRONT_RIGHT,
-+  AV_CHAN_FRONT_CENTER,
-+  AV_CHAN_LOW_FREQUENCY,
-+  AV_CHAN_BACK_LEFT,
-+  AV_CHAN_BACK_RIGHT,
-+  AV_CHAN_FRONT_LEFT_OF_CENTER,
-+  AV_CHAN_FRONT_RIGHT_OF_CENTER,
-+  AV_CHAN_BACK_CENTER,
-+  AV_CHAN_SIDE_LEFT,
-+  AV_CHAN_SIDE_RIGHT,
-+  AV_CHAN_TOP_CENTER,
-+  AV_CHAN_TOP_FRONT_LEFT,
-+  AV_CHAN_TOP_FRONT_CENTER,
-+  AV_CHAN_TOP_FRONT_RIGHT,
-+  AV_CHAN_TOP_BACK_LEFT,
-+  AV_CHAN_TOP_BACK_CENTER,
-+  AV_CHAN_TOP_BACK_RIGHT,
-+  /** Stereo downmix. */
-+  AV_CHAN_STEREO_LEFT = 29,
-+  /** See above. */
-+  AV_CHAN_STEREO_RIGHT,
-+  AV_CHAN_WIDE_LEFT,
-+  AV_CHAN_WIDE_RIGHT,
-+  AV_CHAN_SURROUND_DIRECT_LEFT,
-+  AV_CHAN_SURROUND_DIRECT_RIGHT,
-+  AV_CHAN_LOW_FREQUENCY_2,
-+  AV_CHAN_TOP_SIDE_LEFT,
-+  AV_CHAN_TOP_SIDE_RIGHT,
-+  AV_CHAN_BOTTOM_FRONT_CENTER,
-+  AV_CHAN_BOTTOM_FRONT_LEFT,
-+  AV_CHAN_BOTTOM_FRONT_RIGHT,
-+
-+  /** Channel is empty can be safely skipped. */
-+  AV_CHAN_UNUSED = 0x200,
-+
-+  /** Channel contains data, but its position is unknown. */
-+  AV_CHAN_UNKNOWN = 0x300,
-+
-+  /**
-+   * Range of channels between AV_CHAN_AMBISONIC_BASE and
-+   * AV_CHAN_AMBISONIC_END represent Ambisonic components using the ACN system.
-+   *
-+   * Given a channel id `<i>` between AV_CHAN_AMBISONIC_BASE and
-+   * AV_CHAN_AMBISONIC_END (inclusive), the ACN index of the channel `<n>` is
-+   * `<n> = <i> - AV_CHAN_AMBISONIC_BASE`.
-+   *
-+   * @note these values are only used for AV_CHANNEL_ORDER_CUSTOM channel
-+   * orderings, the AV_CHANNEL_ORDER_AMBISONIC ordering orders the channels
-+   * implicitly by their position in the stream.
-+   */
-+  AV_CHAN_AMBISONIC_BASE = 0x400,
-+  // leave space for 1024 ids, which correspond to maximum order-32 harmonics,
-+  // which should be enough for the foreseeable use cases
-+  AV_CHAN_AMBISONIC_END = 0x7ff,
-+};
-+
-+enum AVChannelOrder {
-+  /**
-+   * Only the channel count is specified, without any further information
-+   * about the channel order.
-+   */
-+  AV_CHANNEL_ORDER_UNSPEC,
-+  /**
-+   * The native channel order, i.e. the channels are in the same order in
-+   * which they are defined in the AVChannel enum. This supports up to 63
-+   * different channels.
-+   */
-+  AV_CHANNEL_ORDER_NATIVE,
-+  /**
-+   * The channel order does not correspond to any other predefined order and
-+   * is stored as an explicit map. For example, this could be used to support
-+   * layouts with 64 or more channels, or with empty/skipped (AV_CHAN_UNUSED)
-+   * channels at arbitrary positions.
-+   */
-+  AV_CHANNEL_ORDER_CUSTOM,
-+  /**
-+   * The audio is represented as the decomposition of the sound field into
-+   * spherical harmonics. Each channel corresponds to a single expansion
-+   * component. Channels are ordered according to ACN (Ambisonic Channel
-+   * Number).
-+   *
-+   * The channel with the index n in the stream contains the spherical
-+   * harmonic of degree l and order m given by
-+   * @code{.unparsed}
-+   *   l   = floor(sqrt(n)),
-+   *   m   = n - l * (l + 1).
-+   * @endcode
-+   *
-+   * Conversely given a spherical harmonic of degree l and order m, the
-+   * corresponding channel index n is given by
-+   * @code{.unparsed}
-+   *   n = l * (l + 1) + m.
-+   * @endcode
-+   *
-+   * Normalization is assumed to be SN3D (Schmidt Semi-Normalization)
-+   * as defined in AmbiX format $ 2.1.
-+   */
-+  AV_CHANNEL_ORDER_AMBISONIC,
-+  /**
-+   * Number of channel orders, not part of ABI/API
-+   */
-+  FF_CHANNEL_ORDER_NB
-+};
-+
-+/**
-+ * @defgroup channel_masks Audio channel masks
-+ *
-+ * A channel layout is a 64-bits integer with a bit set for every channel.
-+ * The number of bits set must be equal to the number of channels.
-+ * The value 0 means that the channel layout is not known.
-+ * @note this data structure is not powerful enough to handle channels
-+ * combinations that have the same channel multiple times, such as
-+ * dual-mono.
-+ *
-+ * @{
-+ */
-+#define AV_CH_FRONT_LEFT (1ULL << AV_CHAN_FRONT_LEFT)
-+#define AV_CH_FRONT_RIGHT (1ULL << AV_CHAN_FRONT_RIGHT)
-+#define AV_CH_FRONT_CENTER (1ULL << AV_CHAN_FRONT_CENTER)
-+#define AV_CH_LOW_FREQUENCY (1ULL << AV_CHAN_LOW_FREQUENCY)
-+#define AV_CH_BACK_LEFT (1ULL << AV_CHAN_BACK_LEFT)
-+#define AV_CH_BACK_RIGHT (1ULL << AV_CHAN_BACK_RIGHT)
-+#define AV_CH_FRONT_LEFT_OF_CENTER (1ULL << AV_CHAN_FRONT_LEFT_OF_CENTER)
-+#define AV_CH_FRONT_RIGHT_OF_CENTER (1ULL << AV_CHAN_FRONT_RIGHT_OF_CENTER)
-+#define AV_CH_BACK_CENTER (1ULL << AV_CHAN_BACK_CENTER)
-+#define AV_CH_SIDE_LEFT (1ULL << AV_CHAN_SIDE_LEFT)
-+#define AV_CH_SIDE_RIGHT (1ULL << AV_CHAN_SIDE_RIGHT)
-+#define AV_CH_TOP_CENTER (1ULL << AV_CHAN_TOP_CENTER)
-+#define AV_CH_TOP_FRONT_LEFT (1ULL << AV_CHAN_TOP_FRONT_LEFT)
-+#define AV_CH_TOP_FRONT_CENTER (1ULL << AV_CHAN_TOP_FRONT_CENTER)
-+#define AV_CH_TOP_FRONT_RIGHT (1ULL << AV_CHAN_TOP_FRONT_RIGHT)
-+#define AV_CH_TOP_BACK_LEFT (1ULL << AV_CHAN_TOP_BACK_LEFT)
-+#define AV_CH_TOP_BACK_CENTER (1ULL << AV_CHAN_TOP_BACK_CENTER)
-+#define AV_CH_TOP_BACK_RIGHT (1ULL << AV_CHAN_TOP_BACK_RIGHT)
-+#define AV_CH_STEREO_LEFT (1ULL << AV_CHAN_STEREO_LEFT)
-+#define AV_CH_STEREO_RIGHT (1ULL << AV_CHAN_STEREO_RIGHT)
-+#define AV_CH_WIDE_LEFT (1ULL << AV_CHAN_WIDE_LEFT)
-+#define AV_CH_WIDE_RIGHT (1ULL << AV_CHAN_WIDE_RIGHT)
-+#define AV_CH_SURROUND_DIRECT_LEFT (1ULL << AV_CHAN_SURROUND_DIRECT_LEFT)
-+#define AV_CH_SURROUND_DIRECT_RIGHT (1ULL << AV_CHAN_SURROUND_DIRECT_RIGHT)
-+#define AV_CH_LOW_FREQUENCY_2 (1ULL << AV_CHAN_LOW_FREQUENCY_2)
-+#define AV_CH_TOP_SIDE_LEFT (1ULL << AV_CHAN_TOP_SIDE_LEFT)
-+#define AV_CH_TOP_SIDE_RIGHT (1ULL << AV_CHAN_TOP_SIDE_RIGHT)
-+#define AV_CH_BOTTOM_FRONT_CENTER (1ULL << AV_CHAN_BOTTOM_FRONT_CENTER)
-+#define AV_CH_BOTTOM_FRONT_LEFT (1ULL << AV_CHAN_BOTTOM_FRONT_LEFT)
-+#define AV_CH_BOTTOM_FRONT_RIGHT (1ULL << AV_CHAN_BOTTOM_FRONT_RIGHT)
-+
-+/**
-+ * @}
-+ * @defgroup channel_mask_c Audio channel layouts
-+ * @{
-+ * */
-+#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER)
-+#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT | AV_CH_FRONT_RIGHT)
-+#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO | AV_CH_LOW_FREQUENCY)
-+#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO | AV_CH_BACK_CENTER)
-+#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO | AV_CH_FRONT_CENTER)
-+#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND | AV_CH_LOW_FREQUENCY)
-+#define AV_CH_LAYOUT_4POINT0 (AV_CH_LAYOUT_SURROUND | AV_CH_BACK_CENTER)
-+#define AV_CH_LAYOUT_4POINT1 (AV_CH_LAYOUT_4POINT0 | AV_CH_LOW_FREQUENCY)
-+#define AV_CH_LAYOUT_2_2 \
-+  (AV_CH_LAYOUT_STEREO | AV_CH_SIDE_LEFT | AV_CH_SIDE_RIGHT)
-+#define AV_CH_LAYOUT_QUAD \
-+  (AV_CH_LAYOUT_STEREO | AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)
-+#define AV_CH_LAYOUT_5POINT0 \
-+  (AV_CH_LAYOUT_SURROUND | AV_CH_SIDE_LEFT | AV_CH_SIDE_RIGHT)
-+#define AV_CH_LAYOUT_5POINT1 (AV_CH_LAYOUT_5POINT0 | AV_CH_LOW_FREQUENCY)
-+#define AV_CH_LAYOUT_5POINT0_BACK \
-+  (AV_CH_LAYOUT_SURROUND | AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)
-+#define AV_CH_LAYOUT_5POINT1_BACK \
-+  (AV_CH_LAYOUT_5POINT0_BACK | AV_CH_LOW_FREQUENCY)
-+#define AV_CH_LAYOUT_6POINT0 (AV_CH_LAYOUT_5POINT0 | AV_CH_BACK_CENTER)
-+#define AV_CH_LAYOUT_6POINT0_FRONT \
-+  (AV_CH_LAYOUT_2_2 | AV_CH_FRONT_LEFT_OF_CENTER | AV_CH_FRONT_RIGHT_OF_CENTER)
-+#define AV_CH_LAYOUT_HEXAGONAL (AV_CH_LAYOUT_5POINT0_BACK | AV_CH_BACK_CENTER)
-+#define AV_CH_LAYOUT_3POINT1POINT2 \
-+  (AV_CH_LAYOUT_3POINT1 | AV_CH_TOP_FRONT_LEFT | AV_CH_TOP_FRONT_RIGHT)
-+#define AV_CH_LAYOUT_6POINT1 (AV_CH_LAYOUT_5POINT1 | AV_CH_BACK_CENTER)
-+#define AV_CH_LAYOUT_6POINT1_BACK \
-+  (AV_CH_LAYOUT_5POINT1_BACK | AV_CH_BACK_CENTER)
-+#define AV_CH_LAYOUT_6POINT1_FRONT \
-+  (AV_CH_LAYOUT_6POINT0_FRONT | AV_CH_LOW_FREQUENCY)
-+#define AV_CH_LAYOUT_7POINT0 \
-+  (AV_CH_LAYOUT_5POINT0 | AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)
-+#define AV_CH_LAYOUT_7POINT0_FRONT                     \
-+  (AV_CH_LAYOUT_5POINT0 | AV_CH_FRONT_LEFT_OF_CENTER | \
-+   AV_CH_FRONT_RIGHT_OF_CENTER)
-+#define AV_CH_LAYOUT_7POINT1 \
-+  (AV_CH_LAYOUT_5POINT1 | AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)
-+#define AV_CH_LAYOUT_7POINT1_WIDE                      \
-+  (AV_CH_LAYOUT_5POINT1 | AV_CH_FRONT_LEFT_OF_CENTER | \
-+   AV_CH_FRONT_RIGHT_OF_CENTER)
-+#define AV_CH_LAYOUT_7POINT1_WIDE_BACK                      \
-+  (AV_CH_LAYOUT_5POINT1_BACK | AV_CH_FRONT_LEFT_OF_CENTER | \
-+   AV_CH_FRONT_RIGHT_OF_CENTER)
-+#define AV_CH_LAYOUT_5POINT1POINT2_BACK \
-+  (AV_CH_LAYOUT_5POINT1_BACK | AV_CH_TOP_FRONT_LEFT | AV_CH_TOP_FRONT_RIGHT)
-+#define AV_CH_LAYOUT_OCTAGONAL                                  \
-+  (AV_CH_LAYOUT_5POINT0 | AV_CH_BACK_LEFT | AV_CH_BACK_CENTER | \
-+   AV_CH_BACK_RIGHT)
-+#define AV_CH_LAYOUT_CUBE                                             \
-+  (AV_CH_LAYOUT_QUAD | AV_CH_TOP_FRONT_LEFT | AV_CH_TOP_FRONT_RIGHT | \
-+   AV_CH_TOP_BACK_LEFT | AV_CH_TOP_BACK_RIGHT)
-+#define AV_CH_LAYOUT_5POINT1POINT4_BACK \
-+  (AV_CH_LAYOUT_5POINT1POINT2_BACK | AV_CH_TOP_BACK_LEFT | AV_CH_TOP_BACK_RIGHT)
-+#define AV_CH_LAYOUT_7POINT1POINT2 \
-+  (AV_CH_LAYOUT_7POINT1 | AV_CH_TOP_FRONT_LEFT | AV_CH_TOP_FRONT_RIGHT)
-+#define AV_CH_LAYOUT_7POINT1POINT4_BACK \
-+  (AV_CH_LAYOUT_7POINT1POINT2 | AV_CH_TOP_BACK_LEFT | AV_CH_TOP_BACK_RIGHT)
-+#define AV_CH_LAYOUT_7POINT2POINT3 \
-+  (AV_CH_LAYOUT_7POINT1POINT2 | AV_CH_TOP_BACK_CENTER | AV_CH_LOW_FREQUENCY_2)
-+#define AV_CH_LAYOUT_9POINT1POINT4_BACK                           \
-+  (AV_CH_LAYOUT_7POINT1POINT4_BACK | AV_CH_FRONT_LEFT_OF_CENTER | \
-+   AV_CH_FRONT_RIGHT_OF_CENTER)
-+#define AV_CH_LAYOUT_HEXADECAGONAL                                      \
-+  (AV_CH_LAYOUT_OCTAGONAL | AV_CH_WIDE_LEFT | AV_CH_WIDE_RIGHT |        \
-+   AV_CH_TOP_BACK_LEFT | AV_CH_TOP_BACK_RIGHT | AV_CH_TOP_BACK_CENTER | \
-+   AV_CH_TOP_FRONT_CENTER | AV_CH_TOP_FRONT_LEFT | AV_CH_TOP_FRONT_RIGHT)
-+#define AV_CH_LAYOUT_STEREO_DOWNMIX (AV_CH_STEREO_LEFT | AV_CH_STEREO_RIGHT)
-+#define AV_CH_LAYOUT_22POINT2                                                 \
-+  (AV_CH_LAYOUT_7POINT1POINT4_BACK | AV_CH_FRONT_LEFT_OF_CENTER |             \
-+   AV_CH_FRONT_RIGHT_OF_CENTER | AV_CH_BACK_CENTER | AV_CH_LOW_FREQUENCY_2 |  \
-+   AV_CH_TOP_FRONT_CENTER | AV_CH_TOP_CENTER | AV_CH_TOP_SIDE_LEFT |          \
-+   AV_CH_TOP_SIDE_RIGHT | AV_CH_TOP_BACK_CENTER | AV_CH_BOTTOM_FRONT_CENTER | \
-+   AV_CH_BOTTOM_FRONT_LEFT | AV_CH_BOTTOM_FRONT_RIGHT)
-+
-+#define AV_CH_LAYOUT_7POINT1_TOP_BACK AV_CH_LAYOUT_5POINT1POINT2_BACK
-+
-+enum AVMatrixEncoding {
-+  AV_MATRIX_ENCODING_NONE,
-+  AV_MATRIX_ENCODING_DOLBY,
-+  AV_MATRIX_ENCODING_DPLII,
-+  AV_MATRIX_ENCODING_DPLIIX,
-+  AV_MATRIX_ENCODING_DPLIIZ,
-+  AV_MATRIX_ENCODING_DOLBYEX,
-+  AV_MATRIX_ENCODING_DOLBYHEADPHONE,
-+  AV_MATRIX_ENCODING_NB
-+};
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * An AVChannelCustom defines a single channel within a custom order layout
-+ *
-+ * Unlike most structures in FFmpeg, sizeof(AVChannelCustom) is a part of the
-+ * public ABI.
-+ *
-+ * No new fields may be added to it without a major version bump.
-+ */
-+typedef struct AVChannelCustom {
-+  enum AVChannel id;
-+  char name[16];
-+  void* opaque;
-+} AVChannelCustom;
-+
-+/**
-+ * An AVChannelLayout holds information about the channel layout of audio data.
-+ *
-+ * A channel layout here is defined as a set of channels ordered in a specific
-+ * way (unless the channel order is AV_CHANNEL_ORDER_UNSPEC, in which case an
-+ * AVChannelLayout carries only the channel count).
-+ * All orders may be treated as if they were AV_CHANNEL_ORDER_UNSPEC by
-+ * ignoring everything but the channel count, as long as
-+ * av_channel_layout_check() considers they are valid.
-+ *
-+ * Unlike most structures in FFmpeg, sizeof(AVChannelLayout) is a part of the
-+ * public ABI and may be used by the caller. E.g. it may be allocated on stack
-+ * or embedded in caller-defined structs.
-+ *
-+ * AVChannelLayout can be initialized as follows:
-+ * - default initialization with {0}, followed by setting all used fields
-+ *   correctly;
-+ * - by assigning one of the predefined AV_CHANNEL_LAYOUT_* initializers;
-+ * - with a constructor function, such as av_channel_layout_default(),
-+ *   av_channel_layout_from_mask() or av_channel_layout_from_string().
-+ *
-+ * The channel layout must be unitialized with av_channel_layout_uninit()
-+ *
-+ * Copying an AVChannelLayout via assigning is forbidden,
-+ * av_channel_layout_copy() must be used instead (and its return value should
-+ * be checked)
-+ *
-+ * No new fields may be added to it without a major version bump, except for
-+ * new elements of the union fitting in sizeof(uint64_t).
-+ */
-+typedef struct AVChannelLayout {
-+  /**
-+   * Channel order used in this layout.
-+   * This is a mandatory field.
-+   */
-+  enum AVChannelOrder order;
-+
-+  /**
-+   * Number of channels in this layout. Mandatory field.
-+   */
-+  int nb_channels;
-+
-+  /**
-+   * Details about which channels are present in this layout.
-+   * For AV_CHANNEL_ORDER_UNSPEC, this field is undefined and must not be
-+   * used.
-+   */
-+  union {
-+    /**
-+     * This member must be used for AV_CHANNEL_ORDER_NATIVE, and may be used
-+     * for AV_CHANNEL_ORDER_AMBISONIC to signal non-diegetic channels.
-+     * It is a bitmask, where the position of each set bit means that the
-+     * AVChannel with the corresponding value is present.
-+     *
-+     * I.e. when (mask & (1 << AV_CHAN_FOO)) is non-zero, then AV_CHAN_FOO
-+     * is present in the layout. Otherwise it is not present.
-+     *
-+     * @note when a channel layout using a bitmask is constructed or
-+     * modified manually (i.e.  not using any of the av_channel_layout_*
-+     * functions), the code doing it must ensure that the number of set bits
-+     * is equal to nb_channels.
-+     */
-+    uint64_t mask;
-+    /**
-+     * This member must be used when the channel order is
-+     * AV_CHANNEL_ORDER_CUSTOM. It is a nb_channels-sized array, with each
-+     * element signalling the presence of the AVChannel with the
-+     * corresponding value in map[i].id.
-+     *
-+     * I.e. when map[i].id is equal to AV_CHAN_FOO, then AV_CH_FOO is the
-+     * i-th channel in the audio data.
-+     *
-+     * When map[i].id is in the range between AV_CHAN_AMBISONIC_BASE and
-+     * AV_CHAN_AMBISONIC_END (inclusive), the channel contains an ambisonic
-+     * component with ACN index (as defined above)
-+     * n = map[i].id - AV_CHAN_AMBISONIC_BASE.
-+     *
-+     * map[i].name may be filled with a 0-terminated string, in which case
-+     * it will be used for the purpose of identifying the channel with the
-+     * convenience functions below. Otherise it must be zeroed.
-+     */
-+    AVChannelCustom* map;
-+  } u;
-+
-+  /**
-+   * For some private data of the user.
-+   */
-+  void* opaque;
-+} AVChannelLayout;
-+
-+/**
-+ * Macro to define native channel layouts
-+ *
-+ * @note This doesn't use designated initializers for compatibility with C++ 17
-+ * and older.
-+ */
-+#define AV_CHANNEL_LAYOUT_MASK(nb, m)                                    \
-+  { /* .order */                                                         \
-+    AV_CHANNEL_ORDER_NATIVE, /* .nb_channels */ (nb), /* .u.mask */ {m}, \
-+        /* .opaque */ NULL                                               \
-+  }
-+
-+/**
-+ * @name Common pre-defined channel layouts
-+ * @{
-+ */
-+#define AV_CHANNEL_LAYOUT_MONO AV_CHANNEL_LAYOUT_MASK(1, AV_CH_LAYOUT_MONO)
-+#define AV_CHANNEL_LAYOUT_STEREO AV_CHANNEL_LAYOUT_MASK(2, AV_CH_LAYOUT_STEREO)
-+#define AV_CHANNEL_LAYOUT_2POINT1 \
-+  AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_2POINT1)
-+#define AV_CHANNEL_LAYOUT_2_1 AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_2_1)
-+#define AV_CHANNEL_LAYOUT_SURROUND \
-+  AV_CHANNEL_LAYOUT_MASK(3, AV_CH_LAYOUT_SURROUND)
-+#define AV_CHANNEL_LAYOUT_3POINT1 \
-+  AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_3POINT1)
-+#define AV_CHANNEL_LAYOUT_4POINT0 \
-+  AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_4POINT0)
-+#define AV_CHANNEL_LAYOUT_4POINT1 \
-+  AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_4POINT1)
-+#define AV_CHANNEL_LAYOUT_2_2 AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_2_2)
-+#define AV_CHANNEL_LAYOUT_QUAD AV_CHANNEL_LAYOUT_MASK(4, AV_CH_LAYOUT_QUAD)
-+#define AV_CHANNEL_LAYOUT_5POINT0 \
-+  AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_5POINT0)
-+#define AV_CHANNEL_LAYOUT_5POINT1 \
-+  AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_5POINT1)
-+#define AV_CHANNEL_LAYOUT_5POINT0_BACK \
-+  AV_CHANNEL_LAYOUT_MASK(5, AV_CH_LAYOUT_5POINT0_BACK)
-+#define AV_CHANNEL_LAYOUT_5POINT1_BACK \
-+  AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_5POINT1_BACK)
-+#define AV_CHANNEL_LAYOUT_6POINT0 \
-+  AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_6POINT0)
-+#define AV_CHANNEL_LAYOUT_6POINT0_FRONT \
-+  AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_6POINT0_FRONT)
-+#define AV_CHANNEL_LAYOUT_3POINT1POINT2 \
-+  AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_3POINT1POINT2)
-+#define AV_CHANNEL_LAYOUT_HEXAGONAL \
-+  AV_CHANNEL_LAYOUT_MASK(6, AV_CH_LAYOUT_HEXAGONAL)
-+#define AV_CHANNEL_LAYOUT_6POINT1 \
-+  AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1)
-+#define AV_CHANNEL_LAYOUT_6POINT1_BACK \
-+  AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1_BACK)
-+#define AV_CHANNEL_LAYOUT_6POINT1_FRONT \
-+  AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_6POINT1_FRONT)
-+#define AV_CHANNEL_LAYOUT_7POINT0 \
-+  AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_7POINT0)
-+#define AV_CHANNEL_LAYOUT_7POINT0_FRONT \
-+  AV_CHANNEL_LAYOUT_MASK(7, AV_CH_LAYOUT_7POINT0_FRONT)
-+#define AV_CHANNEL_LAYOUT_7POINT1 \
-+  AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1)
-+#define AV_CHANNEL_LAYOUT_7POINT1_WIDE \
-+  AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_WIDE)
-+#define AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK \
-+  AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_WIDE_BACK)
-+#define AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK \
-+  AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_5POINT1POINT2_BACK)
-+#define AV_CHANNEL_LAYOUT_OCTAGONAL \
-+  AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_OCTAGONAL)
-+#define AV_CHANNEL_LAYOUT_CUBE AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_CUBE)
-+#define AV_CHANNEL_LAYOUT_5POINT1POINT4_BACK \
-+  AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_5POINT1POINT4_BACK)
-+#define AV_CHANNEL_LAYOUT_7POINT1POINT2 \
-+  AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_7POINT1POINT2)
-+#define AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK \
-+  AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT1POINT4_BACK)
-+#define AV_CHANNEL_LAYOUT_7POINT2POINT3 \
-+  AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT2POINT3)
-+#define AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK \
-+  AV_CHANNEL_LAYOUT_MASK(14, AV_CH_LAYOUT_9POINT1POINT4_BACK)
-+#define AV_CHANNEL_LAYOUT_HEXADECAGONAL \
-+  AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_HEXADECAGONAL)
-+#define AV_CHANNEL_LAYOUT_STEREO_DOWNMIX \
-+  AV_CHANNEL_LAYOUT_MASK(2, AV_CH_LAYOUT_STEREO_DOWNMIX)
-+#define AV_CHANNEL_LAYOUT_22POINT2 \
-+  AV_CHANNEL_LAYOUT_MASK(24, AV_CH_LAYOUT_22POINT2)
-+
-+#define AV_CHANNEL_LAYOUT_7POINT1_TOP_BACK AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK
-+
-+#define AV_CHANNEL_LAYOUT_AMBISONIC_FIRST_ORDER                          \
-+  { /* .order */                                                         \
-+    AV_CHANNEL_ORDER_AMBISONIC, /* .nb_channels */ 4, /* .u.mask */ {0}, \
-+        /* .opaque */ NULL                                               \
-+  }
-+/** @} */
-+
-+struct AVBPrint;
-+
-+/**
-+ * Get a human readable string in an abbreviated form describing a given
-+ * channel. This is the inverse function of @ref av_channel_from_string().
-+ *
-+ * @param buf pre-allocated buffer where to put the generated string
-+ * @param buf_size size in bytes of the buffer.
-+ * @param channel the AVChannel whose name to get
-+ * @return amount of bytes needed to hold the output string, or a negative
-+ * AVERROR on failure. If the returned value is bigger than buf_size, then the
-+ *         string was truncated.
-+ */
-+int av_channel_name(char* buf, size_t buf_size, enum AVChannel channel);
-+
-+/**
-+ * bprint variant of av_channel_name().
-+ *
-+ * @note the string will be appended to the bprint buffer.
-+ */
-+void av_channel_name_bprint(struct AVBPrint* bp, enum AVChannel channel_id);
-+
-+/**
-+ * Get a human readable string describing a given channel.
-+ *
-+ * @param buf pre-allocated buffer where to put the generated string
-+ * @param buf_size size in bytes of the buffer.
-+ * @param channel the AVChannel whose description to get
-+ * @return amount of bytes needed to hold the output string, or a negative
-+ * AVERROR on failure. If the returned value is bigger than buf_size, then the
-+ *         string was truncated.
-+ */
-+int av_channel_description(char* buf, size_t buf_size, enum AVChannel channel);
-+
-+/**
-+ * bprint variant of av_channel_description().
-+ *
-+ * @note the string will be appended to the bprint buffer.
-+ */
-+void av_channel_description_bprint(struct AVBPrint* bp,
-+                                   enum AVChannel channel_id);
-+
-+/**
-+ * This is the inverse function of @ref av_channel_name().
-+ *
-+ * @return the channel with the given name
-+ *         AV_CHAN_NONE when name does not identify a known channel
-+ */
-+enum AVChannel av_channel_from_string(const char* name);
-+
-+/**
-+ * Initialize a custom channel layout with the specified number of channels.
-+ * The channel map will be allocated and the designation of all channels will
-+ * be set to AV_CHAN_UNKNOWN.
-+ *
-+ * This is only a convenience helper function, a custom channel layout can also
-+ * be constructed without using this.
-+ *
-+ * @param channel_layout the layout structure to be initialized
-+ * @param nb_channels the number of channels
-+ *
-+ * @return 0 on success
-+ *         AVERROR(EINVAL) if the number of channels <= 0
-+ *         AVERROR(ENOMEM) if the channel map could not be allocated
-+ */
-+int av_channel_layout_custom_init(AVChannelLayout* channel_layout,
-+                                  int nb_channels);
-+
-+/**
-+ * Initialize a native channel layout from a bitmask indicating which channels
-+ * are present.
-+ *
-+ * @param channel_layout the layout structure to be initialized
-+ * @param mask bitmask describing the channel layout
-+ *
-+ * @return 0 on success
-+ *         AVERROR(EINVAL) for invalid mask values
-+ */
-+int av_channel_layout_from_mask(AVChannelLayout* channel_layout, uint64_t mask);
-+
-+/**
-+ * Initialize a channel layout from a given string description.
-+ * The input string can be represented by:
-+ *  - the formal channel layout name (returned by av_channel_layout_describe())
-+ *  - single or multiple channel names (returned by av_channel_name(), eg. "FL",
-+ *    or concatenated with "+", each optionally containing a custom name after
-+ *    a "@", eg. "FL@Left+FR@Right+LFE")
-+ *  - a decimal or hexadecimal value of a native channel layout (eg. "4" or
-+ * "0x4")
-+ *  - the number of channels with default layout (eg. "4c")
-+ *  - the number of unordered channels (eg. "4C" or "4 channels")
-+ *  - the ambisonic order followed by optional non-diegetic channels (eg.
-+ *    "ambisonic 2+stereo")
-+ * On error, the channel layout will remain uninitialized, but not necessarily
-+ * untouched.
-+ *
-+ * @param channel_layout uninitialized channel layout for the result
-+ * @param str string describing the channel layout
-+ * @return 0 on success parsing the channel layout
-+ *         AVERROR(EINVAL) if an invalid channel layout string was provided
-+ *         AVERROR(ENOMEM) if there was not enough memory
-+ */
-+int av_channel_layout_from_string(AVChannelLayout* channel_layout,
-+                                  const char* str);
-+
-+/**
-+ * Get the default channel layout for a given number of channels.
-+ *
-+ * @param ch_layout the layout structure to be initialized
-+ * @param nb_channels number of channels
-+ */
-+void av_channel_layout_default(AVChannelLayout* ch_layout, int nb_channels);
-+
-+/**
-+ * Iterate over all standard channel layouts.
-+ *
-+ * @param opaque a pointer where libavutil will store the iteration state. Must
-+ *               point to NULL to start the iteration.
-+ *
-+ * @return the standard channel layout or NULL when the iteration is
-+ *         finished
-+ */
-+const AVChannelLayout* av_channel_layout_standard(void** opaque);
-+
-+/**
-+ * Free any allocated data in the channel layout and reset the channel
-+ * count to 0.
-+ *
-+ * @param channel_layout the layout structure to be uninitialized
-+ */
-+void av_channel_layout_uninit(AVChannelLayout* channel_layout);
-+
-+/**
-+ * Make a copy of a channel layout. This differs from just assigning src to dst
-+ * in that it allocates and copies the map for AV_CHANNEL_ORDER_CUSTOM.
-+ *
-+ * @note the destination channel_layout will be always uninitialized before
-+ * copy.
-+ *
-+ * @param dst destination channel layout
-+ * @param src source channel layout
-+ * @return 0 on success, a negative AVERROR on error.
-+ */
-+int av_channel_layout_copy(AVChannelLayout* dst, const AVChannelLayout* src);
-+
-+/**
-+ * Get a human-readable string describing the channel layout properties.
-+ * The string will be in the same format that is accepted by
-+ * @ref av_channel_layout_from_string(), allowing to rebuild the same
-+ * channel layout, except for opaque pointers.
-+ *
-+ * @param channel_layout channel layout to be described
-+ * @param buf pre-allocated buffer where to put the generated string
-+ * @param buf_size size in bytes of the buffer.
-+ * @return amount of bytes needed to hold the output string, or a negative
-+ * AVERROR on failure. If the returned value is bigger than buf_size, then the
-+ *         string was truncated.
-+ */
-+int av_channel_layout_describe(const AVChannelLayout* channel_layout, char* buf,
-+                               size_t buf_size);
-+
-+/**
-+ * bprint variant of av_channel_layout_describe().
-+ *
-+ * @note the string will be appended to the bprint buffer.
-+ * @return 0 on success, or a negative AVERROR value on failure.
-+ */
-+int av_channel_layout_describe_bprint(const AVChannelLayout* channel_layout,
-+                                      struct AVBPrint* bp);
-+
-+/**
-+ * Get the channel with the given index in a channel layout.
-+ *
-+ * @param channel_layout input channel layout
-+ * @param idx index of the channel
-+ * @return channel with the index idx in channel_layout on success or
-+ *         AV_CHAN_NONE on failure (if idx is not valid or the channel order is
-+ *         unspecified)
-+ */
-+enum AVChannel av_channel_layout_channel_from_index(
-+    const AVChannelLayout* channel_layout, unsigned int idx);
-+
-+/**
-+ * Get the index of a given channel in a channel layout. In case multiple
-+ * channels are found, only the first match will be returned.
-+ *
-+ * @param channel_layout input channel layout
-+ * @param channel the channel whose index to obtain
-+ * @return index of channel in channel_layout on success or a negative number if
-+ *         channel is not present in channel_layout.
-+ */
-+int av_channel_layout_index_from_channel(const AVChannelLayout* channel_layout,
-+                                         enum AVChannel channel);
-+
-+/**
-+ * Get the index in a channel layout of a channel described by the given string.
-+ * In case multiple channels are found, only the first match will be returned.
-+ *
-+ * This function accepts channel names in the same format as
-+ * @ref av_channel_from_string().
-+ *
-+ * @param channel_layout input channel layout
-+ * @param name string describing the channel whose index to obtain
-+ * @return a channel index described by the given string, or a negative AVERROR
-+ *         value.
-+ */
-+int av_channel_layout_index_from_string(const AVChannelLayout* channel_layout,
-+                                        const char* name);
-+
-+/**
-+ * Get a channel described by the given string.
-+ *
-+ * This function accepts channel names in the same format as
-+ * @ref av_channel_from_string().
-+ *
-+ * @param channel_layout input channel layout
-+ * @param name string describing the channel to obtain
-+ * @return a channel described by the given string in channel_layout on success
-+ *         or AV_CHAN_NONE on failure (if the string is not valid or the channel
-+ *         order is unspecified)
-+ */
-+enum AVChannel av_channel_layout_channel_from_string(
-+    const AVChannelLayout* channel_layout, const char* name);
-+
-+/**
-+ * Find out what channels from a given set are present in a channel layout,
-+ * without regard for their positions.
-+ *
-+ * @param channel_layout input channel layout
-+ * @param mask a combination of AV_CH_* representing a set of channels
-+ * @return a bitfield representing all the channels from mask that are present
-+ *         in channel_layout
-+ */
-+uint64_t av_channel_layout_subset(const AVChannelLayout* channel_layout,
-+                                  uint64_t mask);
-+
-+/**
-+ * Check whether a channel layout is valid, i.e. can possibly describe audio
-+ * data.
-+ *
-+ * @param channel_layout input channel layout
-+ * @return 1 if channel_layout is valid, 0 otherwise.
-+ */
-+int av_channel_layout_check(const AVChannelLayout* channel_layout);
-+
-+/**
-+ * Check whether two channel layouts are semantically the same, i.e. the same
-+ * channels are present on the same positions in both.
-+ *
-+ * If one of the channel layouts is AV_CHANNEL_ORDER_UNSPEC, while the other is
-+ * not, they are considered to be unequal. If both are AV_CHANNEL_ORDER_UNSPEC,
-+ * they are considered equal iff the channel counts are the same in both.
-+ *
-+ * @param chl input channel layout
-+ * @param chl1 input channel layout
-+ * @return 0 if chl and chl1 are equal, 1 if they are not equal. A negative
-+ *         AVERROR code if one or both are invalid.
-+ */
-+int av_channel_layout_compare(const AVChannelLayout* chl,
-+                              const AVChannelLayout* chl1);
-+
-+/**
-+ * The conversion must be lossless.
-+ */
-+#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS (1 << 0)
-+
-+/**
-+ * The specified retype target order is ignored and the simplest possible
-+ * (canonical) order is used for which the input layout can be losslessy
-+ * represented.
-+ */
-+#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL (1 << 1)
-+
-+/**
-+ * Change the AVChannelOrder of a channel layout.
-+ *
-+ * Change of AVChannelOrder can be either lossless or lossy. In case of a
-+ * lossless conversion all the channel designations and the associated channel
-+ * names (if any) are kept. On a lossy conversion the channel names and channel
-+ * designations might be lost depending on the capabilities of the desired
-+ * AVChannelOrder. Note that some conversions are simply not possible in which
-+ * case this function returns AVERROR(ENOSYS).
-+ *
-+ * The following conversions are supported:
-+ *
-+ * Any       -> Custom     : Always possible, always lossless.
-+ * Any       -> Unspecified: Always possible, lossless if channel designations
-+ *   are all unknown and channel names are not used, lossy otherwise.
-+ * Custom    -> Ambisonic  : Possible if it contains ambisonic channels with
-+ *   optional non-diegetic channels in the end. Lossy if the channels have
-+ *   custom names, lossless otherwise.
-+ * Custom    -> Native     : Possible if it contains native channels in native
-+ *     order. Lossy if the channels have custom names, lossless otherwise.
-+ *
-+ * On error this function keeps the original channel layout untouched.
-+ *
-+ * @param channel_layout channel layout which will be changed
-+ * @param order the desired channel layout order
-+ * @param flags a combination of AV_CHANNEL_LAYOUT_RETYPE_FLAG_* constants
-+ * @return 0 if the conversion was successful and lossless or if the channel
-+ *           layout was already in the desired order
-+ *         >0 if the conversion was successful but lossy
-+ *         AVERROR(ENOSYS) if the conversion was not possible (or would be
-+ *           lossy and AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS was specified)
-+ *         AVERROR(EINVAL), AVERROR(ENOMEM) on error
-+ */
-+int av_channel_layout_retype(AVChannelLayout* channel_layout,
-+                             enum AVChannelOrder order, int flags);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_CHANNEL_LAYOUT_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/common.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/common.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/common.h
-@@ -0,0 +1,587 @@
-+/*
-+ * copyright (c) 2006 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 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
-+ * common internal and external API header
-+ */
-+
-+#ifndef AVUTIL_COMMON_H
-+#define AVUTIL_COMMON_H
-+
-+#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && \
-+    !defined(UINT64_C)
-+#  error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
-+#endif
-+
-+#include <errno.h>
-+#include <inttypes.h>
-+#include <limits.h>
-+#include <math.h>
-+#include <stdint.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <string.h>
-+
-+#include "attributes.h"
-+#include "error.h"
-+#include "macros.h"
-+
-+#ifdef HAVE_AV_CONFIG_H
-+#  include "config.h"
-+#  include "intmath.h"
-+#  include "internal.h"
-+#else
-+#  include "mem.h"
-+#endif /* HAVE_AV_CONFIG_H */
-+
-+// 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))
-+/* 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))
-+/* Backwards compat. */
-+#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT
-+
-+#define FFUDIV(a, b) (((a) > 0 ? (a) : (a) - (b) + 1) / (b))
-+#define FFUMOD(a, b) ((a) - (b) * FFUDIV(a, b))
-+
-+/**
-+ * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as
-+ * they are not representable as absolute values of their type. This is the same
-+ * as with *abs()
-+ * @see FFNABS()
-+ */
-+#define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
-+#define FFSIGN(a) ((a) > 0 ? 1 : -1)
-+
-+/**
-+ * Negative Absolute value.
-+ * this works for all integers of all types.
-+ * As with many macros, this evaluates its argument twice, it thus must not have
-+ * a sideeffect, that is FFNABS(x++) has undefined behavior.
-+ */
-+#define FFNABS(a) ((a) <= 0 ? (a) : (-(a)))
-+
-+/**
-+ * Unsigned Absolute value.
-+ * This takes the absolute value of a signed int and returns it as a unsigned.
-+ * This also works with INT_MIN which would otherwise not be representable
-+ * As with many macros, this evaluates its argument twice.
-+ */
-+#define FFABSU(a) ((a) <= 0 ? -(unsigned)(a) : (unsigned)(a))
-+#define FFABS64U(a) ((a) <= 0 ? -(uint64_t)(a) : (uint64_t)(a))
-+
-+/* misc math functions */
-+
-+#ifndef av_ceil_log2
-+#  define av_ceil_log2 av_ceil_log2_c
-+#endif
-+#ifndef av_clip
-+#  define av_clip av_clip_c
-+#endif
-+#ifndef av_clip64
-+#  define av_clip64 av_clip64_c
-+#endif
-+#ifndef av_clip_uint8
-+#  define av_clip_uint8 av_clip_uint8_c
-+#endif
-+#ifndef av_clip_int8
-+#  define av_clip_int8 av_clip_int8_c
-+#endif
-+#ifndef av_clip_uint16
-+#  define av_clip_uint16 av_clip_uint16_c
-+#endif
-+#ifndef av_clip_int16
-+#  define av_clip_int16 av_clip_int16_c
-+#endif
-+#ifndef av_clipl_int32
-+#  define av_clipl_int32 av_clipl_int32_c
-+#endif
-+#ifndef av_clip_intp2
-+#  define av_clip_intp2 av_clip_intp2_c
-+#endif
-+#ifndef av_clip_uintp2
-+#  define av_clip_uintp2 av_clip_uintp2_c
-+#endif
-+#ifndef av_mod_uintp2
-+#  define av_mod_uintp2 av_mod_uintp2_c
-+#endif
-+#ifndef av_sat_add32
-+#  define av_sat_add32 av_sat_add32_c
-+#endif
-+#ifndef av_sat_dadd32
-+#  define av_sat_dadd32 av_sat_dadd32_c
-+#endif
-+#ifndef av_sat_sub32
-+#  define av_sat_sub32 av_sat_sub32_c
-+#endif
-+#ifndef av_sat_dsub32
-+#  define av_sat_dsub32 av_sat_dsub32_c
-+#endif
-+#ifndef av_sat_add64
-+#  define av_sat_add64 av_sat_add64_c
-+#endif
-+#ifndef av_sat_sub64
-+#  define av_sat_sub64 av_sat_sub64_c
-+#endif
-+#ifndef av_clipf
-+#  define av_clipf av_clipf_c
-+#endif
-+#ifndef av_clipd
-+#  define av_clipd av_clipd_c
-+#endif
-+#ifndef av_popcount
-+#  define av_popcount av_popcount_c
-+#endif
-+#ifndef av_popcount64
-+#  define av_popcount64 av_popcount64_c
-+#endif
-+#ifndef av_parity
-+#  define av_parity av_parity_c
-+#endif
-+
-+#ifndef av_log2
-+av_const int av_log2(unsigned v);
-+#endif
-+
-+#ifndef av_log2_16bit
-+av_const int av_log2_16bit(unsigned v);
-+#endif
-+
-+/**
-+ * Clip a signed integer value into the amin-amax range.
-+ * @param a value to clip
-+ * @param amin minimum value of the clip range
-+ * @param amax maximum value of the clip range
-+ * @return clipped value
-+ */
-+static av_always_inline av_const int av_clip_c(int a, int amin, int amax) {
-+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
-+  if (amin > amax) abort();
-+#endif
-+  if (a < amin)
-+    return amin;
-+  else if (a > amax)
-+    return amax;
-+  else
-+    return a;
-+}
-+
-+/**
-+ * Clip a signed 64bit integer value into the amin-amax range.
-+ * @param a value to clip
-+ * @param amin minimum value of the clip range
-+ * @param amax maximum value of the clip range
-+ * @return clipped value
-+ */
-+static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin,
-+                                                     int64_t amax) {
-+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
-+  if (amin > amax) abort();
-+#endif
-+  if (a < amin)
-+    return amin;
-+  else if (a > amax)
-+    return amax;
-+  else
-+    return a;
-+}
-+
-+/**
-+ * Clip a signed integer value into the 0-255 range.
-+ * @param a value to clip
-+ * @return clipped value
-+ */
-+static av_always_inline av_const uint8_t av_clip_uint8_c(int a) {
-+  if (a & (~0xFF))
-+    return (~a) >> 31;
-+  else
-+    return a;
-+}
-+
-+/**
-+ * Clip a signed integer value into the -128,127 range.
-+ * @param a value to clip
-+ * @return clipped value
-+ */
-+static av_always_inline av_const int8_t av_clip_int8_c(int a) {
-+  if ((a + 0x80U) & ~0xFF)
-+    return (a >> 31) ^ 0x7F;
-+  else
-+    return a;
-+}
-+
-+/**
-+ * Clip a signed integer value into the 0-65535 range.
-+ * @param a value to clip
-+ * @return clipped value
-+ */
-+static av_always_inline av_const uint16_t av_clip_uint16_c(int a) {
-+  if (a & (~0xFFFF))
-+    return (~a) >> 31;
-+  else
-+    return a;
-+}
-+
-+/**
-+ * Clip a signed integer value into the -32768,32767 range.
-+ * @param a value to clip
-+ * @return clipped value
-+ */
-+static av_always_inline av_const int16_t av_clip_int16_c(int a) {
-+  if ((a + 0x8000U) & ~0xFFFF)
-+    return (a >> 31) ^ 0x7FFF;
-+  else
-+    return a;
-+}
-+
-+/**
-+ * Clip a signed 64-bit integer value into the -2147483648,2147483647 range.
-+ * @param a value to clip
-+ * @return clipped value
-+ */
-+static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) {
-+  if ((a + 0x80000000u) & ~UINT64_C(0xFFFFFFFF))
-+    return (int32_t)((a >> 63) ^ 0x7FFFFFFF);
-+  else
-+    return (int32_t)a;
-+}
-+
-+/**
-+ * Clip a signed integer into the -(2^p),(2^p-1) range.
-+ * @param  a value to clip
-+ * @param  p bit position to clip at
-+ * @return clipped value
-+ */
-+static av_always_inline av_const int av_clip_intp2_c(int a, int p) {
-+  if (((unsigned)a + (1 << p)) & ~((2 << p) - 1))
-+    return (a >> 31) ^ ((1 << p) - 1);
-+  else
-+    return a;
-+}
-+
-+/**
-+ * Clip a signed integer to an unsigned power of two range.
-+ * @param  a value to clip
-+ * @param  p bit position to clip at
-+ * @return clipped value
-+ */
-+static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) {
-+  if (a & ~((1 << p) - 1))
-+    return (~a) >> 31 & ((1 << p) - 1);
-+  else
-+    return a;
-+}
-+
-+/**
-+ * Clear high bits from an unsigned integer starting with specific bit position
-+ * @param  a value to clip
-+ * @param  p bit position to clip at
-+ * @return clipped value
-+ */
-+static av_always_inline av_const unsigned av_mod_uintp2_c(unsigned a,
-+                                                          unsigned p) {
-+  return a & ((1U << p) - 1);
-+}
-+
-+/**
-+ * Add two signed 32-bit values with saturation.
-+ *
-+ * @param  a one value
-+ * @param  b another value
-+ * @return sum with signed saturation
-+ */
-+static av_always_inline int av_sat_add32_c(int a, int b) {
-+  return av_clipl_int32((int64_t)a + b);
-+}
-+
-+/**
-+ * Add a doubled value to another value with saturation at both stages.
-+ *
-+ * @param  a first value
-+ * @param  b value doubled and added to a
-+ * @return sum sat(a + sat(2*b)) with signed saturation
-+ */
-+static av_always_inline int av_sat_dadd32_c(int a, int b) {
-+  return av_sat_add32(a, av_sat_add32(b, b));
-+}
-+
-+/**
-+ * Subtract two signed 32-bit values with saturation.
-+ *
-+ * @param  a one value
-+ * @param  b another value
-+ * @return difference with signed saturation
-+ */
-+static av_always_inline int av_sat_sub32_c(int a, int b) {
-+  return av_clipl_int32((int64_t)a - b);
-+}
-+
-+/**
-+ * Subtract a doubled value from another value with saturation at both stages.
-+ *
-+ * @param  a first value
-+ * @param  b value doubled and subtracted from a
-+ * @return difference sat(a - sat(2*b)) with signed saturation
-+ */
-+static av_always_inline int av_sat_dsub32_c(int a, int b) {
-+  return av_sat_sub32(a, av_sat_add32(b, b));
-+}
-+
-+/**
-+ * Add two signed 64-bit values with saturation.
-+ *
-+ * @param  a one value
-+ * @param  b another value
-+ * @return sum with signed saturation
-+ */
-+static av_always_inline int64_t av_sat_add64_c(int64_t a, int64_t b) {
-+#if (!defined(__INTEL_COMPILER) && AV_GCC_VERSION_AT_LEAST(5, 1)) || \
-+    AV_HAS_BUILTIN(__builtin_add_overflow)
-+  int64_t tmp;
-+  return !__builtin_add_overflow(a, b, &tmp)
-+             ? tmp
-+             : (tmp < 0 ? INT64_MAX : INT64_MIN);
-+#else
-+  int64_t s = a + (uint64_t)b;
-+  if ((int64_t)(a ^ b | ~s ^ b) >= 0) return INT64_MAX ^ (b >> 63);
-+  return s;
-+#endif
-+}
-+
-+/**
-+ * Subtract two signed 64-bit values with saturation.
-+ *
-+ * @param  a one value
-+ * @param  b another value
-+ * @return difference with signed saturation
-+ */
-+static av_always_inline int64_t av_sat_sub64_c(int64_t a, int64_t b) {
-+#if (!defined(__INTEL_COMPILER) && AV_GCC_VERSION_AT_LEAST(5, 1)) || \
-+    AV_HAS_BUILTIN(__builtin_sub_overflow)
-+  int64_t tmp;
-+  return !__builtin_sub_overflow(a, b, &tmp)
-+             ? tmp
-+             : (tmp < 0 ? INT64_MAX : INT64_MIN);
-+#else
-+  if (b <= 0 && a >= INT64_MAX + b) return INT64_MAX;
-+  if (b >= 0 && a <= INT64_MIN + b) return INT64_MIN;
-+  return a - b;
-+#endif
-+}
-+
-+/**
-+ * Clip a float value into the amin-amax range.
-+ * If a is nan or -inf amin will be returned.
-+ * If a is +inf amax will be returned.
-+ * @param a value to clip
-+ * @param amin minimum value of the clip range
-+ * @param amax maximum value of the clip range
-+ * @return clipped value
-+ */
-+static av_always_inline av_const float av_clipf_c(float a, float amin,
-+                                                  float amax) {
-+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
-+  if (amin > amax) abort();
-+#endif
-+  return FFMIN(FFMAX(a, amin), amax);
-+}
-+
-+/**
-+ * Clip a double value into the amin-amax range.
-+ * If a is nan or -inf amin will be returned.
-+ * If a is +inf amax will be returned.
-+ * @param a value to clip
-+ * @param amin minimum value of the clip range
-+ * @param amax maximum value of the clip range
-+ * @return clipped value
-+ */
-+static av_always_inline av_const double av_clipd_c(double a, double amin,
-+                                                   double amax) {
-+#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
-+  if (amin > amax) abort();
-+#endif
-+  return FFMIN(FFMAX(a, amin), amax);
-+}
-+
-+/** Compute ceil(log2(x)).
-+ * @param x value used to compute ceil(log2(x))
-+ * @return computed ceiling of log2(x)
-+ */
-+static av_always_inline av_const int av_ceil_log2_c(int x) {
-+  return av_log2((x - 1U) << 1);
-+}
-+
-+/**
-+ * Count number of bits set to one in x
-+ * @param x value to count bits of
-+ * @return the number of bits set to one in x
-+ */
-+static av_always_inline av_const int av_popcount_c(uint32_t x) {
-+  x -= (x >> 1) & 0x55555555;
-+  x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
-+  x = (x + (x >> 4)) & 0x0F0F0F0F;
-+  x += x >> 8;
-+  return (x + (x >> 16)) & 0x3F;
-+}
-+
-+/**
-+ * Count number of bits set to one in x
-+ * @param x value to count bits of
-+ * @return the number of bits set to one in x
-+ */
-+static av_always_inline av_const int av_popcount64_c(uint64_t x) {
-+  return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32));
-+}
-+
-+static av_always_inline av_const int av_parity_c(uint32_t v) {
-+  return av_popcount(v) & 1;
-+}
-+
-+/**
-+ * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
-+ *
-+ * @param val      Output value, must be an lvalue of type uint32_t.
-+ * @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++, 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.
-+ *
-+ * @warning ERROR should not contain a loop control statement which
-+ * could interact with the internal while loop, and should force an
-+ * exit from the macro code (e.g. through a goto or a return) in order
-+ * to prevent undefined results.
-+ */
-+#define GET_UTF8(val, GET_BYTE, ERROR)         \
-+  val = (GET_BYTE);                            \
-+  {                                            \
-+    uint32_t top = (val & 128) >> 1;           \
-+    if ((val & 0xc0) == 0x80 || val >= 0xFE) { \
-+      ERROR                                    \
-+    }                                          \
-+    while (val & top) {                        \
-+      unsigned int tmp = (GET_BYTE)-128;       \
-+      if (tmp >> 6) {                          \
-+        ERROR                                  \
-+      }                                        \
-+      val = (val << 6) + tmp;                  \
-+      top <<= 5;                               \
-+    }                                          \
-+    val &= (top << 1) - 1;                     \
-+  }
-+
-+/**
-+ * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.
-+ *
-+ * @param val       Output value, must be an lvalue of type uint32_t.
-+ * @param GET_16BIT Expression returning two bytes of UTF-16 data converted
-+ *                  to native byte order.  Evaluated one or two times.
-+ * @param ERROR     Expression to be evaluated on invalid input,
-+ *                  typically a goto statement.
-+ */
-+#define GET_UTF16(val, GET_16BIT, ERROR) \
-+  val = (GET_16BIT);                     \
-+  {                                      \
-+    unsigned int hi = val - 0xD800;      \
-+    if (hi < 0x800) {                    \
-+      val = (GET_16BIT)-0xDC00;          \
-+      if (val > 0x3FFU || hi > 0x3FFU) { \
-+        ERROR                            \
-+      }                                  \
-+      val += (hi << 10) + 0x10000;       \
-+    }                                    \
-+  }
-+
-+/**
-+ * @def PUT_UTF8(val, tmp, PUT_BYTE)
-+ * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes
-+ * long).
-+ * @param val is an input-only argument and should be of type uint32_t. It holds
-+ * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If
-+ * val is given as a function it is executed only once.
-+ * @param tmp is a temporary variable and should be of type uint8_t. It
-+ * represents an intermediate value during conversion that is to be
-+ * output by PUT_BYTE.
-+ * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
-+ * It could be a function or a statement, and uses tmp as the input byte.
-+ * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
-+ * executed up to 4 times for values in the valid UTF-8 range and up to
-+ * 7 times in the general case, depending on the length of the converted
-+ * Unicode character.
-+ */
-+#define PUT_UTF8(val, tmp, PUT_BYTE)                \
-+  {                                                 \
-+    int bytes, shift;                               \
-+    uint32_t in = val;                              \
-+    if (in < 0x80) {                                \
-+      tmp = in;                                     \
-+      PUT_BYTE                                      \
-+    } else {                                        \
-+      bytes = (av_log2(in) + 4) / 5;                \
-+      shift = (bytes - 1) * 6;                      \
-+      tmp = (256 - (256 >> bytes)) | (in >> shift); \
-+      PUT_BYTE                                      \
-+      while (shift >= 6) {                          \
-+        shift -= 6;                                 \
-+        tmp = 0x80 | ((in >> shift) & 0x3f);        \
-+        PUT_BYTE                                    \
-+      }                                             \
-+    }                                               \
-+  }
-+
-+/**
-+ * @def PUT_UTF16(val, tmp, PUT_16BIT)
-+ * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
-+ * @param val is an input-only argument and should be of type uint32_t. It holds
-+ * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If
-+ * val is given as a function it is executed only once.
-+ * @param tmp is a temporary variable and should be of type uint16_t. It
-+ * represents an intermediate value during conversion that is to be
-+ * output by PUT_16BIT.
-+ * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
-+ * in desired endianness. It could be a function or a statement, and uses tmp
-+ * as the input byte.  For example, PUT_BYTE could be "*output++ = tmp;"
-+ * PUT_BYTE will be executed 1 or 2 times depending on input character.
-+ */
-+#define PUT_UTF16(val, tmp, PUT_16BIT)         \
-+  {                                            \
-+    uint32_t in = val;                         \
-+    if (in < 0x10000) {                        \
-+      tmp = in;                                \
-+      PUT_16BIT                                \
-+    } else {                                   \
-+      tmp = 0xD800 | ((in - 0x10000) >> 10);   \
-+      PUT_16BIT                                \
-+      tmp = 0xDC00 | ((in - 0x10000) & 0x3FF); \
-+      PUT_16BIT                                \
-+    }                                          \
-+  }
-+
-+#endif /* AVUTIL_COMMON_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/cpu.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/cpu.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/cpu.h
-@@ -0,0 +1,153 @@
-+/*
-+ * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
-+ *
-+ * 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_CPU_H
-+#define AVUTIL_CPU_H
-+
-+#include <stddef.h>
-+
-+#define AV_CPU_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */
-+
-+/* lower 16 bits - CPU features */
-+#define AV_CPU_FLAG_MMX 0x0001     ///< standard MMX
-+#define AV_CPU_FLAG_MMXEXT 0x0002  ///< SSE integer functions or AMD MMX ext
-+#define AV_CPU_FLAG_MMX2 0x0002    ///< SSE integer functions or AMD MMX ext
-+#define AV_CPU_FLAG_3DNOW 0x0004   ///< AMD 3DNOW
-+#define AV_CPU_FLAG_SSE 0x0008     ///< SSE functions
-+#define AV_CPU_FLAG_SSE2 0x0010    ///< PIV SSE2 functions
-+#define AV_CPU_FLAG_SSE2SLOW \
-+  0x40000000                         ///< SSE2 supported, but usually not faster
-+                                     ///< than regular MMX/SSE (e.g. Core1)
-+#define AV_CPU_FLAG_3DNOWEXT 0x0020  ///< AMD 3DNowExt
-+#define AV_CPU_FLAG_SSE3 0x0040      ///< Prescott SSE3 functions
-+#define AV_CPU_FLAG_SSE3SLOW \
-+  0x20000000                      ///< SSE3 supported, but usually not faster
-+                                  ///< than regular MMX/SSE (e.g. Core1)
-+#define AV_CPU_FLAG_SSSE3 0x0080  ///< Conroe SSSE3 functions
-+#define AV_CPU_FLAG_SSSE3SLOW \
-+  0x4000000  ///< SSSE3 supported, but usually not faster
-+#define AV_CPU_FLAG_ATOM \
-+  0x10000000  ///< Atom processor, some SSSE3 instructions are slower
-+#define AV_CPU_FLAG_SSE4 0x0100    ///< Penryn SSE4.1 functions
-+#define AV_CPU_FLAG_SSE42 0x0200   ///< Nehalem SSE4.2 functions
-+#define AV_CPU_FLAG_AESNI 0x80000  ///< Advanced Encryption Standard functions
-+#define AV_CPU_FLAG_AVX \
-+  0x4000  ///< AVX functions: requires OS support even if YMM registers aren't
-+          ///< used
-+#define AV_CPU_FLAG_AVXSLOW \
-+  0x8000000  ///< AVX supported, but slow when using YMM registers (e.g.
-+             ///< Bulldozer)
-+#define AV_CPU_FLAG_XOP 0x0400   ///< Bulldozer XOP functions
-+#define AV_CPU_FLAG_FMA4 0x0800  ///< Bulldozer FMA4 functions
-+#define AV_CPU_FLAG_CMOV 0x1000  ///< supports cmov instruction
-+#define AV_CPU_FLAG_AVX2 \
-+  0x8000  ///< AVX2 functions: requires OS support even if YMM registers aren't
-+          ///< used
-+#define AV_CPU_FLAG_FMA3 0x10000  ///< Haswell FMA3 functions
-+#define AV_CPU_FLAG_BMI1 0x20000  ///< Bit Manipulation Instruction Set 1
-+#define AV_CPU_FLAG_BMI2 0x40000  ///< Bit Manipulation Instruction Set 2
-+#define AV_CPU_FLAG_AVX512 \
-+  0x100000  ///< AVX-512 functions: requires OS support even if YMM/ZMM
-+            ///< registers aren't used
-+#define AV_CPU_FLAG_AVX512ICL \
-+  0x200000  ///< F/CD/BW/DQ/VL/VNNI/IFMA/VBMI/VBMI2/VPOPCNTDQ/BITALG/GFNI/VAES/VPCLMULQDQ
-+#define AV_CPU_FLAG_SLOW_GATHER 0x2000000  ///< CPU has slow gathers.
-+
-+#define AV_CPU_FLAG_ALTIVEC 0x0001  ///< standard
-+#define AV_CPU_FLAG_VSX 0x0002      ///< ISA 2.06
-+#define AV_CPU_FLAG_POWER8 0x0004   ///< ISA 2.07
-+
-+#define AV_CPU_FLAG_ARMV5TE (1 << 0)
-+#define AV_CPU_FLAG_ARMV6 (1 << 1)
-+#define AV_CPU_FLAG_ARMV6T2 (1 << 2)
-+#define AV_CPU_FLAG_VFP (1 << 3)
-+#define AV_CPU_FLAG_VFPV3 (1 << 4)
-+#define AV_CPU_FLAG_NEON (1 << 5)
-+#define AV_CPU_FLAG_ARMV8 (1 << 6)
-+#define AV_CPU_FLAG_VFP_VM \
-+  (1 << 7)  ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in
-+            ///< various CPUs implementations
-+#define AV_CPU_FLAG_DOTPROD (1 << 8)
-+#define AV_CPU_FLAG_I8MM (1 << 9)
-+#define AV_CPU_FLAG_SETEND (1 << 16)
-+
-+#define AV_CPU_FLAG_MMI (1 << 0)
-+#define AV_CPU_FLAG_MSA (1 << 1)
-+
-+// Loongarch SIMD extension.
-+#define AV_CPU_FLAG_LSX (1 << 0)
-+#define AV_CPU_FLAG_LASX (1 << 1)
-+
-+// RISC-V extensions
-+#define AV_CPU_FLAG_RVI (1 << 0)        ///< I (full GPR bank)
-+#define AV_CPU_FLAG_RVF (1 << 1)        ///< F (single precision FP)
-+#define AV_CPU_FLAG_RVD (1 << 2)        ///< D (double precision FP)
-+#define AV_CPU_FLAG_RVV_I32 (1 << 3)    ///< Vectors of 8/16/32-bit int's */
-+#define AV_CPU_FLAG_RVV_F32 (1 << 4)    ///< Vectors of float's */
-+#define AV_CPU_FLAG_RVV_I64 (1 << 5)    ///< Vectors of 64-bit int's */
-+#define AV_CPU_FLAG_RVV_F64 (1 << 6)    ///< Vectors of double's
-+#define AV_CPU_FLAG_RVB_BASIC (1 << 7)  ///< Basic bit-manipulations
-+#define AV_CPU_FLAG_RVB_ADDR (1 << 8)   ///< Address bit-manipulations
-+
-+/**
-+ * Return the flags which specify extensions supported by the CPU.
-+ * The returned value is affected by av_force_cpu_flags() if that was used
-+ * before. So av_get_cpu_flags() can easily be used in an application to
-+ * detect the enabled cpu flags.
-+ */
-+int av_get_cpu_flags(void);
-+
-+/**
-+ * Disables cpu detection and forces the specified flags.
-+ * -1 is a special case that disables forcing of specific flags.
-+ */
-+void av_force_cpu_flags(int flags);
-+
-+/**
-+ * Parse CPU caps from a string and update the given AV_CPU_* flags based on
-+ * that.
-+ *
-+ * @return negative on error.
-+ */
-+int av_parse_cpu_caps(unsigned* flags, const char* s);
-+
-+/**
-+ * @return the number of logical CPU cores present.
-+ */
-+int av_cpu_count(void);
-+
-+/**
-+ * Overrides cpu count detection and forces the specified count.
-+ * Count < 1 disables forcing of specific count.
-+ */
-+void av_cpu_force_count(int count);
-+
-+/**
-+ * Get the maximum data alignment that may be required by FFmpeg.
-+ *
-+ * Note that this is affected by the build configuration and the CPU flags mask,
-+ * so e.g. if the CPU supports AVX, but libavutil has been built with
-+ * --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through
-+ *  av_set_cpu_flags_mask(), then this function will behave as if AVX is not
-+ *  present.
-+ */
-+size_t av_cpu_max_align(void);
-+
-+#endif /* AVUTIL_CPU_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/dict.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/dict.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/dict.h
-@@ -0,0 +1,259 @@
-+/*
-+ * 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
-+ * Public dictionary API.
-+ * @deprecated
-+ *  AVDictionary is provided for compatibility with libav. It is both in
-+ *  implementation as well as API inefficient. It does not scale and is
-+ *  extremely slow with large dictionaries.
-+ *  It is recommended that new code uses our tree container from tree.c/h
-+ *  where applicable, which uses AVL trees to achieve O(log n) performance.
-+ */
-+
-+#ifndef AVUTIL_DICT_H
-+#define AVUTIL_DICT_H
-+
-+#include <stdint.h>
-+
-+/**
-+ * @addtogroup lavu_dict AVDictionary
-+ * @ingroup lavu_data
-+ *
-+ * @brief Simple key:value store
-+ *
-+ * @{
-+ * Dictionaries are used for storing key-value pairs.
-+ *
-+ * - To **create an AVDictionary**, simply pass an address of a NULL
-+ *   pointer to av_dict_set(). NULL can be used as an empty dictionary
-+ *   wherever a pointer to an AVDictionary is required.
-+ * - To **insert an entry**, use av_dict_set().
-+ * - Use av_dict_get() to **retrieve an entry**.
-+ * - To **iterate over all entries**, use av_dict_iterate().
-+ * - In order to **free the dictionary and all its contents**, use
-+ av_dict_free().
-+ *
-+ @code
-+   AVDictionary *d = NULL;           // "create" an empty dictionary
-+   AVDictionaryEntry *t = NULL;
-+
-+   av_dict_set(&d, "foo", "bar", 0); // add an entry
-+
-+   char *k = av_strdup("key");       // if your strings are already allocated,
-+   char *v = av_strdup("value");     // you can avoid copying them like this
-+   av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
-+
-+   while ((t = av_dict_iterate(d, t))) {
-+       <....>                        // iterate over all entries in d
-+   }
-+   av_dict_free(&d);
-+ @endcode
-+ */
-+
-+/**
-+ * @name AVDictionary Flags
-+ * Flags that influence behavior of the matching of keys or insertion to the
-+ * dictionary.
-+ * @{
-+ */
-+#define AV_DICT_MATCH_CASE                                             \
-+  1 /**< Only get an entry with exact-case key match. Only relevant in \
-+       av_dict_get(). */
-+#define AV_DICT_IGNORE_SUFFIX                                               \
-+  2 /**< Return first entry in a dictionary whose first part corresponds to \
-+       the search key, ignoring the suffix of the found key string. Only                          \
-+       relevant in av_dict_get(). */
-+#define AV_DICT_DONT_STRDUP_KEY              \
-+  4 /**< Take ownership of a key that's been \
-+         allocated with av_malloc() or another memory allocation function. */
-+#define AV_DICT_DONT_STRDUP_VAL                                              \
-+  8                               /**< Take ownership of a value that's been \
-+                                       allocated with av_malloc() or another memory allocation function. */
-+#define AV_DICT_DONT_OVERWRITE 16 /**< Don't overwrite existing entries. */
-+#define AV_DICT_APPEND                                             \
-+  32 /**< If the entry already exists, append to it.  Note that no \
-+          delimiter is added, the strings are simply concatenated. */
-+#define AV_DICT_MULTIKEY \
-+  64 /**< Allow to store several equal keys in the dictionary */
-+/**
-+ * @}
-+ */
-+
-+typedef struct AVDictionaryEntry {
-+  char* key;
-+  char* value;
-+} AVDictionaryEntry;
-+
-+typedef struct AVDictionary AVDictionary;
-+
-+/**
-+ * Get a dictionary entry with matching key.
-+ *
-+ * The returned entry key or value must not be changed, or it will
-+ * cause undefined behavior.
-+ *
-+ * @param prev  Set to the previous matching element to find the next.
-+ *              If set to NULL the first matching element is returned.
-+ * @param key   Matching key
-+ * @param flags A collection of AV_DICT_* flags controlling how the
-+ *              entry is retrieved
-+ *
-+ * @return      Found entry or NULL in case no matching entry was found in the
-+ * dictionary
-+ */
-+AVDictionaryEntry* av_dict_get(const AVDictionary* m, const char* key,
-+                               const AVDictionaryEntry* prev, int flags);
-+
-+/**
-+ * Iterate over a dictionary
-+ *
-+ * Iterates through all entries in the dictionary.
-+ *
-+ * @warning The returned AVDictionaryEntry key/value must not be changed.
-+ *
-+ * @warning As av_dict_set() invalidates all previous entries returned
-+ * by this function, it must not be called while iterating over the dict.
-+ *
-+ * Typical usage:
-+ * @code
-+ * const AVDictionaryEntry *e = NULL;
-+ * while ((e = av_dict_iterate(m, e))) {
-+ *     // ...
-+ * }
-+ * @endcode
-+ *
-+ * @param m     The dictionary to iterate over
-+ * @param prev  Pointer to the previous AVDictionaryEntry, NULL initially
-+ *
-+ * @retval AVDictionaryEntry* The next element in the dictionary
-+ * @retval NULL               No more elements in the dictionary
-+ */
-+const AVDictionaryEntry* av_dict_iterate(const AVDictionary* m,
-+                                         const AVDictionaryEntry* prev);
-+
-+/**
-+ * Get number of entries in dictionary.
-+ *
-+ * @param m dictionary
-+ * @return  number of entries in dictionary
-+ */
-+int av_dict_count(const AVDictionary* m);
-+
-+/**
-+ * Set the given entry in *pm, overwriting an existing entry.
-+ *
-+ * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set,
-+ * these arguments will be freed on error.
-+ *
-+ * @warning Adding a new entry to a dictionary invalidates all existing entries
-+ * previously returned with av_dict_get() or av_dict_iterate().
-+ *
-+ * @param pm        Pointer to a pointer to a dictionary struct. If *pm is NULL
-+ *                  a dictionary struct is allocated and put in *pm.
-+ * @param key       Entry key to add to *pm (will either be av_strduped or added
-+ * as a new key depending on flags)
-+ * @param value     Entry value to add to *pm (will be av_strduped or added as a
-+ * new key depending on flags). Passing a NULL value will cause an existing
-+ * entry to be deleted.
-+ *
-+ * @return          >= 0 on success otherwise an error code <0
-+ */
-+int av_dict_set(AVDictionary** pm, const char* key, const char* value,
-+                int flags);
-+
-+/**
-+ * Convenience wrapper for av_dict_set() that converts the value to a string
-+ * and stores it.
-+ *
-+ * Note: If ::AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error.
-+ */
-+int av_dict_set_int(AVDictionary** pm, const char* key, int64_t value,
-+                    int flags);
-+
-+/**
-+ * Parse the key/value pairs list and add the parsed entries to a dictionary.
-+ *
-+ * In case of failure, all the successfully set entries are stored in
-+ * *pm. You may need to manually free the created dictionary.
-+ *
-+ * @param key_val_sep  A 0-terminated list of characters used to separate
-+ *                     key from value
-+ * @param pairs_sep    A 0-terminated list of characters used to separate
-+ *                     two pairs from each other
-+ * @param flags        Flags to use when adding to the dictionary.
-+ *                     ::AV_DICT_DONT_STRDUP_KEY and ::AV_DICT_DONT_STRDUP_VAL
-+ *                     are ignored since the key/value tokens will always
-+ *                     be duplicated.
-+ *
-+ * @return             0 on success, negative AVERROR code on failure
-+ */
-+int av_dict_parse_string(AVDictionary** pm, const char* str,
-+                         const char* key_val_sep, const char* pairs_sep,
-+                         int flags);
-+
-+/**
-+ * Copy entries from one AVDictionary struct into another.
-+ *
-+ * @note Metadata is read using the ::AV_DICT_IGNORE_SUFFIX flag
-+ *
-+ * @param dst   Pointer to a pointer to a AVDictionary struct to copy into. If
-+ * *dst is NULL, this function will allocate a struct for you and put it in *dst
-+ * @param src   Pointer to the source AVDictionary struct to copy items from.
-+ * @param flags Flags to use when setting entries in *dst
-+ *
-+ * @return 0 on success, negative AVERROR code on failure. If dst was allocated
-+ *           by this function, callers should free the associated memory.
-+ */
-+int av_dict_copy(AVDictionary** dst, const AVDictionary* src, int flags);
-+
-+/**
-+ * Free all the memory allocated for an AVDictionary struct
-+ * and all keys and values.
-+ */
-+void av_dict_free(AVDictionary** m);
-+
-+/**
-+ * Get dictionary entries as a string.
-+ *
-+ * Create a string containing dictionary's entries.
-+ * Such string may be passed back to av_dict_parse_string().
-+ * @note String is escaped with backslashes ('\').
-+ *
-+ * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the
-+ * same.
-+ *
-+ * @param[in]  m             The dictionary
-+ * @param[out] buffer        Pointer to buffer that will be allocated with
-+ * string containg entries. Buffer must be freed by the caller when is no longer
-+ * needed.
-+ * @param[in]  key_val_sep   Character used to separate key from value
-+ * @param[in]  pairs_sep     Character used to separate two pairs from each
-+ * other
-+ *
-+ * @return                   >= 0 on success, negative on error
-+ */
-+int av_dict_get_string(const AVDictionary* m, char** buffer,
-+                       const char key_val_sep, const char pairs_sep);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_DICT_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/error.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/error.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/error.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
-+ */
-+
-+/**
-+ * @file
-+ * error code definitions
-+ */
-+
-+#ifndef AVUTIL_ERROR_H
-+#define AVUTIL_ERROR_H
-+
-+#include <errno.h>
-+#include <stddef.h>
-+
-+#include "macros.h"
-+
-+/**
-+ * @addtogroup lavu_error
-+ *
-+ * @{
-+ */
-+
-+/* error handling */
-+#if EDOM > 0
-+#  define AVERROR(e) \
-+    (-(e))  ///< Returns a negative error code from a POSIX error code, to
-+            ///< return from library functions.
-+#  define AVUNERROR(e) \
-+    (-(e))  ///< Returns a POSIX error code from a library function error return
-+            ///< value.
-+#else
-+/* Some platforms have E* and errno already negated. */
-+#  define AVERROR(e) (e)
-+#  define AVUNERROR(e) (e)
-+#endif
-+
-+#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d))
-+
-+#define AVERROR_BSF_NOT_FOUND \
-+  FFERRTAG(0xF8, 'B', 'S', 'F')  ///< Bitstream filter not found
-+#define AVERROR_BUG \
-+  FFERRTAG('B', 'U', 'G', '!')  ///< Internal bug, also see AVERROR_BUG2
-+#define AVERROR_BUFFER_TOO_SMALL \
-+  FFERRTAG('B', 'U', 'F', 'S')  ///< Buffer too small
-+#define AVERROR_DECODER_NOT_FOUND \
-+  FFERRTAG(0xF8, 'D', 'E', 'C')  ///< Decoder not found
-+#define AVERROR_DEMUXER_NOT_FOUND \
-+  FFERRTAG(0xF8, 'D', 'E', 'M')  ///< Demuxer not found
-+#define AVERROR_ENCODER_NOT_FOUND \
-+  FFERRTAG(0xF8, 'E', 'N', 'C')                   ///< Encoder not found
-+#define AVERROR_EOF FFERRTAG('E', 'O', 'F', ' ')  ///< End of file
-+#define AVERROR_EXIT \
-+  FFERRTAG('E', 'X', 'I', 'T')  ///< Immediate exit was requested; the called
-+                                ///< function should not be restarted
-+#define AVERROR_EXTERNAL \
-+  FFERRTAG('E', 'X', 'T', ' ')  ///< Generic error in an external library
-+#define AVERROR_FILTER_NOT_FOUND \
-+  FFERRTAG(0xF8, 'F', 'I', 'L')  ///< Filter not found
-+#define AVERROR_INVALIDDATA \
-+  FFERRTAG('I', 'N', 'D', 'A')  ///< Invalid data found when processing input
-+#define AVERROR_MUXER_NOT_FOUND \
-+  FFERRTAG(0xF8, 'M', 'U', 'X')  ///< Muxer not found
-+#define AVERROR_OPTION_NOT_FOUND \
-+  FFERRTAG(0xF8, 'O', 'P', 'T')  ///< Option not found
-+#define AVERROR_PATCHWELCOME \
-+  FFERRTAG('P', 'A', 'W',    \
-+           'E')  ///< Not yet implemented in FFmpeg, patches welcome
-+#define AVERROR_PROTOCOL_NOT_FOUND \
-+  FFERRTAG(0xF8, 'P', 'R', 'O')  ///< Protocol not found
-+
-+#define AVERROR_STREAM_NOT_FOUND \
-+  FFERRTAG(0xF8, 'S', 'T', 'R')  ///< Stream not found
-+/**
-+ * This is semantically identical to AVERROR_BUG
-+ * it has been introduced in Libav after our AVERROR_BUG and with a modified
-+ * value.
-+ */
-+#define AVERROR_BUG2 FFERRTAG('B', 'U', 'G', ' ')
-+#define AVERROR_UNKNOWN   \
-+  FFERRTAG('U', 'N', 'K', \
-+           'N')  ///< Unknown error, typically from an external library
-+#define AVERROR_EXPERIMENTAL \
-+  (-0x2bb2afa8)  ///< Requested feature is flagged experimental. Set
-+                 ///< strict_std_compliance if you really want to use it.
-+#define AVERROR_INPUT_CHANGED \
-+  (-0x636e6701)  ///< Input changed between calls. Reconfiguration is required.
-+                 ///< (can be OR-ed with AVERROR_OUTPUT_CHANGED)
-+#define AVERROR_OUTPUT_CHANGED \
-+  (-0x636e6702)  ///< Output changed between calls. Reconfiguration is required.
-+                 ///< (can be OR-ed with AVERROR_INPUT_CHANGED)
-+/* HTTP & RTSP errors */
-+#define AVERROR_HTTP_BAD_REQUEST FFERRTAG(0xF8, '4', '0', '0')
-+#define AVERROR_HTTP_UNAUTHORIZED FFERRTAG(0xF8, '4', '0', '1')
-+#define AVERROR_HTTP_FORBIDDEN FFERRTAG(0xF8, '4', '0', '3')
-+#define AVERROR_HTTP_NOT_FOUND FFERRTAG(0xF8, '4', '0', '4')
-+#define AVERROR_HTTP_OTHER_4XX FFERRTAG(0xF8, '4', 'X', 'X')
-+#define AVERROR_HTTP_SERVER_ERROR FFERRTAG(0xF8, '5', 'X', 'X')
-+
-+#define AV_ERROR_MAX_STRING_SIZE 64
-+
-+/**
-+ * Put a description of the AVERROR code errnum in errbuf.
-+ * In case of failure the global variable errno is set to indicate the
-+ * error. Even in case of failure av_strerror() will print a generic
-+ * error message indicating the errnum provided to errbuf.
-+ *
-+ * @param errnum      error code to describe
-+ * @param errbuf      buffer to which description is written
-+ * @param errbuf_size the size in bytes of errbuf
-+ * @return 0 on success, a negative value if a description for errnum
-+ * cannot be found
-+ */
-+int av_strerror(int errnum, char* errbuf, size_t errbuf_size);
-+
-+/**
-+ * Fill the provided buffer with a string containing an error string
-+ * corresponding to the AVERROR code errnum.
-+ *
-+ * @param errbuf         a buffer
-+ * @param errbuf_size    size in bytes of errbuf
-+ * @param errnum         error code to describe
-+ * @return the buffer in input, filled with the error description
-+ * @see av_strerror()
-+ */
-+static inline char* av_make_error_string(char* errbuf, size_t errbuf_size,
-+                                         int errnum) {
-+  av_strerror(errnum, errbuf, errbuf_size);
-+  return errbuf;
-+}
-+
-+/**
-+ * Convenience macro, the return value should be used only directly in
-+ * function arguments but never stand-alone.
-+ */
-+#define av_err2str(errnum)                                  \
-+  av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, \
-+                       AV_ERROR_MAX_STRING_SIZE, errnum)
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_ERROR_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/frame.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/frame.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/frame.h
-@@ -0,0 +1,1112 @@
-+/*
-+ * 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
-+ * @ingroup lavu_frame
-+ * reference-counted frame API
-+ */
-+
-+#ifndef AVUTIL_FRAME_H
-+#define AVUTIL_FRAME_H
-+
-+#include <stddef.h>
-+#include <stdint.h>
-+
-+#include "avutil.h"
-+#include "buffer.h"
-+#include "channel_layout.h"
-+#include "dict.h"
-+#include "rational.h"
-+#include "samplefmt.h"
-+#include "pixfmt.h"
-+#include "version.h"
-+
-+/**
-+ * @defgroup lavu_frame AVFrame
-+ * @ingroup lavu_data
-+ *
-+ * @{
-+ * AVFrame is an abstraction for reference-counted raw multimedia data.
-+ */
-+
-+enum AVFrameSideDataType {
-+  /**
-+   * The data is the AVPanScan struct defined in libavcodec.
-+   */
-+  AV_FRAME_DATA_PANSCAN,
-+  /**
-+   * ATSC A53 Part 4 Closed Captions.
-+   * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data.
-+   * The number of bytes of CC data is AVFrameSideData.size.
-+   */
-+  AV_FRAME_DATA_A53_CC,
-+  /**
-+   * Stereoscopic 3d metadata.
-+   * The data is the AVStereo3D struct defined in libavutil/stereo3d.h.
-+   */
-+  AV_FRAME_DATA_STEREO3D,
-+  /**
-+   * The data is the AVMatrixEncoding enum defined in
-+   * libavutil/channel_layout.h.
-+   */
-+  AV_FRAME_DATA_MATRIXENCODING,
-+  /**
-+   * Metadata relevant to a downmix procedure.
-+   * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h.
-+   */
-+  AV_FRAME_DATA_DOWNMIX_INFO,
-+  /**
-+   * ReplayGain information in the form of the AVReplayGain struct.
-+   */
-+  AV_FRAME_DATA_REPLAYGAIN,
-+  /**
-+   * This side data contains a 3x3 transformation matrix describing an affine
-+   * transformation that needs to be applied to the frame for correct
-+   * presentation.
-+   *
-+   * See libavutil/display.h for a detailed description of the data.
-+   */
-+  AV_FRAME_DATA_DISPLAYMATRIX,
-+  /**
-+   * Active Format Description data consisting of a single byte as specified
-+   * in ETSI TS 101 154 using AVActiveFormatDescription enum.
-+   */
-+  AV_FRAME_DATA_AFD,
-+  /**
-+   * Motion vectors exported by some codecs (on demand through the export_mvs
-+   * flag set in the libavcodec AVCodecContext flags2 option).
-+   * The data is the AVMotionVector struct defined in
-+   * libavutil/motion_vector.h.
-+   */
-+  AV_FRAME_DATA_MOTION_VECTORS,
-+  /**
-+   * Recommmends skipping the specified number of samples. This is exported
-+   * only if the "skip_manual" AVOption is set in libavcodec.
-+   * This has the same format as AV_PKT_DATA_SKIP_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_FRAME_DATA_SKIP_SAMPLES,
-+  /**
-+   * This side data must be associated with an audio frame and corresponds to
-+   * enum AVAudioServiceType defined in avcodec.h.
-+   */
-+  AV_FRAME_DATA_AUDIO_SERVICE_TYPE,
-+  /**
-+   * Mastering display metadata associated with a video frame. The payload is
-+   * an AVMasteringDisplayMetadata type and contains information about the
-+   * mastering display color volume.
-+   */
-+  AV_FRAME_DATA_MASTERING_DISPLAY_METADATA,
-+  /**
-+   * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer.
-+   * This is set on the first frame of a GOP that has a temporal reference of 0.
-+   */
-+  AV_FRAME_DATA_GOP_TIMECODE,
-+
-+  /**
-+   * The data represents the AVSphericalMapping structure defined in
-+   * libavutil/spherical.h.
-+   */
-+  AV_FRAME_DATA_SPHERICAL,
-+
-+  /**
-+   * Content light level (based on CTA-861.3). This payload contains data in
-+   * the form of the AVContentLightMetadata struct.
-+   */
-+  AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
-+
-+  /**
-+   * The data contains an ICC profile as an opaque octet buffer following the
-+   * format described by ISO 15076-1 with an optional name defined in the
-+   * metadata key entry "name".
-+   */
-+  AV_FRAME_DATA_ICC_PROFILE,
-+
-+  /**
-+   * 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 documentation
-+   * of av_timecode_get_smpte_from_framenum() function in libavutil/timecode.h.
-+   */
-+  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,
-+
-+  /**
-+   * Encoding parameters for a video frame, as described by AVVideoEncParams.
-+   */
-+  AV_FRAME_DATA_VIDEO_ENC_PARAMS,
-+
-+  /**
-+   * User data unregistered metadata associated with a video frame.
-+   * This is the H.26[45] UDU SEI message, and shouldn't be used for any other
-+   * purpose The data is stored as uint8_t in AVFrameSideData.data which is 16
-+   * bytes of uuid_iso_iec_11578 followed by AVFrameSideData.size - 16 bytes of
-+   * user_data_payload_byte.
-+   */
-+  AV_FRAME_DATA_SEI_UNREGISTERED,
-+
-+  /**
-+   * Film grain parameters for a frame, described by AVFilmGrainParams.
-+   * Must be present for every frame which should have film grain applied.
-+   *
-+   * May be present multiple times, for example when there are multiple
-+   * alternative parameter sets for different video signal characteristics.
-+   * The user should select the most appropriate set for the application.
-+   */
-+  AV_FRAME_DATA_FILM_GRAIN_PARAMS,
-+
-+  /**
-+   * Bounding boxes for object detection and classification,
-+   * as described by AVDetectionBBoxHeader.
-+   */
-+  AV_FRAME_DATA_DETECTION_BBOXES,
-+
-+  /**
-+   * Dolby Vision RPU raw data, suitable for passing to x265
-+   * or other libraries. Array of uint8_t, with NAL emulation
-+   * bytes intact.
-+   */
-+  AV_FRAME_DATA_DOVI_RPU_BUFFER,
-+
-+  /**
-+   * Parsed Dolby Vision metadata, suitable for passing to a software
-+   * implementation. The payload is the AVDOVIMetadata struct defined in
-+   * libavutil/dovi_meta.h.
-+   */
-+  AV_FRAME_DATA_DOVI_METADATA,
-+
-+  /**
-+   * HDR Vivid dynamic metadata associated with a video frame. The payload is
-+   * an AVDynamicHDRVivid type and contains information for color
-+   * volume transform - CUVA 005.1-2021.
-+   */
-+  AV_FRAME_DATA_DYNAMIC_HDR_VIVID,
-+
-+  /**
-+   * Ambient viewing environment metadata, as defined by H.274.
-+   */
-+  AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT,
-+
-+  /**
-+   * Provide encoder-specific hinting information about changed/unchanged
-+   * portions of a frame.  It can be used to pass information about which
-+   * macroblocks can be skipped because they didn't change from the
-+   * corresponding ones in the previous frame. This could be useful for
-+   * applications which know this information in advance to speed up
-+   * encoding.
-+   */
-+  AV_FRAME_DATA_VIDEO_HINT,
-+};
-+
-+enum AVActiveFormatDescription {
-+  AV_AFD_SAME = 8,
-+  AV_AFD_4_3 = 9,
-+  AV_AFD_16_9 = 10,
-+  AV_AFD_14_9 = 11,
-+  AV_AFD_4_3_SP_14_9 = 13,
-+  AV_AFD_16_9_SP_14_9 = 14,
-+  AV_AFD_SP_4_3 = 15,
-+};
-+
-+/**
-+ * Structure to hold side data for an AVFrame.
-+ *
-+ * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be
-+ * added to the end with a minor bump.
-+ */
-+typedef struct AVFrameSideData {
-+  enum AVFrameSideDataType type;
-+  uint8_t* data;
-+  size_t size;
-+  AVDictionary* metadata;
-+  AVBufferRef* buf;
-+} AVFrameSideData;
-+
-+enum AVSideDataProps {
-+  /**
-+   * The side data type can be used in stream-global structures.
-+   * Side data types without this property are only meaningful on per-frame
-+   * basis.
-+   */
-+  AV_SIDE_DATA_PROP_GLOBAL = (1 << 0),
-+
-+  /**
-+   * Multiple instances of this side data type can be meaningfully present in
-+   * a single side data array.
-+   */
-+  AV_SIDE_DATA_PROP_MULTI = (1 << 1),
-+};
-+
-+/**
-+ * This struct describes the properties of a side data type. Its instance
-+ * corresponding to a given type can be obtained from av_frame_side_data_desc().
-+ */
-+typedef struct AVSideDataDescriptor {
-+  /**
-+   * Human-readable side data description.
-+   */
-+  const char* name;
-+
-+  /**
-+   * Side data property flags, a combination of AVSideDataProps values.
-+   */
-+  unsigned props;
-+} AVSideDataDescriptor;
-+
-+/**
-+ * 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
-+ * allocates the AVFrame itself, the buffers for the data must be managed
-+ * through other means (see below).
-+ * AVFrame must be freed with av_frame_free().
-+ *
-+ * AVFrame is typically allocated once and then reused multiple times to hold
-+ * different data (e.g. a single AVFrame to hold frames received from a
-+ * decoder). In such a case, av_frame_unref() will free any references held by
-+ * the frame and reset it to its original clean state before it
-+ * is reused again.
-+ *
-+ * The data described by an AVFrame is usually reference counted through the
-+ * AVBuffer API. The underlying buffer references are stored in AVFrame.buf /
-+ * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at
-+ * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case,
-+ * every single data plane must be contained in one of the buffers in
-+ * AVFrame.buf or AVFrame.extended_buf.
-+ * There may be a single buffer for all the data, or one separate buffer for
-+ * each plane, or anything in between.
-+ *
-+ * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added
-+ * to the end with a minor bump.
-+ *
-+ * Fields can be accessed through AVOptions, the name string used, matches the
-+ * C structure field name for fields accessible through AVOptions. The AVClass
-+ * for AVFrame can be obtained from avcodec_get_frame_class()
-+ */
-+typedef struct AVFrame {
-+#define AV_NUM_DATA_POINTERS 8
-+  /**
-+   * pointer to the picture/channel planes.
-+   * This might be different from the first allocated byte. For video,
-+   * it could even point to the end of the image data.
-+   *
-+   * All pointers in data and extended_data must point into one of the
-+   * AVBufferRef in buf or extended_buf.
-+   *
-+   * Some decoders access areas outside 0,0 - width,height, please
-+   * see avcodec_align_dimensions2(). Some filters and swscale can read
-+   * up to 16 bytes beyond the planes, if these filters are to be used,
-+   * then 16 extra bytes must be allocated.
-+   *
-+   * NOTE: Pointers not needed by the format MUST be set to NULL.
-+   *
-+   * @attention In case of video, the data[] pointers can point to the
-+   * end of image data in order to reverse line order, when used in
-+   * combination with negative values in the linesize[] array.
-+   */
-+  uint8_t* data[AV_NUM_DATA_POINTERS];
-+
-+  /**
-+   * For video, a positive or negative value, which is typically indicating
-+   * the size in bytes of each picture line, but it can also be:
-+   * - the negative byte size of lines for vertical flipping
-+   *   (with data[n] pointing to the end of the data
-+   * - a positive or negative multiple of the byte size as for accessing
-+   *   even and odd fields of a frame (possibly flipped)
-+   *
-+   * For audio, only linesize[0] may be set. For planar audio, each channel
-+   * plane must be the same size.
-+   *
-+   * For video the linesizes should be multiples of the CPUs alignment
-+   * preference, this is 16 or 32 for modern desktop CPUs.
-+   * Some code requires such alignment other code can be slower without
-+   * correct alignment, for yet other it makes no difference.
-+   *
-+   * @note The linesize may be larger than the size of usable data -- there
-+   * may be extra padding present for performance reasons.
-+   *
-+   * @attention In case of video, line size values can be negative to achieve
-+   * a vertically inverted iteration over image lines.
-+   */
-+  int linesize[AV_NUM_DATA_POINTERS];
-+
-+  /**
-+   * pointers to the data planes/channels.
-+   *
-+   * For video, this should simply point to data[].
-+   *
-+   * For planar audio, each channel has a separate data pointer, and
-+   * linesize[0] contains the size of each channel buffer.
-+   * For packed audio, there is just one data pointer, and linesize[0]
-+   * contains the total size of the buffer for all channels.
-+   *
-+   * Note: Both data and extended_data should always be set in a valid frame,
-+   * but for planar audio with more channels that can fit in data,
-+   * extended_data must be used in order to access all channels.
-+   */
-+  uint8_t** extended_data;
-+
-+  /**
-+   * @name Video dimensions
-+   * Video frames only. The coded dimensions (in pixels) of the video frame,
-+   * i.e. the size of the rectangle that contains some well-defined values.
-+   *
-+   * @note The part of the frame intended for display/presentation is further
-+   * restricted by the @ref cropping "Cropping rectangle".
-+   * @{
-+   */
-+  int width, height;
-+  /**
-+   * @}
-+   */
-+
-+  /**
-+   * number of audio samples (per channel) described by this frame
-+   */
-+  int nb_samples;
-+
-+  /**
-+   * format of the frame, -1 if unknown or unset
-+   * Values correspond to enum AVPixelFormat for video frames,
-+   * enum AVSampleFormat for audio)
-+   */
-+  int format;
-+
-+#if FF_API_FRAME_KEY
-+  /**
-+   * 1 -> keyframe, 0-> not
-+   *
-+   * @deprecated Use AV_FRAME_FLAG_KEY instead
-+   */
-+  attribute_deprecated int key_frame;
-+#endif
-+
-+  /**
-+   * Picture type of the frame.
-+   */
-+  enum AVPictureType pict_type;
-+
-+  /**
-+   * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
-+   */
-+  AVRational sample_aspect_ratio;
-+
-+  /**
-+   * Presentation timestamp in time_base units (time when frame should be shown
-+   * to user).
-+   */
-+  int64_t pts;
-+
-+  /**
-+   * DTS copied from the AVPacket that triggered returning this frame. (if frame
-+   * threading isn't used) This is also the Presentation time of this AVFrame
-+   * calculated from only AVPacket.dts values without pts values.
-+   */
-+  int64_t pkt_dts;
-+
-+  /**
-+   * Time base for the timestamps in this frame.
-+   * In the future, this field may be set on frames output by decoders or
-+   * filters, but its value will be by default ignored on input to encoders
-+   * or filters.
-+   */
-+  AVRational time_base;
-+
-+  /**
-+   * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
-+   */
-+  int quality;
-+
-+  /**
-+   * Frame owner's private data.
-+   *
-+   * This field may be set by the code that allocates/owns the frame data.
-+   * It is then not touched by any library functions, except:
-+   * - it is copied to other references by av_frame_copy_props() (and hence by
-+   *   av_frame_ref());
-+   * - it is set to NULL when the frame is cleared by av_frame_unref()
-+   * - on the caller's explicit request. E.g. libavcodec encoders/decoders
-+   *   will copy this field to/from @ref AVPacket "AVPackets" if the caller sets
-+   *   @ref AV_CODEC_FLAG_COPY_OPAQUE.
-+   *
-+   * @see opaque_ref the reference-counted analogue
-+   */
-+  void* opaque;
-+
-+  /**
-+   * Number of fields in this frame which should be repeated, i.e. the total
-+   * duration of this frame should be repeat_pict + 2 normal field durations.
-+   *
-+   * For interlaced frames this field may be set to 1, which signals that this
-+   * frame should be presented as 3 fields: beginning with the first field (as
-+   * determined by AV_FRAME_FLAG_TOP_FIELD_FIRST being set or not), followed
-+   * by the second field, and then the first field again.
-+   *
-+   * For progressive frames this field may be set to a multiple of 2, which
-+   * signals that this frame's duration should be (repeat_pict + 2) / 2
-+   * normal frame durations.
-+   *
-+   * @note This field is computed from MPEG2 repeat_first_field flag and its
-+   * associated flags, H.264 pic_struct from picture timing SEI, and
-+   * their analogues in other codecs. Typically it should only be used when
-+   * higher-layer timing information is not available.
-+   */
-+  int repeat_pict;
-+
-+#if FF_API_INTERLACED_FRAME
-+  /**
-+   * The content of the picture is interlaced.
-+   *
-+   * @deprecated Use AV_FRAME_FLAG_INTERLACED instead
-+   */
-+  attribute_deprecated int interlaced_frame;
-+
-+  /**
-+   * If the content is interlaced, is top field displayed first.
-+   *
-+   * @deprecated Use AV_FRAME_FLAG_TOP_FIELD_FIRST instead
-+   */
-+  attribute_deprecated int top_field_first;
-+#endif
-+
-+#if FF_API_PALETTE_HAS_CHANGED
-+  /**
-+   * Tell user application that palette has changed from previous frame.
-+   */
-+  attribute_deprecated int palette_has_changed;
-+#endif
-+
-+  /**
-+   * Sample rate of the audio data.
-+   */
-+  int sample_rate;
-+
-+  /**
-+   * AVBuffer references backing the data for this frame. All the pointers in
-+   * data and extended_data must point inside one of the buffers in buf or
-+   * extended_buf. This array must be filled contiguously -- if buf[i] is
-+   * non-NULL then buf[j] must also be non-NULL for all j < i.
-+   *
-+   * There may be at most one AVBuffer per data plane, so for video this array
-+   * always contains all the references. For planar audio with more than
-+   * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in
-+   * this array. Then the extra AVBufferRef pointers are stored in the
-+   * extended_buf array.
-+   */
-+  AVBufferRef* buf[AV_NUM_DATA_POINTERS];
-+
-+  /**
-+   * For planar audio which requires more than AV_NUM_DATA_POINTERS
-+   * AVBufferRef pointers, this array will hold all the references which
-+   * cannot fit into AVFrame.buf.
-+   *
-+   * Note that this is different from AVFrame.extended_data, which always
-+   * contains all the pointers. This array only contains the extra pointers,
-+   * which cannot fit into AVFrame.buf.
-+   *
-+   * This array is always allocated using av_malloc() by whoever constructs
-+   * the frame. It is freed in av_frame_unref().
-+   */
-+  AVBufferRef** extended_buf;
-+  /**
-+   * Number of elements in extended_buf.
-+   */
-+  int nb_extended_buf;
-+
-+  AVFrameSideData** side_data;
-+  int nb_side_data;
-+
-+/**
-+ * @defgroup lavu_frame_flags AV_FRAME_FLAGS
-+ * @ingroup lavu_frame
-+ * Flags describing additional frame properties.
-+ *
-+ * @{
-+ */
-+
-+/**
-+ * The frame data may be corrupted, e.g. due to decoding errors.
-+ */
-+#define AV_FRAME_FLAG_CORRUPT (1 << 0)
-+/**
-+ * A flag to mark frames that are keyframes.
-+ */
-+#define AV_FRAME_FLAG_KEY (1 << 1)
-+/**
-+ * A flag to mark the frames which need to be decoded, but shouldn't be output.
-+ */
-+#define AV_FRAME_FLAG_DISCARD (1 << 2)
-+/**
-+ * A flag to mark frames whose content is interlaced.
-+ */
-+#define AV_FRAME_FLAG_INTERLACED (1 << 3)
-+/**
-+ * A flag to mark frames where the top field is displayed first if the content
-+ * is interlaced.
-+ */
-+#define AV_FRAME_FLAG_TOP_FIELD_FIRST (1 << 4)
-+  /**
-+   * @}
-+   */
-+
-+  /**
-+   * Frame flags, a combination of @ref lavu_frame_flags
-+   */
-+  int flags;
-+
-+  /**
-+   * MPEG vs JPEG YUV range.
-+   * - encoding: Set by user
-+   * - decoding: Set by libavcodec
-+   */
-+  enum AVColorRange color_range;
-+
-+  enum AVColorPrimaries color_primaries;
-+
-+  enum AVColorTransferCharacteristic color_trc;
-+
-+  /**
-+   * YUV colorspace type.
-+   * - encoding: Set by user
-+   * - decoding: Set by libavcodec
-+   */
-+  enum AVColorSpace colorspace;
-+
-+  enum AVChromaLocation chroma_location;
-+
-+  /**
-+   * frame timestamp estimated using various heuristics, in stream time base
-+   * - encoding: unused
-+   * - decoding: set by libavcodec, read by user.
-+   */
-+  int64_t best_effort_timestamp;
-+
-+#if FF_API_FRAME_PKT
-+  /**
-+   * reordered pos from the last AVPacket that has been input into the decoder
-+   * - encoding: unused
-+   * - decoding: Read by user.
-+   * @deprecated use AV_CODEC_FLAG_COPY_OPAQUE to pass through arbitrary user
-+   *             data from packets to frames
-+   */
-+  attribute_deprecated int64_t pkt_pos;
-+#endif
-+
-+  /**
-+   * metadata.
-+   * - encoding: Set by user.
-+   * - decoding: Set by libavcodec.
-+   */
-+  AVDictionary* metadata;
-+
-+  /**
-+   * decode error flags of the frame, set to a combination of
-+   * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there
-+   * were errors during the decoding.
-+   * - encoding: unused
-+   * - decoding: set by libavcodec, read by user.
-+   */
-+  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
-+
-+#if FF_API_FRAME_PKT
-+  /**
-+   * size of the corresponding packet containing the compressed
-+   * frame.
-+   * It is set to a negative value if unknown.
-+   * - encoding: unused
-+   * - decoding: set by libavcodec, read by user.
-+   * @deprecated use AV_CODEC_FLAG_COPY_OPAQUE to pass through arbitrary user
-+   *             data from packets to frames
-+   */
-+  attribute_deprecated int pkt_size;
-+#endif
-+
-+  /**
-+   * For hwaccel-format frames, this should be a reference to the
-+   * AVHWFramesContext describing the frame.
-+   */
-+  AVBufferRef* hw_frames_ctx;
-+
-+  /**
-+   * Frame owner's private data.
-+   *
-+   * This field may be set by the code that allocates/owns the frame data.
-+   * It is then not touched by any library functions, except:
-+   * - a new reference to the underlying buffer is propagated by
-+   *   av_frame_copy_props() (and hence by av_frame_ref());
-+   * - it is unreferenced in av_frame_unref();
-+   * - on the caller's explicit request. E.g. libavcodec encoders/decoders
-+   *   will propagate a new reference to/from @ref AVPacket "AVPackets" if the
-+   *   caller sets @ref AV_CODEC_FLAG_COPY_OPAQUE.
-+   *
-+   * @see opaque the plain pointer analogue
-+   */
-+  AVBufferRef* opaque_ref;
-+
-+  /**
-+   * @anchor cropping
-+   * @name Cropping
-+   * Video frames only. The number of pixels to discard from the the
-+   * top/bottom/left/right border of the frame to obtain the sub-rectangle of
-+   * the frame intended for presentation.
-+   * @{
-+   */
-+  size_t crop_top;
-+  size_t crop_bottom;
-+  size_t crop_left;
-+  size_t crop_right;
-+  /**
-+   * @}
-+   */
-+
-+  /**
-+   * AVBufferRef for internal use by a single libav* library.
-+   * Must not be used to transfer data between libraries.
-+   * Has to be NULL when ownership of the frame leaves the respective library.
-+   *
-+   * Code outside the FFmpeg libs should never check or change the contents of
-+   * the buffer ref.
-+   *
-+   * FFmpeg calls av_buffer_unref() on it when the frame is unreferenced.
-+   * av_frame_copy_props() calls create a new reference with av_buffer_ref()
-+   * for the target frame's private_ref field.
-+   */
-+  AVBufferRef* private_ref;
-+
-+  /**
-+   * Channel layout of the audio data.
-+   */
-+  AVChannelLayout ch_layout;
-+
-+  /**
-+   * Duration of the frame, in the same units as pts. 0 if unknown.
-+   */
-+  int64_t duration;
-+} AVFrame;
-+
-+/**
-+ * Allocate an AVFrame and set its fields to default values.  The resulting
-+ * struct must be freed using av_frame_free().
-+ *
-+ * @return An AVFrame filled with default values or NULL on failure.
-+ *
-+ * @note this only allocates the AVFrame itself, not the data buffers. Those
-+ * must be allocated through other means, e.g. with av_frame_get_buffer() or
-+ * manually.
-+ */
-+AVFrame* av_frame_alloc(void);
-+
-+/**
-+ * Free the frame and any dynamically allocated objects in it,
-+ * e.g. extended_data. If the frame is reference counted, it will be
-+ * unreferenced first.
-+ *
-+ * @param frame frame to be freed. The pointer will be set to NULL.
-+ */
-+void av_frame_free(AVFrame** frame);
-+
-+/**
-+ * Set up a new reference to the data described by the source frame.
-+ *
-+ * Copy frame properties from src to dst and create a new reference for each
-+ * AVBufferRef from src.
-+ *
-+ * If src is not reference counted, new buffers are allocated and the data is
-+ * copied.
-+ *
-+ * @warning: dst MUST have been either unreferenced with av_frame_unref(dst),
-+ *           or newly allocated with av_frame_alloc() before calling this
-+ *           function, or undefined behavior will occur.
-+ *
-+ * @return 0 on success, a negative AVERROR on error
-+ */
-+int av_frame_ref(AVFrame* dst, const AVFrame* src);
-+
-+/**
-+ * Ensure the destination frame refers to the same data described by the source
-+ * frame, either by creating a new reference for each AVBufferRef from src if
-+ * they differ from those in dst, by allocating new buffers and copying data if
-+ * src is not reference counted, or by unrefencing it if src is empty.
-+ *
-+ * Frame properties on dst will be replaced by those from src.
-+ *
-+ * @return 0 on success, a negative AVERROR on error. On error, dst is
-+ *         unreferenced.
-+ */
-+int av_frame_replace(AVFrame* dst, const AVFrame* src);
-+
-+/**
-+ * Create a new frame that references the same data as src.
-+ *
-+ * This is a shortcut for av_frame_alloc()+av_frame_ref().
-+ *
-+ * @return newly created AVFrame on success, NULL on error.
-+ */
-+AVFrame* av_frame_clone(const AVFrame* src);
-+
-+/**
-+ * Unreference all the buffers referenced by frame and reset the frame fields.
-+ */
-+void av_frame_unref(AVFrame* frame);
-+
-+/**
-+ * Move everything contained in src to dst and reset src.
-+ *
-+ * @warning: dst is not unreferenced, but directly overwritten without reading
-+ *           or deallocating its contents. Call av_frame_unref(dst) manually
-+ *           before calling this function to ensure that no memory is leaked.
-+ */
-+void av_frame_move_ref(AVFrame* dst, AVFrame* src);
-+
-+/**
-+ * Allocate new buffer(s) for audio or video data.
-+ *
-+ * The following fields must be set on frame before calling this function:
-+ * - format (pixel format for video, sample format for audio)
-+ * - width and height for video
-+ * - nb_samples and ch_layout for audio
-+ *
-+ * This function will fill AVFrame.data and AVFrame.buf arrays and, if
-+ * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf.
-+ * For planar formats, one buffer will be allocated for each plane.
-+ *
-+ * @warning: if frame already has been allocated, calling this function will
-+ *           leak memory. In addition, undefined behavior can occur in certain
-+ *           cases.
-+ *
-+ * @param frame frame in which to store the new buffers.
-+ * @param align Required buffer size alignment. If equal to 0, alignment will be
-+ *              chosen automatically for the current CPU. It is highly
-+ *              recommended to pass 0 here unless you know what you are doing.
-+ *
-+ * @return 0 on success, a negative AVERROR on error.
-+ */
-+int av_frame_get_buffer(AVFrame* frame, int align);
-+
-+/**
-+ * Check if the frame data is writable.
-+ *
-+ * @return A positive value if the frame data is writable (which is true if and
-+ * only if each of the underlying buffers has only one reference, namely the one
-+ * stored in this frame). Return 0 otherwise.
-+ *
-+ * If 1 is returned the answer is valid until av_buffer_ref() is called on any
-+ * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly).
-+ *
-+ * @see av_frame_make_writable(), av_buffer_is_writable()
-+ */
-+int av_frame_is_writable(AVFrame* frame);
-+
-+/**
-+ * Ensure that the frame data is writable, avoiding data copy if possible.
-+ *
-+ * Do nothing if the frame is writable, allocate new buffers and copy the data
-+ * if it is not. Non-refcounted frames behave as non-writable, i.e. a copy
-+ * is always made.
-+ *
-+ * @return 0 on success, a negative AVERROR on error.
-+ *
-+ * @see av_frame_is_writable(), av_buffer_is_writable(),
-+ * av_buffer_make_writable()
-+ */
-+int av_frame_make_writable(AVFrame* frame);
-+
-+/**
-+ * Copy the frame data from src to dst.
-+ *
-+ * This function does not allocate anything, dst must be already initialized and
-+ * allocated with the same parameters as src.
-+ *
-+ * This function only copies the frame data (i.e. the contents of the data /
-+ * extended data arrays), not any other properties.
-+ *
-+ * @return >= 0 on success, a negative AVERROR on error.
-+ */
-+int av_frame_copy(AVFrame* dst, const AVFrame* src);
-+
-+/**
-+ * Copy only "metadata" fields from src to dst.
-+ *
-+ * Metadata for the purpose of this function are those fields that do not affect
-+ * the data layout in the buffers.  E.g. pts, sample rate (for audio) or sample
-+ * aspect ratio (for video), but not width/height or channel layout.
-+ * Side data is also copied.
-+ */
-+int av_frame_copy_props(AVFrame* dst, const AVFrame* src);
-+
-+/**
-+ * Get the buffer reference a given data plane is stored in.
-+ *
-+ * @param frame the frame to get the plane's buffer from
-+ * @param plane index of the data plane of interest in frame->extended_data.
-+ *
-+ * @return the buffer reference that contains the plane or NULL if the input
-+ * frame is not valid.
-+ */
-+AVBufferRef* av_frame_get_plane_buffer(const AVFrame* frame, int plane);
-+
-+/**
-+ * Add a new side data to a frame.
-+ *
-+ * @param frame a frame to which the side data should be added
-+ * @param type type of the added side data
-+ * @param size size of the side data
-+ *
-+ * @return newly added side data on success, NULL on error
-+ */
-+AVFrameSideData* av_frame_new_side_data(AVFrame* frame,
-+                                        enum AVFrameSideDataType type,
-+                                        size_t size);
-+
-+/**
-+ * Add a new side data to a frame from an existing AVBufferRef
-+ *
-+ * @param frame a frame to which the side data should be added
-+ * @param type  the type of the added side data
-+ * @param buf   an AVBufferRef to add as side data. The ownership of
-+ *              the reference is transferred to the frame.
-+ *
-+ * @return newly added side data on success, NULL on error. On failure
-+ *         the frame is unchanged and the AVBufferRef remains owned by
-+ *         the caller.
-+ */
-+AVFrameSideData* av_frame_new_side_data_from_buf(AVFrame* frame,
-+                                                 enum AVFrameSideDataType type,
-+                                                 AVBufferRef* buf);
-+
-+/**
-+ * @return a pointer to the side data of a given type on success, NULL if there
-+ * is no side data with such type in this frame.
-+ */
-+AVFrameSideData* av_frame_get_side_data(const AVFrame* frame,
-+                                        enum AVFrameSideDataType type);
-+
-+/**
-+ * Remove and free all side data instances of the given type.
-+ */
-+void av_frame_remove_side_data(AVFrame* frame, enum AVFrameSideDataType type);
-+
-+/**
-+ * Flags for frame cropping.
-+ */
-+enum {
-+  /**
-+   * Apply the maximum possible cropping, even if it requires setting the
-+   * AVFrame.data[] entries to unaligned pointers. Passing unaligned data
-+   * to FFmpeg API is generally not allowed, and causes undefined behavior
-+   * (such as crashes). You can pass unaligned data only to FFmpeg APIs that
-+   * are explicitly documented to accept it. Use this flag only if you
-+   * absolutely know what you are doing.
-+   */
-+  AV_FRAME_CROP_UNALIGNED = 1 << 0,
-+};
-+
-+/**
-+ * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/
-+ * crop_bottom fields. If cropping is successful, the function will adjust the
-+ * data pointers and the width/height fields, and set the crop fields to 0.
-+ *
-+ * In all cases, the cropping boundaries will be rounded to the inherent
-+ * alignment of the pixel format. In some cases, such as for opaque hwaccel
-+ * formats, the left/top cropping is ignored. The crop fields are set to 0 even
-+ * if the cropping was rounded or ignored.
-+ *
-+ * @param frame the frame which should be cropped
-+ * @param flags Some combination of AV_FRAME_CROP_* flags, or 0.
-+ *
-+ * @return >= 0 on success, a negative AVERROR on error. If the cropping fields
-+ * were invalid, AVERROR(ERANGE) is returned, and nothing is changed.
-+ */
-+int av_frame_apply_cropping(AVFrame* frame, int flags);
-+
-+/**
-+ * @return a string identifying the side data type
-+ */
-+const char* av_frame_side_data_name(enum AVFrameSideDataType type);
-+
-+/**
-+ * @return side data descriptor corresponding to a given side data type, NULL
-+ *         when not available.
-+ */
-+const AVSideDataDescriptor* av_frame_side_data_desc(
-+    enum AVFrameSideDataType type);
-+
-+/**
-+ * Free all side data entries and their contents, then zeroes out the
-+ * values which the pointers are pointing to.
-+ *
-+ * @param sd    pointer to array of side data to free. Will be set to NULL
-+ *              upon return.
-+ * @param nb_sd pointer to an integer containing the number of entries in
-+ *              the array. Will be set to 0 upon return.
-+ */
-+void av_frame_side_data_free(AVFrameSideData*** sd, int* nb_sd);
-+
-+#define AV_FRAME_SIDE_DATA_FLAG_UNIQUE (1 << 0)
-+
-+/**
-+ * Add new side data entry to an array.
-+ *
-+ * @param sd    pointer to array of side data to which to add another entry,
-+ *              or to NULL in order to start a new array.
-+ * @param nb_sd pointer to an integer containing the number of entries in
-+ *              the array.
-+ * @param type  type of the added side data
-+ * @param size  size of the side data
-+ * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.
-+ *
-+ * @return newly added side data on success, NULL on error. In case of
-+ *         AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of matching
-+ *         AVFrameSideDataType will be removed before the addition is
-+ *         attempted.
-+ */
-+AVFrameSideData* av_frame_side_data_new(AVFrameSideData*** sd, int* nb_sd,
-+                                        enum AVFrameSideDataType type,
-+                                        size_t size, unsigned int flags);
-+
-+/**
-+ * Add a new side data entry to an array based on existing side data, taking
-+ * a reference towards the contained AVBufferRef.
-+ *
-+ * @param sd    pointer to array of side data to which to add another entry,
-+ *              or to NULL in order to start a new array.
-+ * @param nb_sd pointer to an integer containing the number of entries in
-+ *              the array.
-+ * @param src   side data to be cloned, with a new reference utilized
-+ *              for the buffer.
-+ * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.
-+ *
-+ * @return negative error code on failure, >=0 on success. In case of
-+ *         AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of matching
-+ *         AVFrameSideDataType will be removed before the addition is
-+ *         attempted.
-+ */
-+int av_frame_side_data_clone(AVFrameSideData*** sd, int* nb_sd,
-+                             const AVFrameSideData* src, unsigned int flags);
-+
-+/**
-+ * Get a side data entry of a specific type from an array.
-+ *
-+ * @param sd    array of side data.
-+ * @param nb_sd integer containing the number of entries in the array.
-+ * @param type  type of side data to be queried
-+ *
-+ * @return a pointer to the side data of a given type on success, NULL if there
-+ *         is no side data with such type in this set.
-+ */
-+const AVFrameSideData* av_frame_side_data_get_c(
-+    const AVFrameSideData* const* sd, const int nb_sd,
-+    enum AVFrameSideDataType type);
-+
-+/**
-+ * Wrapper around av_frame_side_data_get_c() to workaround the limitation
-+ * that for any type T the conversion from T * const * to const T * const *
-+ * is not performed automatically in C.
-+ * @see av_frame_side_data_get_c()
-+ */
-+static inline const AVFrameSideData* av_frame_side_data_get(
-+    AVFrameSideData* const* sd, const int nb_sd,
-+    enum AVFrameSideDataType type) {
-+  return av_frame_side_data_get_c((const AVFrameSideData* const*)sd, nb_sd,
-+                                  type);
-+}
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_FRAME_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/hwcontext.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/hwcontext.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/hwcontext.h
-@@ -0,0 +1,594 @@
-+/*
-+ * 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_H
-+#define AVUTIL_HWCONTEXT_H
-+
-+#include "buffer.h"
-+#include "frame.h"
-+#include "log.h"
-+#include "pixfmt.h"
-+
-+enum AVHWDeviceType {
-+  AV_HWDEVICE_TYPE_NONE,
-+  AV_HWDEVICE_TYPE_VDPAU,
-+  AV_HWDEVICE_TYPE_CUDA,
-+  AV_HWDEVICE_TYPE_VAAPI,
-+  AV_HWDEVICE_TYPE_DXVA2,
-+  AV_HWDEVICE_TYPE_QSV,
-+  AV_HWDEVICE_TYPE_VIDEOTOOLBOX,
-+  AV_HWDEVICE_TYPE_D3D11VA,
-+  AV_HWDEVICE_TYPE_DRM,
-+  AV_HWDEVICE_TYPE_OPENCL,
-+  AV_HWDEVICE_TYPE_MEDIACODEC,
-+  AV_HWDEVICE_TYPE_VULKAN,
-+  AV_HWDEVICE_TYPE_D3D12VA,
-+};
-+
-+/**
-+ * This struct aggregates all the (hardware/vendor-specific) "high-level" state,
-+ * i.e. state that is not tied to a concrete processing configuration.
-+ * E.g., in an API that supports hardware-accelerated encoding and decoding,
-+ * this struct will (if possible) wrap the state that is common to both encoding
-+ * and decoding and from which specific instances of encoders or decoders can be
-+ * derived.
-+ *
-+ * This struct is reference-counted with the AVBuffer mechanism. The
-+ * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field
-+ * points to the actual AVHWDeviceContext. Further objects derived from
-+ * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with
-+ * specific properties) will hold an internal reference to it. After all the
-+ * references are released, the AVHWDeviceContext itself will be freed,
-+ * optionally invoking a user-specified callback for uninitializing the hardware
-+ * state.
-+ */
-+typedef struct AVHWDeviceContext {
-+  /**
-+   * A class for logging. Set by av_hwdevice_ctx_alloc().
-+   */
-+  const AVClass* av_class;
-+
-+  /**
-+   * This field identifies the underlying API used for hardware access.
-+   *
-+   * This field is set when this struct is allocated and never changed
-+   * afterwards.
-+   */
-+  enum AVHWDeviceType type;
-+
-+  /**
-+   * The format-specific data, allocated and freed by libavutil along with
-+   * this context.
-+   *
-+   * Should be cast by the user to the format-specific context defined in the
-+   * corresponding header (hwcontext_*.h) and filled as described in the
-+   * documentation before calling av_hwdevice_ctx_init().
-+   *
-+   * After calling av_hwdevice_ctx_init() this struct should not be modified
-+   * by the caller.
-+   */
-+  void* hwctx;
-+
-+  /**
-+   * This field may be set by the caller before calling av_hwdevice_ctx_init().
-+   *
-+   * If non-NULL, this callback will be called when the last reference to
-+   * this context is unreferenced, immediately before it is freed.
-+   *
-+   * @note when other objects (e.g an AVHWFramesContext) are derived from this
-+   *       struct, this callback will be invoked after all such child objects
-+   *       are fully uninitialized and their respective destructors invoked.
-+   */
-+  void (*free)(struct AVHWDeviceContext* ctx);
-+
-+  /**
-+   * Arbitrary user data, to be used e.g. by the free() callback.
-+   */
-+  void* user_opaque;
-+} AVHWDeviceContext;
-+
-+/**
-+ * This struct describes a set or pool of "hardware" frames (i.e. those with
-+ * data not located in normal system memory). All the frames in the pool are
-+ * assumed to be allocated in the same way and interchangeable.
-+ *
-+ * This struct is reference-counted with the AVBuffer mechanism and tied to a
-+ * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor
-+ * yields a reference, whose data field points to the actual AVHWFramesContext
-+ * struct.
-+ */
-+typedef struct AVHWFramesContext {
-+  /**
-+   * A class for logging.
-+   */
-+  const AVClass* av_class;
-+
-+  /**
-+   * A reference to the parent AVHWDeviceContext. This reference is owned and
-+   * managed by the enclosing AVHWFramesContext, but the caller may derive
-+   * additional references from it.
-+   */
-+  AVBufferRef* device_ref;
-+
-+  /**
-+   * The parent AVHWDeviceContext. This is simply a pointer to
-+   * device_ref->data provided for convenience.
-+   *
-+   * Set by libavutil in av_hwframe_ctx_init().
-+   */
-+  AVHWDeviceContext* device_ctx;
-+
-+  /**
-+   * The format-specific data, allocated and freed automatically along with
-+   * this context.
-+   *
-+   * The user shall ignore this field if the corresponding format-specific
-+   * header (hwcontext_*.h) does not define a context to be used as
-+   * AVHWFramesContext.hwctx.
-+   *
-+   * Otherwise, it should be cast by the user to said context and filled
-+   * as described in the documentation before calling av_hwframe_ctx_init().
-+   *
-+   * After any frames using this context are created, the contents of this
-+   * struct should not be modified by the caller.
-+   */
-+  void* hwctx;
-+
-+  /**
-+   * This field may be set by the caller before calling av_hwframe_ctx_init().
-+   *
-+   * If non-NULL, this callback will be called when the last reference to
-+   * this context is unreferenced, immediately before it is freed.
-+   */
-+  void (*free)(struct AVHWFramesContext* ctx);
-+
-+  /**
-+   * Arbitrary user data, to be used e.g. by the free() callback.
-+   */
-+  void* user_opaque;
-+
-+  /**
-+   * A pool from which the frames are allocated by av_hwframe_get_buffer().
-+   * This field may be set by the caller before calling av_hwframe_ctx_init().
-+   * The buffers returned by calling av_buffer_pool_get() on this pool must
-+   * have the properties described in the documentation in the corresponding hw
-+   * type's header (hwcontext_*.h). The pool will be freed strictly before
-+   * this struct's free() callback is invoked.
-+   *
-+   * This field may be NULL, then libavutil will attempt to allocate a pool
-+   * internally. Note that certain device types enforce pools allocated at
-+   * fixed size (frame count), which cannot be extended dynamically. In such a
-+   * case, initial_pool_size must be set appropriately.
-+   */
-+  AVBufferPool* pool;
-+
-+  /**
-+   * Initial size of the frame pool. If a device type does not support
-+   * dynamically resizing the pool, then this is also the maximum pool size.
-+   *
-+   * May be set by the caller before calling av_hwframe_ctx_init(). Must be
-+   * set if pool is NULL and the device type does not support dynamic pools.
-+   */
-+  int initial_pool_size;
-+
-+  /**
-+   * The pixel format identifying the underlying HW surface type.
-+   *
-+   * Must be a hwaccel format, i.e. the corresponding descriptor must have the
-+   * AV_PIX_FMT_FLAG_HWACCEL flag set.
-+   *
-+   * Must be set by the user before calling av_hwframe_ctx_init().
-+   */
-+  enum AVPixelFormat format;
-+
-+  /**
-+   * The pixel format identifying the actual data layout of the hardware
-+   * frames.
-+   *
-+   * Must be set by the caller before calling av_hwframe_ctx_init().
-+   *
-+   * @note when the underlying API does not provide the exact data layout, but
-+   * only the colorspace/bit depth, this field should be set to the fully
-+   * planar version of that format (e.g. for 8-bit 420 YUV it should be
-+   * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else).
-+   */
-+  enum AVPixelFormat sw_format;
-+
-+  /**
-+   * The allocated dimensions of the frames in this pool.
-+   *
-+   * Must be set by the user before calling av_hwframe_ctx_init().
-+   */
-+  int width, height;
-+} AVHWFramesContext;
-+
-+/**
-+ * Look up an AVHWDeviceType by name.
-+ *
-+ * @param name String name of the device type (case-insensitive).
-+ * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if
-+ *         not found.
-+ */
-+enum AVHWDeviceType av_hwdevice_find_type_by_name(const char* name);
-+
-+/** Get the string name of an AVHWDeviceType.
-+ *
-+ * @param type Type from enum AVHWDeviceType.
-+ * @return Pointer to a static string containing the name, or NULL if the type
-+ *         is not valid.
-+ */
-+const char* av_hwdevice_get_type_name(enum AVHWDeviceType type);
-+
-+/**
-+ * Iterate over supported device types.
-+ *
-+ * @param prev AV_HWDEVICE_TYPE_NONE initially, then the previous type
-+ *             returned by this function in subsequent iterations.
-+ * @return The next usable device type from enum AVHWDeviceType, or
-+ *         AV_HWDEVICE_TYPE_NONE if there are no more.
-+ */
-+enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev);
-+
-+/**
-+ * Allocate an AVHWDeviceContext for a given hardware type.
-+ *
-+ * @param type the type of the hardware device to allocate.
-+ * @return a reference to the newly created AVHWDeviceContext on success or NULL
-+ *         on failure.
-+ */
-+AVBufferRef* av_hwdevice_ctx_alloc(enum AVHWDeviceType type);
-+
-+/**
-+ * Finalize the device context before use. This function must be called after
-+ * the context is filled with all the required information and before it is
-+ * used in any way.
-+ *
-+ * @param ref a reference to the AVHWDeviceContext
-+ * @return 0 on success, a negative AVERROR code on failure
-+ */
-+int av_hwdevice_ctx_init(AVBufferRef* ref);
-+
-+/**
-+ * Open a device of the specified type and create an AVHWDeviceContext for it.
-+ *
-+ * This is a convenience function intended to cover the simple cases. Callers
-+ * who need to fine-tune device creation/management should open the device
-+ * manually and then wrap it in an AVHWDeviceContext using
-+ * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init().
-+ *
-+ * The returned context is already initialized and ready for use, the caller
-+ * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of
-+ * the created AVHWDeviceContext are set by this function and should not be
-+ * touched by the caller.
-+ *
-+ * @param device_ctx On success, a reference to the newly-created device context
-+ *                   will be written here. The reference is owned by the caller
-+ *                   and must be released with av_buffer_unref() when no longer
-+ *                   needed. On failure, NULL will be written to this pointer.
-+ * @param type The type of the device to create.
-+ * @param device A type-specific string identifying the device to open.
-+ * @param opts A dictionary of additional (type-specific) options to use in
-+ *             opening the device. The dictionary remains owned by the caller.
-+ * @param flags currently unused
-+ *
-+ * @return 0 on success, a negative AVERROR code on failure.
-+ */
-+int av_hwdevice_ctx_create(AVBufferRef** device_ctx, enum AVHWDeviceType type,
-+                           const char* device, AVDictionary* opts, int flags);
-+
-+/**
-+ * Create a new device of the specified type from an existing device.
-+ *
-+ * If the source device is a device of the target type or was originally
-+ * derived from such a device (possibly through one or more intermediate
-+ * devices of other types), then this will return a reference to the
-+ * existing device of the same type as is requested.
-+ *
-+ * Otherwise, it will attempt to derive a new device from the given source
-+ * device.  If direct derivation to the new type is not implemented, it will
-+ * attempt the same derivation from each ancestor of the source device in
-+ * turn looking for an implemented derivation method.
-+ *
-+ * @param dst_ctx On success, a reference to the newly-created
-+ *                AVHWDeviceContext.
-+ * @param type    The type of the new device to create.
-+ * @param src_ctx A reference to an existing AVHWDeviceContext which will be
-+ *                used to create the new device.
-+ * @param flags   Currently unused; should be set to zero.
-+ * @return        Zero on success, a negative AVERROR code on failure.
-+ */
-+int av_hwdevice_ctx_create_derived(AVBufferRef** dst_ctx,
-+                                   enum AVHWDeviceType type,
-+                                   AVBufferRef* src_ctx, int flags);
-+
-+/**
-+ * Create a new device of the specified type from an existing device.
-+ *
-+ * This function performs the same action as av_hwdevice_ctx_create_derived,
-+ * however, it is able to set options for the new device to be derived.
-+ *
-+ * @param dst_ctx On success, a reference to the newly-created
-+ *                AVHWDeviceContext.
-+ * @param type    The type of the new device to create.
-+ * @param src_ctx A reference to an existing AVHWDeviceContext which will be
-+ *                used to create the new device.
-+ * @param options Options for the new device to create, same format as in
-+ *                av_hwdevice_ctx_create.
-+ * @param flags   Currently unused; should be set to zero.
-+ * @return        Zero on success, a negative AVERROR code on failure.
-+ */
-+int av_hwdevice_ctx_create_derived_opts(AVBufferRef** dst_ctx,
-+                                        enum AVHWDeviceType type,
-+                                        AVBufferRef* src_ctx,
-+                                        AVDictionary* options, int flags);
-+
-+/**
-+ * Allocate an AVHWFramesContext tied to a given device context.
-+ *
-+ * @param device_ctx a reference to a AVHWDeviceContext. This function will make
-+ *                   a new reference for internal use, the one passed to the
-+ *                   function remains owned by the caller.
-+ * @return a reference to the newly created AVHWFramesContext on success or NULL
-+ *         on failure.
-+ */
-+AVBufferRef* av_hwframe_ctx_alloc(AVBufferRef* device_ctx);
-+
-+/**
-+ * Finalize the context before use. This function must be called after the
-+ * context is filled with all the required information and before it is attached
-+ * to any frames.
-+ *
-+ * @param ref a reference to the AVHWFramesContext
-+ * @return 0 on success, a negative AVERROR code on failure
-+ */
-+int av_hwframe_ctx_init(AVBufferRef* ref);
-+
-+/**
-+ * Allocate a new frame attached to the given AVHWFramesContext.
-+ *
-+ * @param hwframe_ctx a reference to an AVHWFramesContext
-+ * @param frame an empty (freshly allocated or unreffed) frame to be filled with
-+ *              newly allocated buffers.
-+ * @param flags currently unused, should be set to zero
-+ * @return 0 on success, a negative AVERROR code on failure
-+ */
-+int av_hwframe_get_buffer(AVBufferRef* hwframe_ctx, AVFrame* frame, int flags);
-+
-+/**
-+ * Copy data to or from a hw surface. At least one of dst/src must have an
-+ * AVHWFramesContext attached.
-+ *
-+ * If src has an AVHWFramesContext attached, then the format of dst (if set)
-+ * must use one of the formats returned by av_hwframe_transfer_get_formats(src,
-+ * AV_HWFRAME_TRANSFER_DIRECTION_FROM).
-+ * If dst has an AVHWFramesContext attached, then the format of src must use one
-+ * of the formats returned by av_hwframe_transfer_get_formats(dst,
-+ * AV_HWFRAME_TRANSFER_DIRECTION_TO)
-+ *
-+ * dst may be "clean" (i.e. with data/buf pointers unset), in which case the
-+ * data buffers will be allocated by this function using av_frame_get_buffer().
-+ * If dst->format is set, then this format will be used, otherwise (when
-+ * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen.
-+ *
-+ * The two frames must have matching allocated dimensions (i.e. equal to
-+ * AVHWFramesContext.width/height), since not all device types support
-+ * transferring a sub-rectangle of the whole surface. The display dimensions
-+ * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but
-+ * also have to be equal for both frames. When the display dimensions are
-+ * smaller than the allocated dimensions, the content of the padding in the
-+ * destination frame is unspecified.
-+ *
-+ * @param dst the destination frame. dst is not touched on failure.
-+ * @param src the source frame.
-+ * @param flags currently unused, should be set to zero
-+ * @return 0 on success, a negative AVERROR error code on failure.
-+ */
-+int av_hwframe_transfer_data(AVFrame* dst, const AVFrame* src, int flags);
-+
-+enum AVHWFrameTransferDirection {
-+  /**
-+   * Transfer the data from the queried hw frame.
-+   */
-+  AV_HWFRAME_TRANSFER_DIRECTION_FROM,
-+
-+  /**
-+   * Transfer the data to the queried hw frame.
-+   */
-+  AV_HWFRAME_TRANSFER_DIRECTION_TO,
-+};
-+
-+/**
-+ * Get a list of possible source or target formats usable in
-+ * av_hwframe_transfer_data().
-+ *
-+ * @param hwframe_ctx the frame context to obtain the information for
-+ * @param dir the direction of the transfer
-+ * @param formats the pointer to the output format list will be written here.
-+ *                The list is terminated with AV_PIX_FMT_NONE and must be freed
-+ *                by the caller when no longer needed using av_free().
-+ *                If this function returns successfully, the format list will
-+ *                have at least one item (not counting the terminator).
-+ *                On failure, the contents of this pointer are unspecified.
-+ * @param flags currently unused, should be set to zero
-+ * @return 0 on success, a negative AVERROR code on failure.
-+ */
-+int av_hwframe_transfer_get_formats(AVBufferRef* hwframe_ctx,
-+                                    enum AVHWFrameTransferDirection dir,
-+                                    enum AVPixelFormat** formats, int flags);
-+
-+/**
-+ * This struct describes the constraints on hardware frames attached to
-+ * a given device with a hardware-specific configuration.  This is returned
-+ * by av_hwdevice_get_hwframe_constraints() and must be freed by
-+ * av_hwframe_constraints_free() after use.
-+ */
-+typedef struct AVHWFramesConstraints {
-+  /**
-+   * A list of possible values for format in the hw_frames_ctx,
-+   * terminated by AV_PIX_FMT_NONE.  This member will always be filled.
-+   */
-+  enum AVPixelFormat* valid_hw_formats;
-+
-+  /**
-+   * A list of possible values for sw_format in the hw_frames_ctx,
-+   * terminated by AV_PIX_FMT_NONE.  Can be NULL if this information is
-+   * not known.
-+   */
-+  enum AVPixelFormat* valid_sw_formats;
-+
-+  /**
-+   * The minimum size of frames in this hw_frames_ctx.
-+   * (Zero if not known.)
-+   */
-+  int min_width;
-+  int min_height;
-+
-+  /**
-+   * The maximum size of frames in this hw_frames_ctx.
-+   * (INT_MAX if not known / no limit.)
-+   */
-+  int max_width;
-+  int max_height;
-+} AVHWFramesConstraints;
-+
-+/**
-+ * Allocate a HW-specific configuration structure for a given HW device.
-+ * After use, the user must free all members as required by the specific
-+ * hardware structure being used, then free the structure itself with
-+ * av_free().
-+ *
-+ * @param device_ctx a reference to the associated AVHWDeviceContext.
-+ * @return The newly created HW-specific configuration structure on
-+ *         success or NULL on failure.
-+ */
-+void* av_hwdevice_hwconfig_alloc(AVBufferRef* device_ctx);
-+
-+/**
-+ * Get the constraints on HW frames given a device and the HW-specific
-+ * configuration to be used with that device.  If no HW-specific
-+ * configuration is provided, returns the maximum possible capabilities
-+ * of the device.
-+ *
-+ * @param ref a reference to the associated AVHWDeviceContext.
-+ * @param hwconfig a filled HW-specific configuration structure, or NULL
-+ *        to return the maximum possible capabilities of the device.
-+ * @return AVHWFramesConstraints structure describing the constraints
-+ *         on the device, or NULL if not available.
-+ */
-+AVHWFramesConstraints* av_hwdevice_get_hwframe_constraints(
-+    AVBufferRef* ref, const void* hwconfig);
-+
-+/**
-+ * Free an AVHWFrameConstraints structure.
-+ *
-+ * @param constraints The (filled or unfilled) AVHWFrameConstraints structure.
-+ */
-+void av_hwframe_constraints_free(AVHWFramesConstraints** constraints);
-+
-+/**
-+ * Flags to apply to frame mappings.
-+ */
-+enum {
-+  /**
-+   * The mapping must be readable.
-+   */
-+  AV_HWFRAME_MAP_READ = 1 << 0,
-+  /**
-+   * The mapping must be writeable.
-+   */
-+  AV_HWFRAME_MAP_WRITE = 1 << 1,
-+  /**
-+   * The mapped frame will be overwritten completely in subsequent
-+   * operations, so the current frame data need not be loaded.  Any values
-+   * which are not overwritten are unspecified.
-+   */
-+  AV_HWFRAME_MAP_OVERWRITE = 1 << 2,
-+  /**
-+   * The mapping must be direct.  That is, there must not be any copying in
-+   * the map or unmap steps.  Note that performance of direct mappings may
-+   * be much lower than normal memory.
-+   */
-+  AV_HWFRAME_MAP_DIRECT = 1 << 3,
-+};
-+
-+/**
-+ * Map a hardware frame.
-+ *
-+ * This has a number of different possible effects, depending on the format
-+ * and origin of the src and dst frames.  On input, src should be a usable
-+ * frame with valid buffers and dst should be blank (typically as just created
-+ * by av_frame_alloc()).  src should have an associated hwframe context, and
-+ * dst may optionally have a format and associated hwframe context.
-+ *
-+ * If src was created by mapping a frame from the hwframe context of dst,
-+ * then this function undoes the mapping - dst is replaced by a reference to
-+ * the frame that src was originally mapped from.
-+ *
-+ * If both src and dst have an associated hwframe context, then this function
-+ * attempts to map the src frame from its hardware context to that of dst and
-+ * then fill dst with appropriate data to be usable there.  This will only be
-+ * possible if the hwframe contexts and associated devices are compatible -
-+ * given compatible devices, av_hwframe_ctx_create_derived() can be used to
-+ * create a hwframe context for dst in which mapping should be possible.
-+ *
-+ * If src has a hwframe context but dst does not, then the src frame is
-+ * mapped to normal memory and should thereafter be usable as a normal frame.
-+ * If the format is set on dst, then the mapping will attempt to create dst
-+ * with that format and fail if it is not possible.  If format is unset (is
-+ * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate
-+ * format to use is (probably the sw_format of the src hwframe context).
-+ *
-+ * A return value of AVERROR(ENOSYS) indicates that the mapping is not
-+ * possible with the given arguments and hwframe setup, while other return
-+ * values indicate that it failed somehow.
-+ *
-+ * On failure, the destination frame will be left blank, except for the
-+ * hw_frames_ctx/format fields thay may have been set by the caller - those will
-+ * be preserved as they were.
-+ *
-+ * @param dst Destination frame, to contain the mapping.
-+ * @param src Source frame, to be mapped.
-+ * @param flags Some combination of AV_HWFRAME_MAP_* flags.
-+ * @return Zero on success, negative AVERROR code on failure.
-+ */
-+int av_hwframe_map(AVFrame* dst, const AVFrame* src, int flags);
-+
-+/**
-+ * Create and initialise an AVHWFramesContext as a mapping of another existing
-+ * AVHWFramesContext on a different device.
-+ *
-+ * av_hwframe_ctx_init() should not be called after this.
-+ *
-+ * @param derived_frame_ctx  On success, a reference to the newly created
-+ *                           AVHWFramesContext.
-+ * @param format             The AVPixelFormat for the derived context.
-+ * @param derived_device_ctx A reference to the device to create the new
-+ *                           AVHWFramesContext on.
-+ * @param source_frame_ctx   A reference to an existing AVHWFramesContext
-+ *                           which will be mapped to the derived context.
-+ * @param flags  Some combination of AV_HWFRAME_MAP_* flags, defining the
-+ *               mapping parameters to apply to frames which are allocated
-+ *               in the derived device.
-+ * @return       Zero on success, negative AVERROR code on failure.
-+ */
-+int av_hwframe_ctx_create_derived(AVBufferRef** derived_frame_ctx,
-+                                  enum AVPixelFormat format,
-+                                  AVBufferRef* derived_device_ctx,
-+                                  AVBufferRef* source_frame_ctx, int flags);
-+
-+#endif /* AVUTIL_HWCONTEXT_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/hwcontext_drm.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/hwcontext_drm.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/hwcontext_drm.h
-@@ -0,0 +1,169 @@
-+/*
-+ * 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_DRM_H
-+#define AVUTIL_HWCONTEXT_DRM_H
-+
-+#include <stddef.h>
-+#include <stdint.h>
-+
-+/**
-+ * @file
-+ * API-specific header for AV_HWDEVICE_TYPE_DRM.
-+ *
-+ * Internal frame allocation is not currently supported - all frames
-+ * must be allocated by the user.  Thus AVHWFramesContext is always
-+ * NULL, though this may change if support for frame allocation is
-+ * added in future.
-+ */
-+
-+enum {
-+  /**
-+   * The maximum number of layers/planes in a DRM frame.
-+   */
-+  AV_DRM_MAX_PLANES = 4
-+};
-+
-+/**
-+ * DRM object descriptor.
-+ *
-+ * Describes a single DRM object, addressing it as a PRIME file
-+ * descriptor.
-+ */
-+typedef struct AVDRMObjectDescriptor {
-+  /**
-+   * DRM PRIME fd for the object.
-+   */
-+  int fd;
-+  /**
-+   * Total size of the object.
-+   *
-+   * (This includes any parts not which do not contain image data.)
-+   */
-+  size_t size;
-+  /**
-+   * Format modifier applied to the object (DRM_FORMAT_MOD_*).
-+   *
-+   * If the format modifier is unknown then this should be set to
-+   * DRM_FORMAT_MOD_INVALID.
-+   */
-+  uint64_t format_modifier;
-+} AVDRMObjectDescriptor;
-+
-+/**
-+ * DRM plane descriptor.
-+ *
-+ * Describes a single plane of a layer, which is contained within
-+ * a single object.
-+ */
-+typedef struct AVDRMPlaneDescriptor {
-+  /**
-+   * Index of the object containing this plane in the objects
-+   * array of the enclosing frame descriptor.
-+   */
-+  int object_index;
-+  /**
-+   * Offset within that object of this plane.
-+   */
-+  ptrdiff_t offset;
-+  /**
-+   * Pitch (linesize) of this plane.
-+   */
-+  ptrdiff_t pitch;
-+} AVDRMPlaneDescriptor;
-+
-+/**
-+ * DRM layer descriptor.
-+ *
-+ * Describes a single layer within a frame.  This has the structure
-+ * defined by its format, and will contain one or more planes.
-+ */
-+typedef struct AVDRMLayerDescriptor {
-+  /**
-+   * Format of the layer (DRM_FORMAT_*).
-+   */
-+  uint32_t format;
-+  /**
-+   * Number of planes in the layer.
-+   *
-+   * This must match the number of planes required by format.
-+   */
-+  int nb_planes;
-+  /**
-+   * Array of planes in this layer.
-+   */
-+  AVDRMPlaneDescriptor planes[AV_DRM_MAX_PLANES];
-+} AVDRMLayerDescriptor;
-+
-+/**
-+ * DRM frame descriptor.
-+ *
-+ * This is used as the data pointer for AV_PIX_FMT_DRM_PRIME frames.
-+ * It is also used by user-allocated frame pools - allocating in
-+ * AVHWFramesContext.pool must return AVBufferRefs which contain
-+ * an object of this type.
-+ *
-+ * The fields of this structure should be set such it can be
-+ * imported directly by EGL using the EGL_EXT_image_dma_buf_import
-+ * and EGL_EXT_image_dma_buf_import_modifiers extensions.
-+ * (Note that the exact layout of a particular format may vary between
-+ * platforms - we only specify that the same platform should be able
-+ * to import it.)
-+ *
-+ * The total number of planes must not exceed AV_DRM_MAX_PLANES, and
-+ * the order of the planes by increasing layer index followed by
-+ * increasing plane index must be the same as the order which would
-+ * be used for the data pointers in the equivalent software format.
-+ */
-+typedef struct AVDRMFrameDescriptor {
-+  /**
-+   * Number of DRM objects making up this frame.
-+   */
-+  int nb_objects;
-+  /**
-+   * Array of objects making up the frame.
-+   */
-+  AVDRMObjectDescriptor objects[AV_DRM_MAX_PLANES];
-+  /**
-+   * Number of layers in the frame.
-+   */
-+  int nb_layers;
-+  /**
-+   * Array of layers in the frame.
-+   */
-+  AVDRMLayerDescriptor layers[AV_DRM_MAX_PLANES];
-+} AVDRMFrameDescriptor;
-+
-+/**
-+ * DRM device.
-+ *
-+ * Allocated as AVHWDeviceContext.hwctx.
-+ */
-+typedef struct AVDRMDeviceContext {
-+  /**
-+   * File descriptor of DRM device.
-+   *
-+   * This is used as the device to create frames on, and may also be
-+   * used in some derivation and mapping operations.
-+   *
-+   * If no device is required, set to -1.
-+   */
-+  int fd;
-+} AVDRMDeviceContext;
-+
-+#endif /* AVUTIL_HWCONTEXT_DRM_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/hwcontext_vaapi.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/hwcontext_vaapi.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/hwcontext_vaapi.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_HWCONTEXT_VAAPI_H
-+#define AVUTIL_HWCONTEXT_VAAPI_H
-+
-+#include <va/va.h>
-+
-+/**
-+ * @file
-+ * API-specific header for AV_HWDEVICE_TYPE_VAAPI.
-+ *
-+ * Dynamic frame pools are supported, but note that any pool used as a render
-+ * target is required to be of fixed size in order to be be usable as an
-+ * argument to vaCreateContext().
-+ *
-+ * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs
-+ * with the data pointer set to a VASurfaceID.
-+ */
-+
-+enum {
-+  /**
-+   * The quirks field has been set by the user and should not be detected
-+   * automatically by av_hwdevice_ctx_init().
-+   */
-+  AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0),
-+  /**
-+   * The driver does not destroy parameter buffers when they are used by
-+   * vaRenderPicture().  Additional code will be required to destroy them
-+   * separately afterwards.
-+   */
-+  AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1),
-+
-+  /**
-+   * The driver does not support the VASurfaceAttribMemoryType attribute,
-+   * so the surface allocation code will not try to use it.
-+   */
-+  AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2),
-+
-+  /**
-+   * The driver does not support surface attributes at all.
-+   * The surface allocation code will never pass them to surface allocation,
-+   * and the results of the vaQuerySurfaceAttributes() call will be faked.
-+   */
-+  AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3),
-+};
-+
-+/**
-+ * VAAPI connection details.
-+ *
-+ * Allocated as AVHWDeviceContext.hwctx
-+ */
-+typedef struct AVVAAPIDeviceContext {
-+  /**
-+   * The VADisplay handle, to be filled by the user.
-+   */
-+  VADisplay display;
-+  /**
-+   * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(),
-+   * with reference to a table of known drivers, unless the
-+   * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present.  The user
-+   * may need to refer to this field when performing any later
-+   * operations using VAAPI with the same VADisplay.
-+   */
-+  unsigned int driver_quirks;
-+} AVVAAPIDeviceContext;
-+
-+/**
-+ * VAAPI-specific data associated with a frame pool.
-+ *
-+ * Allocated as AVHWFramesContext.hwctx.
-+ */
-+typedef struct AVVAAPIFramesContext {
-+  /**
-+   * Set by the user to apply surface attributes to all surfaces in
-+   * the frame pool.  If null, default settings are used.
-+   */
-+  VASurfaceAttrib* attributes;
-+  int nb_attributes;
-+  /**
-+   * The surfaces IDs of all surfaces in the pool after creation.
-+   * Only valid if AVHWFramesContext.initial_pool_size was positive.
-+   * These are intended to be used as the render_targets arguments to
-+   * vaCreateContext().
-+   */
-+  VASurfaceID* surface_ids;
-+  int nb_surfaces;
-+} AVVAAPIFramesContext;
-+
-+/**
-+ * VAAPI hardware pipeline configuration details.
-+ *
-+ * Allocated with av_hwdevice_hwconfig_alloc().
-+ */
-+typedef struct AVVAAPIHWConfig {
-+  /**
-+   * ID of a VAAPI pipeline configuration.
-+   */
-+  VAConfigID config_id;
-+} AVVAAPIHWConfig;
-+
-+#endif /* AVUTIL_HWCONTEXT_VAAPI_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/intfloat.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/intfloat.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/intfloat.h
-@@ -0,0 +1,73 @@
-+/*
-+ * Copyright (c) 2011 Mans Rullgard
-+ *
-+ * 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_INTFLOAT_H
-+#define AVUTIL_INTFLOAT_H
-+
-+#include <stdint.h>
-+#include "attributes.h"
-+
-+union av_intfloat32 {
-+  uint32_t i;
-+  float f;
-+};
-+
-+union av_intfloat64 {
-+  uint64_t i;
-+  double f;
-+};
-+
-+/**
-+ * Reinterpret a 32-bit integer as a float.
-+ */
-+static av_always_inline float av_int2float(uint32_t i) {
-+  union av_intfloat32 v;
-+  v.i = i;
-+  return v.f;
-+}
-+
-+/**
-+ * Reinterpret a float as a 32-bit integer.
-+ */
-+static av_always_inline uint32_t av_float2int(float f) {
-+  union av_intfloat32 v;
-+  v.f = f;
-+  return v.i;
-+}
-+
-+/**
-+ * Reinterpret a 64-bit integer as a double.
-+ */
-+static av_always_inline double av_int2double(uint64_t i) {
-+  union av_intfloat64 v;
-+  v.i = i;
-+  return v.f;
-+}
-+
-+/**
-+ * Reinterpret a double as a 64-bit integer.
-+ */
-+static av_always_inline uint64_t av_double2int(double f) {
-+  union av_intfloat64 v;
-+  v.f = f;
-+  return v.i;
-+}
-+
-+#endif /* AVUTIL_INTFLOAT_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/log.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/log.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/log.h
-@@ -0,0 +1,388 @@
-+/*
-+ * copyright (c) 2006 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 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_LOG_H
-+#define AVUTIL_LOG_H
-+
-+#include <stdarg.h>
-+#include "attributes.h"
-+#include "version.h"
-+
-+typedef enum {
-+  AV_CLASS_CATEGORY_NA = 0,
-+  AV_CLASS_CATEGORY_INPUT,
-+  AV_CLASS_CATEGORY_OUTPUT,
-+  AV_CLASS_CATEGORY_MUXER,
-+  AV_CLASS_CATEGORY_DEMUXER,
-+  AV_CLASS_CATEGORY_ENCODER,
-+  AV_CLASS_CATEGORY_DECODER,
-+  AV_CLASS_CATEGORY_FILTER,
-+  AV_CLASS_CATEGORY_BITSTREAM_FILTER,
-+  AV_CLASS_CATEGORY_SWSCALER,
-+  AV_CLASS_CATEGORY_SWRESAMPLER,
-+  AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40,
-+  AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
-+  AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
-+  AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
-+  AV_CLASS_CATEGORY_DEVICE_OUTPUT,
-+  AV_CLASS_CATEGORY_DEVICE_INPUT,
-+  AV_CLASS_CATEGORY_NB  ///< not part of ABI/API
-+} AVClassCategory;
-+
-+#define AV_IS_INPUT_DEVICE(category)                       \
-+  (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \
-+   ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \
-+   ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT))
-+
-+#define AV_IS_OUTPUT_DEVICE(category)                       \
-+  (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \
-+   ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \
-+   ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT))
-+
-+struct AVOptionRanges;
-+
-+/**
-+ * Describe the class of an AVClass context structure. That is an
-+ * arbitrary struct of which the first field is a pointer to an
-+ * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.).
-+ */
-+typedef struct AVClass {
-+  /**
-+   * The name of the class; usually it is the same name as the
-+   * context structure type to which the AVClass is associated.
-+   */
-+  const char* class_name;
-+
-+  /**
-+   * A pointer to a function which returns the name of a context
-+   * instance ctx associated with the class.
-+   */
-+  const char* (*item_name)(void* ctx);
-+
-+  /**
-+   * a pointer to the first option specified in the class if any or NULL
-+   *
-+   * @see av_set_default_options()
-+   */
-+  const struct AVOption* option;
-+
-+  /**
-+   * LIBAVUTIL_VERSION with which this structure was created.
-+   * This is used to allow fields to be added without requiring major
-+   * version bumps everywhere.
-+   */
-+
-+  int version;
-+
-+  /**
-+   * Offset in the structure where log_level_offset is stored.
-+   * 0 means there is no such variable
-+   */
-+  int log_level_offset_offset;
-+
-+  /**
-+   * Offset in the structure where a pointer to the parent context for
-+   * logging is stored. For example a decoder could pass its AVCodecContext
-+   * to eval as such a parent context, which an av_log() implementation
-+   * could then leverage to display the parent context.
-+   * The offset can be NULL.
-+   */
-+  int parent_log_context_offset;
-+
-+  /**
-+   * Category used for visualization (like color)
-+   * This is only set if the category is equal for all objects using this class.
-+   * available since version (51 << 16 | 56 << 8 | 100)
-+   */
-+  AVClassCategory category;
-+
-+  /**
-+   * Callback to return the category.
-+   * available since version (51 << 16 | 59 << 8 | 100)
-+   */
-+  AVClassCategory (*get_category)(void* ctx);
-+
-+  /**
-+   * Callback to return the supported/allowed ranges.
-+   * available since version (52.12)
-+   */
-+  int (*query_ranges)(struct AVOptionRanges**, void* obj, const char* key,
-+                      int flags);
-+
-+  /**
-+   * Return next AVOptions-enabled child or NULL
-+   */
-+  void* (*child_next)(void* obj, void* prev);
-+
-+  /**
-+   * Iterate over the AVClasses corresponding to potential AVOptions-enabled
-+   * children.
-+   *
-+   * @param iter pointer to opaque iteration state. The caller must initialize
-+   *             *iter to NULL before the first call.
-+   * @return AVClass for the next AVOptions-enabled child or NULL if there are
-+   *         no more such children.
-+   *
-+   * @note The difference between child_next and this is that child_next
-+   *       iterates over _already existing_ objects, while child_class_iterate
-+   *       iterates over _all possible_ children.
-+   */
-+  const struct AVClass* (*child_class_iterate)(void** iter);
-+} AVClass;
-+
-+/**
-+ * @addtogroup lavu_log
-+ *
-+ * @{
-+ *
-+ * @defgroup lavu_log_constants Logging Constants
-+ *
-+ * @{
-+ */
-+
-+/**
-+ * Print no output.
-+ */
-+#define AV_LOG_QUIET -8
-+
-+/**
-+ * Something went really wrong and we will crash now.
-+ */
-+#define AV_LOG_PANIC 0
-+
-+/**
-+ * Something went wrong and recovery is not possible.
-+ * For example, no header was found for a format which depends
-+ * on headers or an illegal combination of parameters is used.
-+ */
-+#define AV_LOG_FATAL 8
-+
-+/**
-+ * Something went wrong and cannot losslessly be recovered.
-+ * However, not all future data is affected.
-+ */
-+#define AV_LOG_ERROR 16
-+
-+/**
-+ * Something somehow does not look correct. This may or may not
-+ * lead to problems. An example would be the use of '-vstrict -2'.
-+ */
-+#define AV_LOG_WARNING 24
-+
-+/**
-+ * Standard information.
-+ */
-+#define AV_LOG_INFO 32
-+
-+/**
-+ * Detailed information.
-+ */
-+#define AV_LOG_VERBOSE 40
-+
-+/**
-+ * Stuff which is only useful for libav* developers.
-+ */
-+#define AV_LOG_DEBUG 48
-+
-+/**
-+ * Extremely verbose debugging, useful for libav* development.
-+ */
-+#define AV_LOG_TRACE 56
-+
-+#define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET)
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * Sets additional colors for extended debugging sessions.
-+ * @code
-+   av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), "Message in purple\n");
-+   @endcode
-+ * Requires 256color terminal support. Uses outside debugging is not
-+ * recommended.
-+ */
-+#define AV_LOG_C(x) ((x) << 8)
-+
-+/**
-+ * Send the specified message to the log if the level is less than or equal
-+ * to the current av_log_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_set_callback
-+ *
-+ * @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 level The importance level of the message expressed using a @ref
-+ *        lavu_log_constants "Logging Constant".
-+ * @param fmt The format string (printf-compatible) that specifies how
-+ *        subsequent arguments are converted to output.
-+ */
-+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
-+ * to the current av_log_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_set_callback
-+ *
-+ * @param avcl A pointer to an arbitrary struct of which the first field is a
-+ *        pointer to an AVClass struct.
-+ * @param level The importance level of the message expressed using a @ref
-+ *        lavu_log_constants "Logging Constant".
-+ * @param fmt The format string (printf-compatible) that specifies how
-+ *        subsequent arguments are converted to output.
-+ * @param vl The arguments referenced by the format string.
-+ */
-+void av_vlog(void* avcl, int level, const char* fmt, va_list vl);
-+
-+/**
-+ * Get the current log level
-+ *
-+ * @see lavu_log_constants
-+ *
-+ * @return Current log level
-+ */
-+int av_log_get_level(void);
-+
-+/**
-+ * Set the log level
-+ *
-+ * @see lavu_log_constants
-+ *
-+ * @param level Logging level
-+ */
-+void av_log_set_level(int level);
-+
-+/**
-+ * Set the logging callback
-+ *
-+ * @note The callback must be thread safe, even if the application does not use
-+ *       threads itself as some codecs are multithreaded.
-+ *
-+ * @see av_log_default_callback
-+ *
-+ * @param callback A logging function with a compatible signature.
-+ */
-+void av_log_set_callback(void (*callback)(void*, int, const char*, va_list));
-+
-+/**
-+ * Default logging callback
-+ *
-+ * It prints the message to stderr, optionally colorizing it.
-+ *
-+ * @param avcl A pointer to an arbitrary struct of which the first field is a
-+ *        pointer to an AVClass struct.
-+ * @param level The importance level of the message expressed using a @ref
-+ *        lavu_log_constants "Logging Constant".
-+ * @param fmt The format string (printf-compatible) that specifies how
-+ *        subsequent arguments are converted to output.
-+ * @param vl The arguments referenced by the format string.
-+ */
-+void av_log_default_callback(void* avcl, int level, const char* fmt,
-+                             va_list vl);
-+
-+/**
-+ * Return the context name
-+ *
-+ * @param  ctx The AVClass context
-+ *
-+ * @return The AVClass class_name
-+ */
-+const char* av_default_item_name(void* ctx);
-+AVClassCategory av_default_get_category(void* ptr);
-+
-+/**
-+ * Format a line of log the same way as the default callback.
-+ * @param line          buffer to receive the formatted line
-+ * @param line_size     size of the buffer
-+ * @param print_prefix  used to store whether the prefix must be printed;
-+ *                      must point to a persistent integer initially set to 1
-+ */
-+void av_log_format_line(void* ptr, int level, const char* fmt, va_list vl,
-+                        char* line, int line_size, int* print_prefix);
-+
-+/**
-+ * Format a line of log the same way as the default callback.
-+ * @param line          buffer to receive the formatted line;
-+ *                      may be NULL if line_size is 0
-+ * @param line_size     size of the buffer; at most line_size-1 characters will
-+ *                      be written to the buffer, plus one null terminator
-+ * @param print_prefix  used to store whether the prefix must be printed;
-+ *                      must point to a persistent integer initially set to 1
-+ * @return Returns a negative value if an error occurred, otherwise returns
-+ *         the number of characters that would have been written for a
-+ *         sufficiently large buffer, not including the terminating null
-+ *         character. If the return value is not less than line_size, it means
-+ *         that the log message was truncated to fit the buffer.
-+ */
-+int av_log_format_line2(void* ptr, int level, const char* fmt, va_list vl,
-+                        char* line, int line_size, int* print_prefix);
-+
-+/**
-+ * Skip repeated messages, this requires the user app to use av_log() instead of
-+ * (f)printf as the 2 would otherwise interfere and lead to
-+ * "Last message repeated x times" messages below (f)printf messages with some
-+ * bad luck.
-+ * Also to receive the last, "last repeated" line if any, the user app must
-+ * call av_log(NULL, AV_LOG_QUIET, "%s", ""); at the end
-+ */
-+#define AV_LOG_SKIP_REPEATED 1
-+
-+/**
-+ * Include the log severity in messages originating from codecs.
-+ *
-+ * Results in messages such as:
-+ * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts
-+ */
-+#define AV_LOG_PRINT_LEVEL 2
-+
-+void av_log_set_flags(int arg);
-+int av_log_get_flags(void);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_LOG_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/macros.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/macros.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/macros.h
-@@ -0,0 +1,87 @@
-+/*
-+ * 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
-+ * @ingroup lavu
-+ * Utility Preprocessor macros
-+ */
-+
-+#ifndef AVUTIL_MACROS_H
-+#define AVUTIL_MACROS_H
-+
-+#include "libavutil/avconfig.h"
-+
-+#if AV_HAVE_BIGENDIAN
-+#  define AV_NE(be, le) (be)
-+#else
-+#  define AV_NE(be, le) (le)
-+#endif
-+
-+/**
-+ * Comparator.
-+ * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0
-+ * if x == y. This is useful for instance in a qsort comparator callback.
-+ * Furthermore, compilers are able to optimize this to branchless code, and
-+ * there is no risk of overflow with signed types.
-+ * As with many macros, this evaluates its argument multiple times, it thus
-+ * must not have a side-effect.
-+ */
-+#define FFDIFFSIGN(x, y) (((x) > (y)) - ((x) < (y)))
-+
-+#define FFMAX(a, b) ((a) > (b) ? (a) : (b))
-+#define FFMAX3(a, b, c) FFMAX(FFMAX(a, b), c)
-+#define FFMIN(a, b) ((a) > (b) ? (b) : (a))
-+#define FFMIN3(a, b, c) FFMIN(FFMIN(a, b), c)
-+
-+#define FFSWAP(type, a, b) \
-+  do {                     \
-+    type SWAP_tmp = b;     \
-+    b = a;                 \
-+    a = SWAP_tmp;          \
-+  } while (0)
-+#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
-+
-+#define MKTAG(a, b, c, d) \
-+  ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
-+#define MKBETAG(a, b, c, d) \
-+  ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))
-+
-+/**
-+ * @addtogroup preproc_misc Preprocessor String Macros
-+ *
-+ * String manipulation macros
-+ *
-+ * @{
-+ */
-+
-+#define AV_STRINGIFY(s) AV_TOSTRING(s)
-+#define AV_TOSTRING(s) #s
-+
-+#define AV_GLUE(a, b) a##b
-+#define AV_JOIN(a, b) AV_GLUE(a, b)
-+
-+/**
-+ * @}
-+ */
-+
-+#define AV_PRAGMA(s) _Pragma(#s)
-+
-+#define FFALIGN(x, a) (((x) + (a)-1) & ~((a)-1))
-+
-+#endif /* AVUTIL_MACROS_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/mathematics.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/mathematics.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/mathematics.h
-@@ -0,0 +1,305 @@
-+/*
-+ * copyright (c) 2005-2012 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 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
-+ * @addtogroup lavu_math
-+ * Mathematical utilities for working with timestamp and time base.
-+ */
-+
-+#ifndef AVUTIL_MATHEMATICS_H
-+#define AVUTIL_MATHEMATICS_H
-+
-+#include <stdint.h>
-+#include <math.h>
-+#include "attributes.h"
-+#include "rational.h"
-+#include "intfloat.h"
-+
-+#ifndef M_E
-+#  define M_E 2.7182818284590452354 /* e */
-+#endif
-+#ifndef M_Ef
-+#  define M_Ef 2.7182818284590452354f /* e */
-+#endif
-+#ifndef M_LN2
-+#  define M_LN2 0.69314718055994530942 /* log_e 2 */
-+#endif
-+#ifndef M_LN2f
-+#  define M_LN2f 0.69314718055994530942f /* log_e 2 */
-+#endif
-+#ifndef M_LN10
-+#  define M_LN10 2.30258509299404568402 /* log_e 10 */
-+#endif
-+#ifndef M_LN10f
-+#  define M_LN10f 2.30258509299404568402f /* log_e 10 */
-+#endif
-+#ifndef M_LOG2_10
-+#  define M_LOG2_10 3.32192809488736234787 /* log_2 10 */
-+#endif
-+#ifndef M_LOG2_10f
-+#  define M_LOG2_10f 3.32192809488736234787f /* log_2 10 */
-+#endif
-+#ifndef M_PHI
-+#  define M_PHI 1.61803398874989484820 /* phi / golden ratio */
-+#endif
-+#ifndef M_PHIf
-+#  define M_PHIf 1.61803398874989484820f /* phi / golden ratio */
-+#endif
-+#ifndef M_PI
-+#  define M_PI 3.14159265358979323846 /* pi */
-+#endif
-+#ifndef M_PIf
-+#  define M_PIf 3.14159265358979323846f /* pi */
-+#endif
-+#ifndef M_PI_2
-+#  define M_PI_2 1.57079632679489661923 /* pi/2 */
-+#endif
-+#ifndef M_PI_2f
-+#  define M_PI_2f 1.57079632679489661923f /* pi/2 */
-+#endif
-+#ifndef M_PI_4
-+#  define M_PI_4 0.78539816339744830962 /* pi/4 */
-+#endif
-+#ifndef M_PI_4f
-+#  define M_PI_4f 0.78539816339744830962f /* pi/4 */
-+#endif
-+#ifndef M_1_PI
-+#  define M_1_PI 0.31830988618379067154 /* 1/pi */
-+#endif
-+#ifndef M_1_PIf
-+#  define M_1_PIf 0.31830988618379067154f /* 1/pi */
-+#endif
-+#ifndef M_2_PI
-+#  define M_2_PI 0.63661977236758134308 /* 2/pi */
-+#endif
-+#ifndef M_2_PIf
-+#  define M_2_PIf 0.63661977236758134308f /* 2/pi */
-+#endif
-+#ifndef M_2_SQRTPI
-+#  define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
-+#endif
-+#ifndef M_2_SQRTPIf
-+#  define M_2_SQRTPIf 1.12837916709551257390f /* 2/sqrt(pi) */
-+#endif
-+#ifndef M_SQRT1_2
-+#  define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
-+#endif
-+#ifndef M_SQRT1_2f
-+#  define M_SQRT1_2f 0.70710678118654752440f /* 1/sqrt(2) */
-+#endif
-+#ifndef M_SQRT2
-+#  define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
-+#endif
-+#ifndef M_SQRT2f
-+#  define M_SQRT2f 1.41421356237309504880f /* sqrt(2) */
-+#endif
-+#ifndef NAN
-+#  define NAN av_int2float(0x7fc00000)
-+#endif
-+#ifndef INFINITY
-+#  define INFINITY av_int2float(0x7f800000)
-+#endif
-+
-+/**
-+ * @addtogroup lavu_math
-+ *
-+ * @{
-+ */
-+
-+/**
-+ * Rounding methods.
-+ */
-+enum AVRounding {
-+  AV_ROUND_ZERO = 0,  ///< Round toward zero.
-+  AV_ROUND_INF = 1,   ///< Round away from zero.
-+  AV_ROUND_DOWN = 2,  ///< Round toward -infinity.
-+  AV_ROUND_UP = 3,    ///< Round toward +infinity.
-+  AV_ROUND_NEAR_INF =
-+      5,  ///< Round to nearest and halfway cases away from zero.
-+  /**
-+   * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through
-+   * unchanged, avoiding special cases for #AV_NOPTS_VALUE.
-+   *
-+   * Unlike other values of the enumeration AVRounding, this value is a
-+   * bitmask that must be used in conjunction with another value of the
-+   * enumeration through a bitwise OR, in order to set behavior for normal
-+   * cases.
-+   *
-+   * @code{.c}
-+   * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
-+   * // Rescaling 3:
-+   * //     Calculating 3 * 1 / 2
-+   * //     3 / 2 is rounded up to 2
-+   * //     => 2
-+   *
-+   * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
-+   * // Rescaling AV_NOPTS_VALUE:
-+   * //     AV_NOPTS_VALUE == INT64_MIN
-+   * //     AV_NOPTS_VALUE is passed through
-+   * //     => AV_NOPTS_VALUE
-+   * @endcode
-+   */
-+  AV_ROUND_PASS_MINMAX = 8192,
-+};
-+
-+/**
-+ * Compute the greatest common divisor of two integer operands.
-+ *
-+ * @param a Operand
-+ * @param b Operand
-+ * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >=
-+ * 0; if a == 0 and b == 0, returns 0.
-+ */
-+int64_t av_const av_gcd(int64_t a, int64_t b);
-+
-+/**
-+ * Rescale a 64-bit integer with rounding to nearest.
-+ *
-+ * The operation is mathematically equivalent to `a * b / c`, but writing that
-+ * directly can overflow.
-+ *
-+ * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF.
-+ *
-+ * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd()
-+ */
-+int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const;
-+
-+/**
-+ * Rescale a 64-bit integer with specified rounding.
-+ *
-+ * The operation is mathematically equivalent to `a * b / c`, but writing that
-+ * directly can overflow, and does not support different rounding methods.
-+ * If the result is not representable then INT64_MIN is returned.
-+ *
-+ * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd()
-+ */
-+int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c,
-+                       enum AVRounding rnd) av_const;
-+
-+/**
-+ * Rescale a 64-bit integer by 2 rational numbers.
-+ *
-+ * The operation is mathematically equivalent to `a * bq / cq`.
-+ *
-+ * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF.
-+ *
-+ * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd()
-+ */
-+int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;
-+
-+/**
-+ * Rescale a 64-bit integer by 2 rational numbers with specified rounding.
-+ *
-+ * The operation is mathematically equivalent to `a * bq / cq`.
-+ *
-+ * @see av_rescale(), av_rescale_rnd(), av_rescale_q()
-+ */
-+int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq,
-+                         enum AVRounding rnd) av_const;
-+
-+/**
-+ * Compare two timestamps each in its own time base.
-+ *
-+ * @return One of the following values:
-+ *         - -1 if `ts_a` is before `ts_b`
-+ *         - 1 if `ts_a` is after `ts_b`
-+ *         - 0 if they represent the same position
-+ *
-+ * @warning
-+ * The result of the function is undefined if one of the timestamps is outside
-+ * the `int64_t` range when represented in the other's timebase.
-+ */
-+int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);
-+
-+/**
-+ * Compare the remainders of two integer operands divided by a common divisor.
-+ *
-+ * In other words, compare the least significant `log2(mod)` bits of integers
-+ * `a` and `b`.
-+ *
-+ * @code{.c}
-+ * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10  (0x1) < 0x02 %
-+ * 0x10  (0x2) av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11)
-+ * > 0x02 % 0x20 (0x02)
-+ * @endcode
-+ *
-+ * @param a Operand
-+ * @param b Operand
-+ * @param mod Divisor; must be a power of 2
-+ * @return
-+ *         - a negative value if `a % mod < b % mod`
-+ *         - a positive value if `a % mod > b % mod`
-+ *         - zero             if `a % mod == b % mod`
-+ */
-+int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);
-+
-+/**
-+ * Rescale a timestamp while preserving known durations.
-+ *
-+ * This function is designed to be called per audio packet to scale the input
-+ * timestamp to a different time base. Compared to a simple av_rescale_q()
-+ * call, this function is robust against possible inconsistent frame durations.
-+ *
-+ * The `last` parameter is a state variable that must be preserved for all
-+ * subsequent calls for the same stream. For the first call, `*last` should be
-+ * initialized to #AV_NOPTS_VALUE.
-+ *
-+ * @param[in]     in_tb    Input time base
-+ * @param[in]     in_ts    Input timestamp
-+ * @param[in]     fs_tb    Duration time base; typically this is finer-grained
-+ *                         (greater) than `in_tb` and `out_tb`
-+ * @param[in]     duration Duration till the next call to this function (i.e.
-+ *                         duration of the current packet/frame)
-+ * @param[in,out] last     Pointer to a timestamp expressed in terms of
-+ *                         `fs_tb`, acting as a state variable
-+ * @param[in]     out_tb   Output timebase
-+ * @return        Timestamp expressed in terms of `out_tb`
-+ *
-+ * @note In the context of this function, "duration" is in term of samples, not
-+ *       seconds.
-+ */
-+int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb,
-+                         int duration, int64_t* last, AVRational out_tb);
-+
-+/**
-+ * Add a value to a timestamp.
-+ *
-+ * This function guarantees that when the same value is repeatly added that
-+ * no accumulation of rounding errors occurs.
-+ *
-+ * @param[in] ts     Input timestamp
-+ * @param[in] ts_tb  Input timestamp time base
-+ * @param[in] inc    Value to be added
-+ * @param[in] inc_tb Time base of `inc`
-+ */
-+int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb,
-+                      int64_t inc);
-+
-+/**
-+ * 0th order modified bessel function of the first kind.
-+ */
-+double av_bessel_i0(double x);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_MATHEMATICS_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/mem.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/mem.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/mem.h
-@@ -0,0 +1,611 @@
-+/*
-+ * copyright (c) 2006 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 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
-+ * @ingroup lavu_mem
-+ * Memory handling functions
-+ */
-+
-+#ifndef AVUTIL_MEM_H
-+#define AVUTIL_MEM_H
-+
-+#include <stddef.h>
-+#include <stdint.h>
-+
-+#include "attributes.h"
-+
-+/**
-+ * @addtogroup lavu_mem
-+ * Utilities for manipulating memory.
-+ *
-+ * FFmpeg has several applications of memory that are not required of a typical
-+ * program. For example, the computing-heavy components like video decoding and
-+ * encoding can be sped up significantly through the use of aligned memory.
-+ *
-+ * However, for each of FFmpeg's applications of memory, there might not be a
-+ * recognized or standardized API for that specific use. Memory alignment, for
-+ * instance, varies wildly depending on operating systems, architectures, and
-+ * compilers. Hence, this component of @ref libavutil is created to make
-+ * dealing with memory consistently possible on all platforms.
-+ *
-+ * @{
-+ */
-+
-+/**
-+ * @defgroup lavu_mem_attrs Function Attributes
-+ * Function attributes applicable to memory handling functions.
-+ *
-+ * These function attributes can help compilers emit more useful warnings, or
-+ * generate better code.
-+ * @{
-+ */
-+
-+/**
-+ * @def av_malloc_attrib
-+ * Function attribute denoting a malloc-like function.
-+ *
-+ * @see <a
-+ * href="https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-g_t_0040code_007bmalloc_007d-function-attribute-3251">Function
-+ * attribute `malloc` in GCC's documentation</a>
-+ */
-+
-+#if AV_GCC_VERSION_AT_LEAST(3, 1)
-+#  define av_malloc_attrib __attribute__((__malloc__))
-+#else
-+#  define av_malloc_attrib
-+#endif
-+
-+/**
-+ * @def av_alloc_size(...)
-+ * Function attribute used on a function that allocates memory, whose size is
-+ * given by the specified parameter(s).
-+ *
-+ * @code{.c}
-+ * void *av_malloc(size_t size) av_alloc_size(1);
-+ * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2);
-+ * @endcode
-+ *
-+ * @param ... One or two parameter indexes, separated by a comma
-+ *
-+ * @see <a
-+ * href="https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-g_t_0040code_007balloc_005fsize_007d-function-attribute-3220">Function
-+ * attribute `alloc_size` in GCC's documentation</a>
-+ */
-+
-+#if AV_GCC_VERSION_AT_LEAST(4, 3)
-+#  define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
-+#else
-+#  define av_alloc_size(...)
-+#endif
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * @defgroup lavu_mem_funcs Heap Management
-+ * Functions responsible for allocating, freeing, and copying memory.
-+ *
-+ * All memory allocation functions have a built-in upper limit of `INT_MAX`
-+ * bytes. This may be changed with av_max_alloc(), although exercise extreme
-+ * caution when doing so.
-+ *
-+ * @{
-+ */
-+
-+/**
-+ * Allocate a memory block with alignment suitable for all memory accesses
-+ * (including vectors if available on the CPU).
-+ *
-+ * @param size Size in bytes for the memory block to be allocated
-+ * @return Pointer to the allocated block, or `NULL` if the block cannot
-+ *         be allocated
-+ * @see av_mallocz()
-+ */
-+void* av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
-+
-+/**
-+ * Allocate a memory block with alignment suitable for all memory accesses
-+ * (including vectors if available on the CPU) and zero all the bytes of the
-+ * block.
-+ *
-+ * @param size Size in bytes for the memory block to be allocated
-+ * @return Pointer to the allocated block, or `NULL` if it cannot be allocated
-+ * @see av_malloc()
-+ */
-+void* av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1);
-+
-+/**
-+ * Allocate a memory block for an array with av_malloc().
-+ *
-+ * The allocated memory will have size `size * nmemb` bytes.
-+ *
-+ * @param nmemb Number of element
-+ * @param size  Size of a single element
-+ * @return Pointer to the allocated block, or `NULL` if the block cannot
-+ *         be allocated
-+ * @see av_malloc()
-+ */
-+av_alloc_size(1, 2) void* av_malloc_array(size_t nmemb, size_t size);
-+
-+/**
-+ * Allocate a memory block for an array with av_mallocz().
-+ *
-+ * The allocated memory will have size `size * nmemb` bytes.
-+ *
-+ * @param nmemb Number of elements
-+ * @param size  Size of the single element
-+ * @return Pointer to the allocated block, or `NULL` if the block cannot
-+ *         be allocated
-+ *
-+ * @see av_mallocz()
-+ * @see av_malloc_array()
-+ */
-+void* av_calloc(size_t nmemb, size_t size) av_malloc_attrib av_alloc_size(1, 2);
-+
-+/**
-+ * Allocate, reallocate, or free a block of memory.
-+ *
-+ * If `ptr` is `NULL` and `size` > 0, allocate a new block. Otherwise, expand or
-+ * shrink that block of memory according to `size`.
-+ *
-+ * @param ptr  Pointer to a memory block already allocated with
-+ *             av_realloc() or `NULL`
-+ * @param size Size in bytes of the memory block to be allocated or
-+ *             reallocated
-+ *
-+ * @return Pointer to a newly-reallocated block or `NULL` if the block
-+ *         cannot be reallocated
-+ *
-+ * @warning Unlike av_malloc(), the returned pointer is not guaranteed to be
-+ *          correctly aligned. The returned pointer must be freed after even
-+ *          if size is zero.
-+ * @see av_fast_realloc()
-+ * @see av_reallocp()
-+ */
-+void* av_realloc(void* ptr, size_t size) av_alloc_size(2);
-+
-+/**
-+ * Allocate, reallocate, or free a block of memory through a pointer to a
-+ * pointer.
-+ *
-+ * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is
-+ * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or
-+ * shrink that block of memory according to `size`.
-+ *
-+ * @param[in,out] ptr  Pointer to a pointer to a memory block already allocated
-+ *                     with av_realloc(), or a pointer to `NULL`. The pointer
-+ *                     is updated on success, or freed on failure.
-+ * @param[in]     size Size in bytes for the memory block to be allocated or
-+ *                     reallocated
-+ *
-+ * @return Zero on success, an AVERROR error code on failure
-+ *
-+ * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be
-+ *          correctly aligned.
-+ */
-+av_warn_unused_result int av_reallocp(void* ptr, size_t size);
-+
-+/**
-+ * Allocate, reallocate, or free a block of memory.
-+ *
-+ * This function does the same thing as av_realloc(), except:
-+ * - It takes two size arguments and allocates `nelem * elsize` bytes,
-+ *   after checking the result of the multiplication for integer overflow.
-+ * - It frees the input block in case of failure, thus avoiding the memory
-+ *   leak with the classic
-+ *   @code{.c}
-+ *   buf = realloc(buf);
-+ *   if (!buf)
-+ *       return -1;
-+ *   @endcode
-+ *   pattern.
-+ */
-+void* av_realloc_f(void* ptr, size_t nelem, size_t elsize);
-+
-+/**
-+ * Allocate, reallocate, or free an array.
-+ *
-+ * If `ptr` is `NULL` and `nmemb` > 0, allocate a new block.
-+ *
-+ * @param ptr   Pointer to a memory block already allocated with
-+ *              av_realloc() or `NULL`
-+ * @param nmemb Number of elements in the array
-+ * @param size  Size of the single element of the array
-+ *
-+ * @return Pointer to a newly-reallocated block or NULL if the block
-+ *         cannot be reallocated
-+ *
-+ * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be
-+ *          correctly aligned. The returned pointer must be freed after even if
-+ *          nmemb is zero.
-+ * @see av_reallocp_array()
-+ */
-+av_alloc_size(2, 3) void* av_realloc_array(void* ptr, size_t nmemb,
-+                                           size_t size);
-+
-+/**
-+ * Allocate, reallocate an array through a pointer to a pointer.
-+ *
-+ * If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block.
-+ *
-+ * @param[in,out] ptr   Pointer to a pointer to a memory block already
-+ *                      allocated with av_realloc(), or a pointer to `NULL`.
-+ *                      The pointer is updated on success, or freed on failure.
-+ * @param[in]     nmemb Number of elements
-+ * @param[in]     size  Size of the single element
-+ *
-+ * @return Zero on success, an AVERROR error code on failure
-+ *
-+ * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be
-+ *          correctly aligned. *ptr must be freed after even if nmemb is zero.
-+ */
-+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.
-+ *
-+ * If the given buffer is `NULL`, then a new uninitialized buffer is allocated.
-+ *
-+ * If the given buffer is not large enough, and reallocation fails, `NULL` is
-+ * returned and `*size` is set to 0, but the original buffer is not changed or
-+ * freed.
-+ *
-+ * A typical use pattern follows:
-+ *
-+ * @code{.c}
-+ * uint8_t *buf = ...;
-+ * uint8_t *new_buf = av_fast_realloc(buf, &current_size, size_needed);
-+ * if (!new_buf) {
-+ *     // Allocation failed; clean up original buffer
-+ *     av_freep(&buf);
-+ *     return AVERROR(ENOMEM);
-+ * }
-+ * @endcode
-+ *
-+ * @param[in,out] ptr      Already allocated buffer, or `NULL`
-+ * @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
-+ * @see av_realloc()
-+ * @see av_fast_malloc()
-+ */
-+void* av_fast_realloc(void* ptr, unsigned int* size, size_t min_size);
-+
-+/**
-+ * Allocate a buffer, reusing the given one if large enough.
-+ *
-+ * Contrary to av_fast_realloc(), the current buffer contents might not be
-+ * preserved and on error the old buffer is freed, thus no special handling to
-+ * avoid memleaks is necessary.
-+ *
-+ * `*ptr` is allowed to be `NULL`, in which case allocation always happens if
-+ * `size_needed` is greater than 0.
-+ *
-+ * @code{.c}
-+ * uint8_t *buf = ...;
-+ * av_fast_malloc(&buf, &current_size, size_needed);
-+ * if (!buf) {
-+ *     // Allocation failed; buf already freed
-+ *     return AVERROR(ENOMEM);
-+ * }
-+ * @endcode
-+ *
-+ * @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 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()
-+ */
-+void av_fast_malloc(void* ptr, unsigned int* size, size_t min_size);
-+
-+/**
-+ * Allocate and clear a buffer, reusing the given one if large enough.
-+ *
-+ * Like av_fast_malloc(), but all newly allocated space is initially cleared.
-+ * Reused buffer is not cleared.
-+ *
-+ * `*ptr` is allowed to be `NULL`, in which case allocation always happens if
-+ * `size_needed` is greater than 0.
-+ *
-+ * @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 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);
-+
-+/**
-+ * Free a memory block which has been allocated with a function of av_malloc()
-+ * or av_realloc() family.
-+ *
-+ * @param ptr Pointer to the memory block which should be freed.
-+ *
-+ * @note `ptr = NULL` is explicitly allowed.
-+ * @note It is recommended that you use av_freep() instead, to prevent leaving
-+ *       behind dangling pointers.
-+ * @see av_freep()
-+ */
-+void av_free(void* ptr);
-+
-+/**
-+ * Free a memory block which has been allocated with a function of av_malloc()
-+ * or av_realloc() family, and set the pointer pointing to it to `NULL`.
-+ *
-+ * @code{.c}
-+ * uint8_t *buf = av_malloc(16);
-+ * av_free(buf);
-+ * // buf now contains a dangling pointer to freed memory, and accidental
-+ * // dereference of buf will result in a use-after-free, which may be a
-+ * // security risk.
-+ *
-+ * uint8_t *buf = av_malloc(16);
-+ * av_freep(&buf);
-+ * // buf is now NULL, and accidental dereference will only result in a
-+ * // NULL-pointer dereference.
-+ * @endcode
-+ *
-+ * @param ptr Pointer to the pointer to the memory block which should be freed
-+ * @note `*ptr = NULL` is safe and leads to no action.
-+ * @see av_free()
-+ */
-+void av_freep(void* ptr);
-+
-+/**
-+ * Duplicate a string.
-+ *
-+ * @param s String to be duplicated
-+ * @return Pointer to a newly-allocated string containing a
-+ *         copy of `s` or `NULL` if the string cannot be allocated
-+ * @see av_strndup()
-+ */
-+char* av_strdup(const char* s) av_malloc_attrib;
-+
-+/**
-+ * Duplicate a substring of a string.
-+ *
-+ * @param s   String to be duplicated
-+ * @param len Maximum length of the resulting string (not counting the
-+ *            terminating byte)
-+ * @return Pointer to a newly-allocated string containing a
-+ *         substring of `s` or `NULL` if the string cannot be allocated
-+ */
-+char* av_strndup(const char* s, size_t len) av_malloc_attrib;
-+
-+/**
-+ * Duplicate a buffer with av_malloc().
-+ *
-+ * @param p    Buffer to be duplicated
-+ * @param size Size in bytes of the buffer copied
-+ * @return Pointer to a newly allocated buffer containing a
-+ *         copy of `p` or `NULL` if the buffer cannot be allocated
-+ */
-+void* av_memdup(const void* p, size_t size);
-+
-+/**
-+ * Overlapping memcpy() implementation.
-+ *
-+ * @param dst  Destination buffer
-+ * @param back Number of bytes back to start copying (i.e. the initial size of
-+ *             the overlapping window); must be > 0
-+ * @param cnt  Number of bytes to copy; must be >= 0
-+ *
-+ * @note `cnt > back` is valid, this will copy the bytes we just copied,
-+ *       thus creating a repeating pattern with a period length of `back`.
-+ */
-+void av_memcpy_backptr(uint8_t* dst, int back, int cnt);
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * @defgroup lavu_mem_dynarray Dynamic Array
-+ *
-+ * Utilities to make an array grow when needed.
-+ *
-+ * Sometimes, the programmer would want to have an array that can grow when
-+ * needed. The libavutil dynamic array utilities fill that need.
-+ *
-+ * libavutil supports two systems of appending elements onto a dynamically
-+ * allocated array, the first one storing the pointer to the value in the
-+ * array, and the second storing the value directly. In both systems, the
-+ * caller is responsible for maintaining a variable containing the length of
-+ * the array, as well as freeing of the array after use.
-+ *
-+ * The first system stores pointers to values in a block of dynamically
-+ * allocated memory. Since only pointers are stored, the function does not need
-+ * to know the size of the type. Both av_dynarray_add() and
-+ * av_dynarray_add_nofree() implement this system.
-+ *
-+ * @code
-+ * type **array = NULL; //< an array of pointers to values
-+ * int    nb    = 0;    //< a variable to keep track of the length of the array
-+ *
-+ * type to_be_added  = ...;
-+ * type to_be_added2 = ...;
-+ *
-+ * av_dynarray_add(&array, &nb, &to_be_added);
-+ * if (nb == 0)
-+ *     return AVERROR(ENOMEM);
-+ *
-+ * av_dynarray_add(&array, &nb, &to_be_added2);
-+ * if (nb == 0)
-+ *     return AVERROR(ENOMEM);
-+ *
-+ * // Now:
-+ * //  nb           == 2
-+ * // &to_be_added  == array[0]
-+ * // &to_be_added2 == array[1]
-+ *
-+ * av_freep(&array);
-+ * @endcode
-+ *
-+ * The second system stores the value directly in a block of memory. As a
-+ * result, the function has to know the size of the type. av_dynarray2_add()
-+ * implements this mechanism.
-+ *
-+ * @code
-+ * type *array = NULL; //< an array of values
-+ * int   nb    = 0;    //< a variable to keep track of the length of the array
-+ *
-+ * type to_be_added  = ...;
-+ * type to_be_added2 = ...;
-+ *
-+ * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL);
-+ * if (!addr)
-+ *     return AVERROR(ENOMEM);
-+ * memcpy(addr, &to_be_added, sizeof(to_be_added));
-+ *
-+ * // Shortcut of the above.
-+ * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array),
-+ *                               (const void *)&to_be_added2);
-+ * if (!addr)
-+ *     return AVERROR(ENOMEM);
-+ *
-+ * // Now:
-+ * //  nb           == 2
-+ * //  to_be_added  == array[0]
-+ * //  to_be_added2 == array[1]
-+ *
-+ * av_freep(&array);
-+ * @endcode
-+ *
-+ * @{
-+ */
-+
-+/**
-+ * Add the pointer to an element to a dynamic array.
-+ *
-+ * The array to grow is supposed to be an array of pointers to
-+ * structures, and the element to add must be a pointer to an already
-+ * allocated structure.
-+ *
-+ * The array is reallocated when its size reaches powers of 2.
-+ * Therefore, the amortized cost of adding an element is constant.
-+ *
-+ * In case of success, the pointer to the array is updated in order to
-+ * point to the new grown array, and the number pointed to by `nb_ptr`
-+ * is incremented.
-+ * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and
-+ * `*nb_ptr` is set to 0.
-+ *
-+ * @param[in,out] tab_ptr Pointer to the array to grow
-+ * @param[in,out] nb_ptr  Pointer to the number of elements in the array
-+ * @param[in]     elem    Element to add
-+ * @see av_dynarray_add_nofree(), av_dynarray2_add()
-+ */
-+void av_dynarray_add(void* tab_ptr, int* nb_ptr, void* elem);
-+
-+/**
-+ * Add an element to a dynamic array.
-+ *
-+ * Function has the same functionality as av_dynarray_add(),
-+ * but it doesn't free memory on fails. It returns error code
-+ * instead and leave current buffer untouched.
-+ *
-+ * @return >=0 on success, negative otherwise
-+ * @see av_dynarray_add(), av_dynarray2_add()
-+ */
-+av_warn_unused_result int av_dynarray_add_nofree(void* tab_ptr, int* nb_ptr,
-+                                                 void* elem);
-+
-+/**
-+ * Add an element of size `elem_size` 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.
-+ *
-+ * In case of success, the pointer to the array is updated in order to
-+ * point to the new grown array, and the number pointed to by `nb_ptr`
-+ * is incremented.
-+ * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and
-+ * `*nb_ptr` is set to 0.
-+ *
-+ * @param[in,out] tab_ptr   Pointer to the array to grow
-+ * @param[in,out] nb_ptr    Pointer to the number of elements in the array
-+ * @param[in]     elem_size Size in bytes of an element in the array
-+ * @param[in]     elem_data Pointer to the data of the element to add. If
-+ *                          `NULL`, the space of the newly added element is
-+ *                          allocated but left uninitialized.
-+ *
-+ * @return Pointer to the data of the element to copy in the newly allocated
-+ *         space
-+ * @see av_dynarray_add(), av_dynarray_add_nofree()
-+ */
-+void* av_dynarray2_add(void** tab_ptr, int* nb_ptr, size_t elem_size,
-+                       const uint8_t* elem_data);
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * @defgroup lavu_mem_misc Miscellaneous Functions
-+ *
-+ * Other functions related to memory allocation.
-+ *
-+ * @{
-+ */
-+
-+/**
-+ * Multiply two `size_t` values checking for overflow.
-+ *
-+ * @param[in]  a   Operand of multiplication
-+ * @param[in]  b   Operand of multiplication
-+ * @param[out] r   Pointer to the result of the operation
-+ * @return 0 on success, AVERROR(EINVAL) on overflow
-+ */
-+int av_size_mult(size_t a, size_t b, size_t* r);
-+
-+/**
-+ * Set the maximum size that may be allocated in one block.
-+ *
-+ * The value specified with this function is effective for all libavutil's @ref
-+ * lavu_mem_funcs "heap management functions."
-+ *
-+ * By default, the max value is defined as `INT_MAX`.
-+ *
-+ * @param max Value to be set as the new maximum size
-+ *
-+ * @warning Exercise extreme caution when using this function. Don't touch
-+ *          this if you do not understand the full consequence of doing so.
-+ */
-+void av_max_alloc(size_t max);
-+
-+/**
-+ * @}
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_MEM_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/pixfmt.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/pixfmt.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/pixfmt.h
-@@ -0,0 +1,920 @@
-+/*
-+ * copyright (c) 2006 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 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_PIXFMT_H
-+#define AVUTIL_PIXFMT_H
-+
-+/**
-+ * @file
-+ * pixel format definitions
-+ */
-+
-+#include "libavutil/avconfig.h"
-+#include "version.h"
-+
-+#define AVPALETTE_SIZE 1024
-+#define AVPALETTE_COUNT 256
-+
-+/**
-+ * Maximum number of planes in any pixel format.
-+ * This should be used when a maximum is needed, but code should not
-+ * be written to require a maximum for no good reason.
-+ */
-+#define AV_VIDEO_MAX_PLANES 4
-+
-+/**
-+ * Pixel format.
-+ *
-+ * @note
-+ * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA
-+ * color is put together as:
-+ *  (A << 24) | (R << 16) | (G << 8) | B
-+ * This is stored as BGRA on little-endian CPU architectures and ARGB on
-+ * big-endian CPUs.
-+ *
-+ * @note
-+ * If the resolution is not a multiple of the chroma subsampling factor
-+ * then the chroma plane resolution must be rounded up.
-+ *
-+ * @par
-+ * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized
-+ * image data is stored in AVFrame.data[0]. The palette is transported in
-+ * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is
-+ * formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is
-+ * also endian-specific). Note also that the individual RGB32 palette
-+ * components stored in AVFrame.data[1] should be in the range 0..255.
-+ * This is important as many custom PAL8 video codecs that were designed
-+ * to run on the IBM VGA graphics adapter use 6-bit palette components.
-+ *
-+ * @par
-+ * For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like
-+ * for pal8. This palette is filled in automatically by the function
-+ * allocating the picture.
-+ */
-+enum AVPixelFormat {
-+  AV_PIX_FMT_NONE = -1,
-+  AV_PIX_FMT_YUV420P,  ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y
-+                       ///< samples)
-+  AV_PIX_FMT_YUYV422,  ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
-+  AV_PIX_FMT_RGB24,    ///< packed RGB 8:8:8, 24bpp, RGBRGB...
-+  AV_PIX_FMT_BGR24,    ///< packed RGB 8:8:8, 24bpp, BGRBGR...
-+  AV_PIX_FMT_YUV422P,  ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y
-+                       ///< samples)
-+  AV_PIX_FMT_YUV444P,  ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y
-+                       ///< samples)
-+  AV_PIX_FMT_YUV410P,  ///< planar YUV 4:1:0,  9bpp, (1 Cr & Cb sample per 4x4 Y
-+                       ///< samples)
-+  AV_PIX_FMT_YUV411P,  ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y
-+                       ///< samples)
-+  AV_PIX_FMT_GRAY8,    ///<        Y        ,  8bpp
-+  AV_PIX_FMT_MONOWHITE,  ///<        Y        ,  1bpp, 0 is white, 1 is black,
-+                         ///<        in each byte pixels are ordered from the
-+                         ///<        msb to the lsb
-+  AV_PIX_FMT_MONOBLACK,  ///<        Y        ,  1bpp, 0 is black, 1 is white,
-+                         ///<        in each byte pixels are ordered from the
-+                         ///<        msb to the lsb
-+  AV_PIX_FMT_PAL8,       ///< 8 bits with AV_PIX_FMT_RGB32 palette
-+  AV_PIX_FMT_YUVJ420P,   ///< planar YUV 4:2:0, 12bpp, full scale (JPEG),
-+                         ///< deprecated in favor of AV_PIX_FMT_YUV420P and
-+                         ///< setting color_range
-+  AV_PIX_FMT_YUVJ422P,   ///< planar YUV 4:2:2, 16bpp, full scale (JPEG),
-+                         ///< deprecated in favor of AV_PIX_FMT_YUV422P and
-+                         ///< setting color_range
-+  AV_PIX_FMT_YUVJ444P,   ///< planar YUV 4:4:4, 24bpp, full scale (JPEG),
-+                         ///< deprecated in favor of AV_PIX_FMT_YUV444P and
-+                         ///< setting color_range
-+  AV_PIX_FMT_UYVY422,    ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
-+  AV_PIX_FMT_UYYVYY411,  ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
-+  AV_PIX_FMT_BGR8,       ///< packed RGB 3:3:2,  8bpp, (msb)2B 3G 3R(lsb)
-+  AV_PIX_FMT_BGR4,  ///< packed RGB 1:2:1 bitstream,  4bpp, (msb)1B 2G 1R(lsb),
-+                    ///< a byte contains two pixels, the first pixel in the byte
-+                    ///< is the one composed by the 4 msb bits
-+  AV_PIX_FMT_BGR4_BYTE,  ///< packed RGB 1:2:1,  8bpp, (msb)1B 2G 1R(lsb)
-+  AV_PIX_FMT_RGB8,       ///< packed RGB 3:3:2,  8bpp, (msb)3R 3G 2B(lsb)
-+  AV_PIX_FMT_RGB4,  ///< packed RGB 1:2:1 bitstream,  4bpp, (msb)1R 2G 1B(lsb),
-+                    ///< a byte contains two pixels, the first pixel in the byte
-+                    ///< is the one composed by the 4 msb bits
-+  AV_PIX_FMT_RGB4_BYTE,  ///< packed RGB 1:2:1,  8bpp, (msb)1R 2G 1B(lsb)
-+  AV_PIX_FMT_NV12,  ///< planar YUV 4:2:0, 12bpp, 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_NV21,  ///< as above, but U and V bytes are swapped
-+
-+  AV_PIX_FMT_ARGB,  ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
-+  AV_PIX_FMT_RGBA,  ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
-+  AV_PIX_FMT_ABGR,  ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
-+  AV_PIX_FMT_BGRA,  ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
-+
-+  AV_PIX_FMT_GRAY16BE,  ///<        Y        , 16bpp, big-endian
-+  AV_PIX_FMT_GRAY16LE,  ///<        Y        , 16bpp, little-endian
-+  AV_PIX_FMT_YUV440P,   ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y
-+                        ///< samples)
-+  AV_PIX_FMT_YUVJ440P,  ///< planar YUV 4:4:0 full scale (JPEG), deprecated in
-+                        ///< favor of AV_PIX_FMT_YUV440P and setting color_range
-+  AV_PIX_FMT_YUVA420P,  ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2
-+                        ///< Y & A samples)
-+  AV_PIX_FMT_RGB48BE,   ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the
-+                        ///< 2-byte value for each R/G/B component is stored as
-+                        ///< big-endian
-+  AV_PIX_FMT_RGB48LE,   ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the
-+                        ///< 2-byte value for each R/G/B component is stored as
-+                        ///< little-endian
-+
-+  AV_PIX_FMT_RGB565BE,  ///< packed RGB 5:6:5, 16bpp, (msb)   5R 6G 5B(lsb),
-+                        ///< big-endian
-+  AV_PIX_FMT_RGB565LE,  ///< packed RGB 5:6:5, 16bpp, (msb)   5R 6G 5B(lsb),
-+                        ///< little-endian
-+  AV_PIX_FMT_RGB555BE,  ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb),
-+                        ///< big-endian   , X=unused/undefined
-+  AV_PIX_FMT_RGB555LE,  ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb),
-+                        ///< little-endian, X=unused/undefined
-+
-+  AV_PIX_FMT_BGR565BE,  ///< packed BGR 5:6:5, 16bpp, (msb)   5B 6G 5R(lsb),
-+                        ///< big-endian
-+  AV_PIX_FMT_BGR565LE,  ///< packed BGR 5:6:5, 16bpp, (msb)   5B 6G 5R(lsb),
-+                        ///< little-endian
-+  AV_PIX_FMT_BGR555BE,  ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb),
-+                        ///< big-endian   , X=unused/undefined
-+  AV_PIX_FMT_BGR555LE,  ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb),
-+                        ///< little-endian, X=unused/undefined
-+
-+  /**
-+   *  Hardware acceleration through VA-API, data[3] contains a
-+   *  VASurfaceID.
-+   */
-+  AV_PIX_FMT_VAAPI,
-+
-+  AV_PIX_FMT_YUV420P16LE,  ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per
-+                           ///< 2x2 Y samples), little-endian
-+  AV_PIX_FMT_YUV420P16BE,  ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per
-+                           ///< 2x2 Y samples), big-endian
-+  AV_PIX_FMT_YUV422P16LE,  ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per
-+                           ///< 2x1 Y samples), little-endian
-+  AV_PIX_FMT_YUV422P16BE,  ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per
-+                           ///< 2x1 Y samples), big-endian
-+  AV_PIX_FMT_YUV444P16LE,  ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per
-+                           ///< 1x1 Y samples), little-endian
-+  AV_PIX_FMT_YUV444P16BE,  ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per
-+                           ///< 1x1 Y samples), big-endian
-+  AV_PIX_FMT_DXVA2_VLD,    ///< HW decoding through DXVA2, Picture.data[3]
-+                           ///< contains a LPDIRECT3DSURFACE9 pointer
-+
-+  AV_PIX_FMT_RGB444LE,  ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb),
-+                        ///< little-endian, X=unused/undefined
-+  AV_PIX_FMT_RGB444BE,  ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb),
-+                        ///< big-endian,    X=unused/undefined
-+  AV_PIX_FMT_BGR444LE,  ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb),
-+                        ///< little-endian, X=unused/undefined
-+  AV_PIX_FMT_BGR444BE,  ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb),
-+                        ///< big-endian,    X=unused/undefined
-+  AV_PIX_FMT_YA8,       ///< 8 bits gray, 8 bits alpha
-+
-+  AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8,   ///< alias for AV_PIX_FMT_YA8
-+  AV_PIX_FMT_GRAY8A = AV_PIX_FMT_YA8,  ///< alias for AV_PIX_FMT_YA8
-+
-+  AV_PIX_FMT_BGR48BE,  ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the
-+                       ///< 2-byte value for each R/G/B component is stored as
-+                       ///< big-endian
-+  AV_PIX_FMT_BGR48LE,  ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the
-+                       ///< 2-byte value for each R/G/B component is stored as
-+                       ///< little-endian
-+
-+  /**
-+   * The following 12 formats have the disadvantage of needing 1 format for each
-+   * bit depth. Notice that each 9/10 bits sample is stored in 16 bits with
-+   * extra padding. If you want to support multiple bit depths, then using
-+   * AV_PIX_FMT_YUV420P16* with the bpp stored separately is better.
-+   */
-+  AV_PIX_FMT_YUV420P9BE,   ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per
-+                           ///< 2x2 Y samples), big-endian
-+  AV_PIX_FMT_YUV420P9LE,   ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per
-+                           ///< 2x2 Y samples), little-endian
-+  AV_PIX_FMT_YUV420P10BE,  ///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per
-+                           ///< 2x2 Y samples), big-endian
-+  AV_PIX_FMT_YUV420P10LE,  ///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per
-+                           ///< 2x2 Y samples), little-endian
-+  AV_PIX_FMT_YUV422P10BE,  ///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per
-+                           ///< 2x1 Y samples), big-endian
-+  AV_PIX_FMT_YUV422P10LE,  ///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per
-+                           ///< 2x1 Y samples), little-endian
-+  AV_PIX_FMT_YUV444P9BE,   ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per
-+                           ///< 1x1 Y samples), big-endian
-+  AV_PIX_FMT_YUV444P9LE,   ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per
-+                           ///< 1x1 Y samples), little-endian
-+  AV_PIX_FMT_YUV444P10BE,  ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per
-+                           ///< 1x1 Y samples), big-endian
-+  AV_PIX_FMT_YUV444P10LE,  ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per
-+                           ///< 1x1 Y samples), little-endian
-+  AV_PIX_FMT_YUV422P9BE,   ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per
-+                           ///< 2x1 Y samples), big-endian
-+  AV_PIX_FMT_YUV422P9LE,   ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per
-+                           ///< 2x1 Y samples), little-endian
-+  AV_PIX_FMT_GBRP,         ///< planar GBR 4:4:4 24bpp
-+  AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP,  // alias for #AV_PIX_FMT_GBRP
-+  AV_PIX_FMT_GBRP9BE,                   ///< planar GBR 4:4:4 27bpp, big-endian
-+  AV_PIX_FMT_GBRP9LE,   ///< planar GBR 4:4:4 27bpp, little-endian
-+  AV_PIX_FMT_GBRP10BE,  ///< planar GBR 4:4:4 30bpp, big-endian
-+  AV_PIX_FMT_GBRP10LE,  ///< planar GBR 4:4:4 30bpp, little-endian
-+  AV_PIX_FMT_GBRP16BE,  ///< planar GBR 4:4:4 48bpp, big-endian
-+  AV_PIX_FMT_GBRP16LE,  ///< planar GBR 4:4:4 48bpp, little-endian
-+  AV_PIX_FMT_YUVA422P,  ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y
-+                        ///< & A samples)
-+  AV_PIX_FMT_YUVA444P,  ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y
-+                        ///< & A samples)
-+  AV_PIX_FMT_YUVA420P9BE,   ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per
-+                            ///< 2x2 Y & A samples), big-endian
-+  AV_PIX_FMT_YUVA420P9LE,   ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per
-+                            ///< 2x2 Y & A samples), little-endian
-+  AV_PIX_FMT_YUVA422P9BE,   ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per
-+                            ///< 2x1 Y & A samples), big-endian
-+  AV_PIX_FMT_YUVA422P9LE,   ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per
-+                            ///< 2x1 Y & A samples), little-endian
-+  AV_PIX_FMT_YUVA444P9BE,   ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per
-+                            ///< 1x1 Y & A samples), big-endian
-+  AV_PIX_FMT_YUVA444P9LE,   ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per
-+                            ///< 1x1 Y & A samples), little-endian
-+  AV_PIX_FMT_YUVA420P10BE,  ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per
-+                            ///< 2x2 Y & A samples, big-endian)
-+  AV_PIX_FMT_YUVA420P10LE,  ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per
-+                            ///< 2x2 Y & A samples, little-endian)
-+  AV_PIX_FMT_YUVA422P10BE,  ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per
-+                            ///< 2x1 Y & A samples, big-endian)
-+  AV_PIX_FMT_YUVA422P10LE,  ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per
-+                            ///< 2x1 Y & A samples, little-endian)
-+  AV_PIX_FMT_YUVA444P10BE,  ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per
-+                            ///< 1x1 Y & A samples, big-endian)
-+  AV_PIX_FMT_YUVA444P10LE,  ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per
-+                            ///< 1x1 Y & A samples, little-endian)
-+  AV_PIX_FMT_YUVA420P16BE,  ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per
-+                            ///< 2x2 Y & A samples, big-endian)
-+  AV_PIX_FMT_YUVA420P16LE,  ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per
-+                            ///< 2x2 Y & A samples, little-endian)
-+  AV_PIX_FMT_YUVA422P16BE,  ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per
-+                            ///< 2x1 Y & A samples, big-endian)
-+  AV_PIX_FMT_YUVA422P16LE,  ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per
-+                            ///< 2x1 Y & A samples, little-endian)
-+  AV_PIX_FMT_YUVA444P16BE,  ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per
-+                            ///< 1x1 Y & A samples, big-endian)
-+  AV_PIX_FMT_YUVA444P16LE,  ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per
-+                            ///< 1x1 Y & A samples, little-endian)
-+
-+  AV_PIX_FMT_VDPAU,  ///< HW acceleration through VDPAU, Picture.data[3]
-+                     ///< contains a VdpVideoSurface
-+
-+  AV_PIX_FMT_XYZ12LE,  ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb),
-+                       ///< the 2-byte value for each X/Y/Z is stored as
-+                       ///< little-endian, the 4 lower bits are set to 0
-+  AV_PIX_FMT_XYZ12BE,  ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb),
-+                       ///< the 2-byte value for each X/Y/Z is stored as
-+                       ///< big-endian, the 4 lower bits are set to 0
-+  AV_PIX_FMT_NV16,  ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample
-+                    ///< per 2x1 Y samples)
-+  AV_PIX_FMT_NV20LE,  ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb
-+                      ///< sample per 2x1 Y samples), little-endian
-+  AV_PIX_FMT_NV20BE,  ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb
-+                      ///< sample per 2x1 Y samples), big-endian
-+
-+  AV_PIX_FMT_RGBA64BE,  ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A,
-+                        ///< the 2-byte value for each R/G/B/A component is
-+                        ///< stored as big-endian
-+  AV_PIX_FMT_RGBA64LE,  ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A,
-+                        ///< the 2-byte value for each R/G/B/A component is
-+                        ///< stored as little-endian
-+  AV_PIX_FMT_BGRA64BE,  ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A,
-+                        ///< the 2-byte value for each R/G/B/A component is
-+                        ///< stored as big-endian
-+  AV_PIX_FMT_BGRA64LE,  ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A,
-+                        ///< the 2-byte value for each R/G/B/A component is
-+                        ///< stored as little-endian
-+
-+  AV_PIX_FMT_YVYU422,  ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb
-+
-+  AV_PIX_FMT_YA16BE,  ///< 16 bits gray, 16 bits alpha (big-endian)
-+  AV_PIX_FMT_YA16LE,  ///< 16 bits gray, 16 bits alpha (little-endian)
-+
-+  AV_PIX_FMT_GBRAP,      ///< planar GBRA 4:4:4:4 32bpp
-+  AV_PIX_FMT_GBRAP16BE,  ///< planar GBRA 4:4:4:4 64bpp, big-endian
-+  AV_PIX_FMT_GBRAP16LE,  ///< planar GBRA 4:4:4:4 64bpp, little-endian
-+  /**
-+   * HW acceleration through QSV, data[3] contains a pointer to the
-+   * mfxFrameSurface1 structure.
-+   *
-+   * Before FFmpeg 5.0:
-+   * mfxFrameSurface1.Data.MemId contains a pointer when importing
-+   * the following frames as QSV frames:
-+   *
-+   * VAAPI:
-+   * mfxFrameSurface1.Data.MemId contains a pointer to VASurfaceID
-+   *
-+   * DXVA2:
-+   * mfxFrameSurface1.Data.MemId contains a pointer to IDirect3DSurface9
-+   *
-+   * FFmpeg 5.0 and above:
-+   * mfxFrameSurface1.Data.MemId contains a pointer to the mfxHDLPair
-+   * structure when importing the following frames as QSV frames:
-+   *
-+   * VAAPI:
-+   * mfxHDLPair.first contains a VASurfaceID pointer.
-+   * mfxHDLPair.second is always MFX_INFINITE.
-+   *
-+   * DXVA2:
-+   * mfxHDLPair.first contains IDirect3DSurface9 pointer.
-+   * mfxHDLPair.second is always MFX_INFINITE.
-+   *
-+   * D3D11:
-+   * mfxHDLPair.first contains a ID3D11Texture2D pointer.
-+   * mfxHDLPair.second contains the texture array index of the frame if the
-+   * ID3D11Texture2D is an array texture, or always MFX_INFINITE if it is a
-+   * normal texture.
-+   */
-+  AV_PIX_FMT_QSV,
-+  /**
-+   * HW acceleration though MMAL, data[3] contains a pointer to the
-+   * MMAL_BUFFER_HEADER_T structure.
-+   */
-+  AV_PIX_FMT_MMAL,
-+
-+  AV_PIX_FMT_D3D11VA_VLD,  ///< HW decoding through Direct3D11 via old API,
-+                           ///< Picture.data[3] contains a
-+                           ///< ID3D11VideoDecoderOutputView pointer
-+
-+  /**
-+   * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers
-+   * exactly as for system memory frames.
-+   */
-+  AV_PIX_FMT_CUDA,
-+
-+  AV_PIX_FMT_0RGB,  ///< packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
-+  AV_PIX_FMT_RGB0,  ///< packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
-+  AV_PIX_FMT_0BGR,  ///< packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
-+  AV_PIX_FMT_BGR0,  ///< packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
-+
-+  AV_PIX_FMT_YUV420P12BE,  ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per
-+                           ///< 2x2 Y samples), big-endian
-+  AV_PIX_FMT_YUV420P12LE,  ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per
-+                           ///< 2x2 Y samples), little-endian
-+  AV_PIX_FMT_YUV420P14BE,  ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per
-+                           ///< 2x2 Y samples), big-endian
-+  AV_PIX_FMT_YUV420P14LE,  ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per
-+                           ///< 2x2 Y samples), little-endian
-+  AV_PIX_FMT_YUV422P12BE,  ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per
-+                           ///< 2x1 Y samples), big-endian
-+  AV_PIX_FMT_YUV422P12LE,  ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per
-+                           ///< 2x1 Y samples), little-endian
-+  AV_PIX_FMT_YUV422P14BE,  ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per
-+                           ///< 2x1 Y samples), big-endian
-+  AV_PIX_FMT_YUV422P14LE,  ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per
-+                           ///< 2x1 Y samples), little-endian
-+  AV_PIX_FMT_YUV444P12BE,  ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per
-+                           ///< 1x1 Y samples), big-endian
-+  AV_PIX_FMT_YUV444P12LE,  ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per
-+                           ///< 1x1 Y samples), little-endian
-+  AV_PIX_FMT_YUV444P14BE,  ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per
-+                           ///< 1x1 Y samples), big-endian
-+  AV_PIX_FMT_YUV444P14LE,  ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per
-+                           ///< 1x1 Y samples), little-endian
-+  AV_PIX_FMT_GBRP12BE,     ///< planar GBR 4:4:4 36bpp, big-endian
-+  AV_PIX_FMT_GBRP12LE,     ///< planar GBR 4:4:4 36bpp, little-endian
-+  AV_PIX_FMT_GBRP14BE,     ///< planar GBR 4:4:4 42bpp, big-endian
-+  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_YUV440P10LE,  ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per
-+                           ///< 1x2 Y samples), little-endian
-+  AV_PIX_FMT_YUV440P10BE,  ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per
-+                           ///< 1x2 Y samples), big-endian
-+  AV_PIX_FMT_YUV440P12LE,  ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per
-+                           ///< 1x2 Y samples), little-endian
-+  AV_PIX_FMT_YUV440P12BE,  ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per
-+                           ///< 1x2 Y samples), big-endian
-+  AV_PIX_FMT_AYUV64LE,  ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y
-+                        ///< & A samples), little-endian
-+  AV_PIX_FMT_AYUV64BE,  ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y
-+                        ///< & A samples), big-endian
-+
-+  AV_PIX_FMT_VIDEOTOOLBOX,  ///< hardware decoding through Videotoolbox
-+
-+  AV_PIX_FMT_P010LE,  ///< like NV12, with 10bpp per component, data in the high
-+                      ///< bits, zeros in the low bits, little-endian
-+  AV_PIX_FMT_P010BE,  ///< like NV12, with 10bpp per component, data in the high
-+                      ///< bits, zeros in the low bits, big-endian
-+
-+  AV_PIX_FMT_GBRAP12BE,  ///< planar GBR 4:4:4:4 48bpp, big-endian
-+  AV_PIX_FMT_GBRAP12LE,  ///< planar GBR 4:4:4:4 48bpp, little-endian
-+
-+  AV_PIX_FMT_GBRAP10BE,  ///< planar GBR 4:4:4:4 40bpp, big-endian
-+  AV_PIX_FMT_GBRAP10LE,  ///< planar GBR 4:4:4:4 40bpp, little-endian
-+
-+  AV_PIX_FMT_MEDIACODEC,  ///< hardware decoding through MediaCodec
-+
-+  AV_PIX_FMT_GRAY12BE,  ///<        Y        , 12bpp, big-endian
-+  AV_PIX_FMT_GRAY12LE,  ///<        Y        , 12bpp, little-endian
-+  AV_PIX_FMT_GRAY10BE,  ///<        Y        , 10bpp, big-endian
-+  AV_PIX_FMT_GRAY10LE,  ///<        Y        , 10bpp, little-endian
-+
-+  AV_PIX_FMT_P016LE,  ///< like NV12, with 16bpp per component, little-endian
-+  AV_PIX_FMT_P016BE,  ///< like NV12, with 16bpp per component, big-endian
-+
-+  /**
-+   * Hardware surfaces for Direct3D11.
-+   *
-+   * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11
-+   * hwaccel API and filtering support AV_PIX_FMT_D3D11 only.
-+   *
-+   * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the
-+   * texture array index of the frame as intptr_t if the ID3D11Texture2D is
-+   * an array texture (or always 0 if it's a normal texture).
-+   */
-+  AV_PIX_FMT_D3D11,
-+
-+  AV_PIX_FMT_GRAY9BE,  ///<        Y        , 9bpp, big-endian
-+  AV_PIX_FMT_GRAY9LE,  ///<        Y        , 9bpp, little-endian
-+
-+  AV_PIX_FMT_GBRPF32BE,  ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp,
-+                         ///< big-endian
-+  AV_PIX_FMT_GBRPF32LE,  ///< IEEE-754 single precision planar GBR 4:4:4, 96bpp,
-+                         ///< little-endian
-+  AV_PIX_FMT_GBRAPF32BE,  ///< IEEE-754 single precision planar GBRA 4:4:4:4,
-+                          ///< 128bpp, big-endian
-+  AV_PIX_FMT_GBRAPF32LE,  ///< IEEE-754 single precision planar GBRA 4:4:4:4,
-+                          ///< 128bpp, little-endian
-+
-+  /**
-+   * DRM-managed buffers exposed through PRIME buffer sharing.
-+   *
-+   * data[0] points to an AVDRMFrameDescriptor.
-+   */
-+  AV_PIX_FMT_DRM_PRIME,
-+  /**
-+   * Hardware surfaces for OpenCL.
-+   *
-+   * data[i] contain 2D image objects (typed in C as cl_mem, used
-+   * in OpenCL as image2d_t) for each plane of the surface.
-+   */
-+  AV_PIX_FMT_OPENCL,
-+
-+  AV_PIX_FMT_GRAY14BE,  ///<        Y        , 14bpp, big-endian
-+  AV_PIX_FMT_GRAY14LE,  ///<        Y        , 14bpp, little-endian
-+
-+  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_X2RGB10LE,  ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G
-+                         ///< 10B(lsb), little-endian, X=unused/undefined
-+  AV_PIX_FMT_X2RGB10BE,  ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G
-+                         ///< 10B(lsb), big-endian, X=unused/undefined
-+  AV_PIX_FMT_X2BGR10LE,  ///< packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G
-+                         ///< 10R(lsb), little-endian, X=unused/undefined
-+  AV_PIX_FMT_X2BGR10BE,  ///< packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G
-+                         ///< 10R(lsb), big-endian, X=unused/undefined
-+
-+  AV_PIX_FMT_P210BE,  ///< interleaved chroma YUV 4:2:2, 20bpp, data in the high
-+                      ///< bits, big-endian
-+  AV_PIX_FMT_P210LE,  ///< interleaved chroma YUV 4:2:2, 20bpp, data in the high
-+                      ///< bits, little-endian
-+
-+  AV_PIX_FMT_P410BE,  ///< interleaved chroma YUV 4:4:4, 30bpp, data in the high
-+                      ///< bits, big-endian
-+  AV_PIX_FMT_P410LE,  ///< interleaved chroma YUV 4:4:4, 30bpp, data in the high
-+                      ///< bits, little-endian
-+
-+  AV_PIX_FMT_P216BE,  ///< interleaved chroma YUV 4:2:2, 32bpp, big-endian
-+  AV_PIX_FMT_P216LE,  ///< interleaved chroma YUV 4:2:2, 32bpp, little-endian
-+
-+  AV_PIX_FMT_P416BE,  ///< interleaved chroma YUV 4:4:4, 48bpp, big-endian
-+  AV_PIX_FMT_P416LE,  ///< interleaved chroma YUV 4:4:4, 48bpp, little-endian
-+
-+  AV_PIX_FMT_VUYA,  ///< packed VUYA 4:4:4, 32bpp, VUYAVUYA...
-+
-+  AV_PIX_FMT_RGBAF16BE,  ///< IEEE-754 half precision packed RGBA 16:16:16:16,
-+                         ///< 64bpp, RGBARGBA..., big-endian
-+  AV_PIX_FMT_RGBAF16LE,  ///< IEEE-754 half precision packed RGBA 16:16:16:16,
-+                         ///< 64bpp, RGBARGBA..., little-endian
-+
-+  AV_PIX_FMT_VUYX,  ///< packed VUYX 4:4:4, 32bpp, Variant of VUYA where alpha
-+                    ///< channel is left undefined
-+
-+  AV_PIX_FMT_P012LE,  ///< like NV12, with 12bpp per component, data in the high
-+                      ///< bits, zeros in the low bits, little-endian
-+  AV_PIX_FMT_P012BE,  ///< like NV12, with 12bpp per component, data in the high
-+                      ///< bits, zeros in the low bits, big-endian
-+
-+  AV_PIX_FMT_Y212BE,  ///< packed YUV 4:2:2 like YUYV422, 24bpp, data in the
-+                      ///< high bits, zeros in the low bits, big-endian
-+  AV_PIX_FMT_Y212LE,  ///< packed YUV 4:2:2 like YUYV422, 24bpp, data in the
-+                      ///< high bits, zeros in the low bits, little-endian
-+
-+  AV_PIX_FMT_XV30BE,  ///< packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb),
-+                      ///< big-endian, variant of Y410 where alpha channel is
-+                      ///< left undefined
-+  AV_PIX_FMT_XV30LE,  ///< packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb),
-+                      ///< little-endian, variant of Y410 where alpha channel is
-+                      ///< left undefined
-+
-+  AV_PIX_FMT_XV36BE,  ///< packed XVYU 4:4:4, 48bpp, data in the high bits,
-+                      ///< zeros in the low bits, big-endian, variant of Y412
-+                      ///< where alpha channel is left undefined
-+  AV_PIX_FMT_XV36LE,  ///< packed XVYU 4:4:4, 48bpp, data in the high bits,
-+                      ///< zeros in the low bits, little-endian, variant of Y412
-+                      ///< where alpha channel is left undefined
-+
-+  AV_PIX_FMT_RGBF32BE,  ///< IEEE-754 single precision packed RGB 32:32:32,
-+                        ///< 96bpp, RGBRGB..., big-endian
-+  AV_PIX_FMT_RGBF32LE,  ///< IEEE-754 single precision packed RGB 32:32:32,
-+                        ///< 96bpp, RGBRGB..., little-endian
-+
-+  AV_PIX_FMT_RGBAF32BE,  ///< IEEE-754 single precision packed RGBA 32:32:32:32,
-+                         ///< 128bpp, RGBARGBA..., big-endian
-+  AV_PIX_FMT_RGBAF32LE,  ///< IEEE-754 single precision packed RGBA 32:32:32:32,
-+                         ///< 128bpp, RGBARGBA..., little-endian
-+
-+  AV_PIX_FMT_P212BE,  ///< interleaved chroma YUV 4:2:2, 24bpp, data in the high
-+                      ///< bits, big-endian
-+  AV_PIX_FMT_P212LE,  ///< interleaved chroma YUV 4:2:2, 24bpp, data in the high
-+                      ///< bits, little-endian
-+
-+  AV_PIX_FMT_P412BE,  ///< interleaved chroma YUV 4:4:4, 36bpp, data in the high
-+                      ///< bits, big-endian
-+  AV_PIX_FMT_P412LE,  ///< interleaved chroma YUV 4:4:4, 36bpp, data in the high
-+                      ///< bits, little-endian
-+
-+  AV_PIX_FMT_GBRAP14BE,  ///< planar GBR 4:4:4:4 56bpp, big-endian
-+  AV_PIX_FMT_GBRAP14LE,  ///< planar GBR 4:4:4:4 56bpp, little-endian
-+
-+  /**
-+   * Hardware surfaces for Direct3D 12.
-+   *
-+   * data[0] points to an AVD3D12VAFrame
-+   */
-+  AV_PIX_FMT_D3D12,
-+
-+  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
-+};
-+
-+#if AV_HAVE_BIGENDIAN
-+#  define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be
-+#else
-+#  define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le
-+#endif
-+
-+#define AV_PIX_FMT_RGB32 AV_PIX_FMT_NE(ARGB, BGRA)
-+#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR)
-+#define AV_PIX_FMT_BGR32 AV_PIX_FMT_NE(ABGR, RGBA)
-+#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB)
-+#define AV_PIX_FMT_0RGB32 AV_PIX_FMT_NE(0RGB, BGR0)
-+#define AV_PIX_FMT_0BGR32 AV_PIX_FMT_NE(0BGR, RGB0)
-+
-+#define AV_PIX_FMT_GRAY9 AV_PIX_FMT_NE(GRAY9BE, GRAY9LE)
-+#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE)
-+#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE)
-+#define AV_PIX_FMT_GRAY14 AV_PIX_FMT_NE(GRAY14BE, GRAY14LE)
-+#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE)
-+#define AV_PIX_FMT_YA16 AV_PIX_FMT_NE(YA16BE, YA16LE)
-+#define AV_PIX_FMT_RGB48 AV_PIX_FMT_NE(RGB48BE, RGB48LE)
-+#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE)
-+#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE)
-+#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE)
-+#define AV_PIX_FMT_RGBA64 AV_PIX_FMT_NE(RGBA64BE, RGBA64LE)
-+#define AV_PIX_FMT_BGR48 AV_PIX_FMT_NE(BGR48BE, BGR48LE)
-+#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE)
-+#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE)
-+#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE)
-+#define AV_PIX_FMT_BGRA64 AV_PIX_FMT_NE(BGRA64BE, BGRA64LE)
-+
-+#define AV_PIX_FMT_YUV420P9 AV_PIX_FMT_NE(YUV420P9BE, YUV420P9LE)
-+#define AV_PIX_FMT_YUV422P9 AV_PIX_FMT_NE(YUV422P9BE, YUV422P9LE)
-+#define AV_PIX_FMT_YUV444P9 AV_PIX_FMT_NE(YUV444P9BE, YUV444P9LE)
-+#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE)
-+#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE)
-+#define AV_PIX_FMT_YUV440P10 AV_PIX_FMT_NE(YUV440P10BE, YUV440P10LE)
-+#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE)
-+#define AV_PIX_FMT_YUV420P12 AV_PIX_FMT_NE(YUV420P12BE, YUV420P12LE)
-+#define AV_PIX_FMT_YUV422P12 AV_PIX_FMT_NE(YUV422P12BE, YUV422P12LE)
-+#define AV_PIX_FMT_YUV440P12 AV_PIX_FMT_NE(YUV440P12BE, YUV440P12LE)
-+#define AV_PIX_FMT_YUV444P12 AV_PIX_FMT_NE(YUV444P12BE, YUV444P12LE)
-+#define AV_PIX_FMT_YUV420P14 AV_PIX_FMT_NE(YUV420P14BE, YUV420P14LE)
-+#define AV_PIX_FMT_YUV422P14 AV_PIX_FMT_NE(YUV422P14BE, YUV422P14LE)
-+#define AV_PIX_FMT_YUV444P14 AV_PIX_FMT_NE(YUV444P14BE, YUV444P14LE)
-+#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE)
-+#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE)
-+#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE)
-+
-+#define AV_PIX_FMT_GBRP9 AV_PIX_FMT_NE(GBRP9BE, GBRP9LE)
-+#define AV_PIX_FMT_GBRP10 AV_PIX_FMT_NE(GBRP10BE, GBRP10LE)
-+#define AV_PIX_FMT_GBRP12 AV_PIX_FMT_NE(GBRP12BE, GBRP12LE)
-+#define AV_PIX_FMT_GBRP14 AV_PIX_FMT_NE(GBRP14BE, GBRP14LE)
-+#define AV_PIX_FMT_GBRP16 AV_PIX_FMT_NE(GBRP16BE, GBRP16LE)
-+#define AV_PIX_FMT_GBRAP10 AV_PIX_FMT_NE(GBRAP10BE, GBRAP10LE)
-+#define AV_PIX_FMT_GBRAP12 AV_PIX_FMT_NE(GBRAP12BE, GBRAP12LE)
-+#define AV_PIX_FMT_GBRAP14 AV_PIX_FMT_NE(GBRAP14BE, GBRAP14LE)
-+#define AV_PIX_FMT_GBRAP16 AV_PIX_FMT_NE(GBRAP16BE, GBRAP16LE)
-+
-+#define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE, BAYER_BGGR16LE)
-+#define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE, BAYER_RGGB16LE)
-+#define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE, BAYER_GBRG16LE)
-+#define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE, BAYER_GRBG16LE)
-+
-+#define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE)
-+#define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE)
-+
-+#define AV_PIX_FMT_GRAYF32 AV_PIX_FMT_NE(GRAYF32BE, GRAYF32LE)
-+
-+#define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE, YUVA420P9LE)
-+#define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE, YUVA422P9LE)
-+#define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE, YUVA444P9LE)
-+#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)
-+
-+#define AV_PIX_FMT_XYZ12 AV_PIX_FMT_NE(XYZ12BE, XYZ12LE)
-+#define AV_PIX_FMT_NV20 AV_PIX_FMT_NE(NV20BE, NV20LE)
-+#define AV_PIX_FMT_AYUV64 AV_PIX_FMT_NE(AYUV64BE, AYUV64LE)
-+#define AV_PIX_FMT_P010 AV_PIX_FMT_NE(P010BE, P010LE)
-+#define AV_PIX_FMT_P012 AV_PIX_FMT_NE(P012BE, P012LE)
-+#define AV_PIX_FMT_P016 AV_PIX_FMT_NE(P016BE, P016LE)
-+
-+#define AV_PIX_FMT_Y210 AV_PIX_FMT_NE(Y210BE, Y210LE)
-+#define AV_PIX_FMT_Y212 AV_PIX_FMT_NE(Y212BE, Y212LE)
-+#define AV_PIX_FMT_XV30 AV_PIX_FMT_NE(XV30BE, XV30LE)
-+#define AV_PIX_FMT_XV36 AV_PIX_FMT_NE(XV36BE, XV36LE)
-+#define AV_PIX_FMT_X2RGB10 AV_PIX_FMT_NE(X2RGB10BE, X2RGB10LE)
-+#define AV_PIX_FMT_X2BGR10 AV_PIX_FMT_NE(X2BGR10BE, X2BGR10LE)
-+
-+#define AV_PIX_FMT_P210 AV_PIX_FMT_NE(P210BE, P210LE)
-+#define AV_PIX_FMT_P410 AV_PIX_FMT_NE(P410BE, P410LE)
-+#define AV_PIX_FMT_P212 AV_PIX_FMT_NE(P212BE, P212LE)
-+#define AV_PIX_FMT_P412 AV_PIX_FMT_NE(P412BE, P412LE)
-+#define AV_PIX_FMT_P216 AV_PIX_FMT_NE(P216BE, P216LE)
-+#define AV_PIX_FMT_P416 AV_PIX_FMT_NE(P416BE, P416LE)
-+
-+#define AV_PIX_FMT_RGBAF16 AV_PIX_FMT_NE(RGBAF16BE, RGBAF16LE)
-+
-+#define AV_PIX_FMT_RGBF32 AV_PIX_FMT_NE(RGBF32BE, RGBF32LE)
-+#define AV_PIX_FMT_RGBAF32 AV_PIX_FMT_NE(RGBAF32BE, RGBAF32LE)
-+
-+/**
-+ * Chromaticity coordinates of the source primaries.
-+ * These values match the ones defined by ISO/IEC 23091-2_2019 subclause 8.1 and
-+ * ITU-T H.273.
-+ */
-+enum AVColorPrimaries {
-+  AVCOL_PRI_RESERVED0 = 0,
-+  AVCOL_PRI_BT709 =
-+      1,  ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
-+  AVCOL_PRI_UNSPECIFIED = 2,
-+  AVCOL_PRI_RESERVED = 3,
-+  AVCOL_PRI_BT470M =
-+      4,  ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
-+
-+  AVCOL_PRI_BT470BG = 5,  ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R
-+                          ///< BT1700 625 PAL & SECAM
-+  AVCOL_PRI_SMPTE170M =
-+      6,  ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
-+  AVCOL_PRI_SMPTE240M =
-+      7,  ///< identical to above, also called "SMPTE C" even though it uses D65
-+  AVCOL_PRI_FILM = 8,       ///< colour filters using Illuminant C
-+  AVCOL_PRI_BT2020 = 9,     ///< ITU-R BT2020
-+  AVCOL_PRI_SMPTE428 = 10,  ///< SMPTE ST 428-1 (CIE 1931 XYZ)
-+  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_EBU3213 = 22,   ///< EBU Tech. 3213-E (nothing there) / one of JEDEC
-+                            ///< P22 group phosphors
-+  AVCOL_PRI_JEDEC_P22 = AVCOL_PRI_EBU3213,
-+  AVCOL_PRI_NB  ///< Not part of ABI
-+};
-+
-+/**
-+ * Color Transfer Characteristic.
-+ * These values match the ones defined by ISO/IEC 23091-2_2019 subclause 8.2.
-+ */
-+enum AVColorTransferCharacteristic {
-+  AVCOL_TRC_RESERVED0 = 0,
-+  AVCOL_TRC_BT709 = 1,  ///< also ITU-R BT1361
-+  AVCOL_TRC_UNSPECIFIED = 2,
-+  AVCOL_TRC_RESERVED = 3,
-+  AVCOL_TRC_GAMMA22 = 4,  ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
-+  AVCOL_TRC_GAMMA28 = 5,  ///< also ITU-R BT470BG
-+  AVCOL_TRC_SMPTE170M = 6,  ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358
-+                            ///< 525 or 625 / ITU-R BT1700 NTSC
-+  AVCOL_TRC_SMPTE240M = 7,
-+  AVCOL_TRC_LINEAR = 8,  ///< "Linear transfer characteristics"
-+  AVCOL_TRC_LOG = 9,  ///< "Logarithmic transfer characteristic (100:1 range)"
-+  AVCOL_TRC_LOG_SQRT =
-+      10,  ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"
-+  AVCOL_TRC_IEC61966_2_4 = 11,  ///< IEC 61966-2-4
-+  AVCOL_TRC_BT1361_ECG = 12,    ///< ITU-R BT1361 Extended Colour Gamut
-+  AVCOL_TRC_IEC61966_2_1 = 13,  ///< IEC 61966-2-1 (sRGB or sYCC)
-+  AVCOL_TRC_BT2020_10 = 14,     ///< ITU-R BT2020 for 10-bit system
-+  AVCOL_TRC_BT2020_12 = 15,     ///< ITU-R BT2020 for 12-bit system
-+  AVCOL_TRC_SMPTE2084 =
-+      16,  ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems
-+  AVCOL_TRC_SMPTEST2084 = AVCOL_TRC_SMPTE2084,
-+  AVCOL_TRC_SMPTE428 = 17,  ///< SMPTE ST 428-1
-+  AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428,
-+  AVCOL_TRC_ARIB_STD_B67 = 18,  ///< ARIB STD-B67, known as "Hybrid log-gamma"
-+  AVCOL_TRC_NB                  ///< Not part of ABI
-+};
-+
-+/**
-+ * YUV colorspace type.
-+ * These values match the ones defined by ISO/IEC 23091-2_2019 subclause 8.3.
-+ */
-+enum AVColorSpace {
-+  AVCOL_SPC_RGB = 0,    ///< order of coefficients is actually GBR, also IEC
-+                        ///< 61966-2-1 (sRGB), YZX and ST 428-1
-+  AVCOL_SPC_BT709 = 1,  ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 /
-+                        ///< derived in SMPTE RP 177 Annex B
-+  AVCOL_SPC_UNSPECIFIED = 2,
-+  AVCOL_SPC_RESERVED =
-+      3,  ///< reserved for future use by ITU-T and ISO/IEC just like 15-255 are
-+  AVCOL_SPC_FCC =
-+      4,  ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
-+  AVCOL_SPC_BT470BG = 5,  ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R
-+                          ///< BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
-+  AVCOL_SPC_SMPTE170M =
-+      6,  ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC /
-+          ///< functionally identical to above
-+  AVCOL_SPC_SMPTE240M =
-+      7,  ///< derived from 170M primaries and D65 white point, 170M is derived
-+          ///< from BT470 System M's primaries
-+  AVCOL_SPC_YCGCO =
-+      8,  ///< used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
-+  AVCOL_SPC_YCOCG = AVCOL_SPC_YCGCO,
-+  AVCOL_SPC_BT2020_NCL = 9,  ///< ITU-R BT2020 non-constant luminance system
-+  AVCOL_SPC_BT2020_CL = 10,  ///< ITU-R BT2020 constant luminance system
-+  AVCOL_SPC_SMPTE2085 = 11,  ///< SMPTE 2085, Y'D'zD'x
-+  AVCOL_SPC_CHROMA_DERIVED_NCL =
-+      12,  ///< Chromaticity-derived non-constant luminance system
-+  AVCOL_SPC_CHROMA_DERIVED_CL =
-+      13,                   ///< Chromaticity-derived constant luminance system
-+  AVCOL_SPC_ICTCP = 14,     ///< ITU-R BT.2100-0, ICtCp
-+  AVCOL_SPC_IPT_C2 = 15,    ///< SMPTE ST 2128, IPT-C2
-+  AVCOL_SPC_YCGCO_RE = 16,  ///< YCgCo-R, even addition of bits
-+  AVCOL_SPC_YCGCO_RO = 17,  ///< YCgCo-R, odd addition of bits
-+  AVCOL_SPC_NB              ///< Not part of ABI
-+};
-+
-+/**
-+ * Visual content value range.
-+ *
-+ * These values are based on definitions that can be found in multiple
-+ * specifications, such as ITU-T BT.709 (3.4 - Quantization of RGB, luminance
-+ * and colour-difference signals), ITU-T BT.2020 (Table 5 - Digital
-+ * Representation) as well as ITU-T BT.2100 (Table 9 - Digital 10- and 12-bit
-+ * integer representation). At the time of writing, the BT.2100 one is
-+ * recommended, as it also defines the full range representation.
-+ *
-+ * Common definitions:
-+ *   - For RGB and luma planes such as Y in YCbCr and I in ICtCp,
-+ *     'E' is the original value in range of 0.0 to 1.0.
-+ *   - For chroma planes such as Cb,Cr and Ct,Cp, 'E' is the original
-+ *     value in range of -0.5 to 0.5.
-+ *   - 'n' is the output bit depth.
-+ *   - For additional definitions such as rounding and clipping to valid n
-+ *     bit unsigned integer range, please refer to BT.2100 (Table 9).
-+ */
-+enum AVColorRange {
-+  AVCOL_RANGE_UNSPECIFIED = 0,
-+
-+  /**
-+   * Narrow or limited range content.
-+   *
-+   * - For luma planes:
-+   *
-+   *       (219 * E + 16) * 2^(n-8)
-+   *
-+   *   F.ex. the range of 16-235 for 8 bits
-+   *
-+   * - For chroma planes:
-+   *
-+   *       (224 * E + 128) * 2^(n-8)
-+   *
-+   *   F.ex. the range of 16-240 for 8 bits
-+   */
-+  AVCOL_RANGE_MPEG = 1,
-+
-+  /**
-+   * Full range content.
-+   *
-+   * - For RGB and luma planes:
-+   *
-+   *       (2^n - 1) * E
-+   *
-+   *   F.ex. the range of 0-255 for 8 bits
-+   *
-+   * - For chroma planes:
-+   *
-+   *       (2^n - 1) * E + 2^(n - 1)
-+   *
-+   *   F.ex. the range of 1-255 for 8 bits
-+   */
-+  AVCOL_RANGE_JPEG = 2,
-+  AVCOL_RANGE_NB  ///< Not part of ABI
-+};
-+
-+/**
-+ * Location of chroma samples.
-+ *
-+ * Illustration showing the location of the first (top left) chroma sample of
-+ *the image, the left shows only luma, the right shows the location of the
-+ *chroma sample, the 2 could be imagined to overlay each other but are drawn
-+ *separately due to limitations of ASCII
-+ *
-+ *                1st 2nd       1st 2nd horizontal luma sample positions
-+ *                 v   v         v   v
-+ *                 ______        ______
-+ *1st luma line > |X   X ...    |3 4 X ...     X are luma samples,
-+ *                |             |1 2           1-6 are possible chroma positions
-+ *2nd luma line > |X   X ...    |5 6 X ...     0 is undefined/unknown position
-+ */
-+enum AVChromaLocation {
-+  AVCHROMA_LOC_UNSPECIFIED = 0,
-+  AVCHROMA_LOC_LEFT = 1,    ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0
-+  AVCHROMA_LOC_CENTER = 2,  ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0
-+  AVCHROMA_LOC_TOPLEFT =
-+      3,  ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2
-+  AVCHROMA_LOC_TOP = 4,
-+  AVCHROMA_LOC_BOTTOMLEFT = 5,
-+  AVCHROMA_LOC_BOTTOM = 6,
-+  AVCHROMA_LOC_NB  ///< Not part of ABI
-+};
-+
-+#endif /* AVUTIL_PIXFMT_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/rational.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/rational.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/rational.h
-@@ -0,0 +1,226 @@
-+/*
-+ * rational numbers
-+ * Copyright (c) 2003 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 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
-+ * @ingroup lavu_math_rational
-+ * Utilties for rational number calculation.
-+ * @author Michael Niedermayer <michaelni@gmx.at>
-+ */
-+
-+#ifndef AVUTIL_RATIONAL_H
-+#define AVUTIL_RATIONAL_H
-+
-+#include <stdint.h>
-+#include <limits.h>
-+#include "attributes.h"
-+
-+/**
-+ * @defgroup lavu_math_rational AVRational
-+ * @ingroup lavu_math
-+ * Rational number calculation.
-+ *
-+ * While rational numbers can be expressed as floating-point numbers, the
-+ * conversion process is a lossy one, so are floating-point operations. On the
-+ * other hand, the nature of FFmpeg demands highly accurate calculation of
-+ * timestamps. This set of rational number utilities serves as a generic
-+ * interface for manipulating rational numbers as pairs of numerators and
-+ * denominators.
-+ *
-+ * Many of the functions that operate on AVRational's have the suffix `_q`, in
-+ * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all
-+ * rational numbers.
-+ *
-+ * @{
-+ */
-+
-+/**
-+ * Rational number (pair of numerator and denominator).
-+ */
-+typedef struct AVRational {
-+  int num;  ///< Numerator
-+  int den;  ///< Denominator
-+} AVRational;
-+
-+/**
-+ * Create an AVRational.
-+ *
-+ * Useful for compilers that do not support compound literals.
-+ *
-+ * @note The return value is not reduced.
-+ * @see av_reduce()
-+ */
-+static inline AVRational av_make_q(int num, int den) {
-+  AVRational r = {num, den};
-+  return r;
-+}
-+
-+/**
-+ * Compare two rationals.
-+ *
-+ * @param a First rational
-+ * @param b Second rational
-+ *
-+ * @return One of the following values:
-+ *         - 0 if `a == b`
-+ *         - 1 if `a > b`
-+ *         - -1 if `a < b`
-+ *         - `INT_MIN` if one of the values is of the form `0 / 0`
-+ */
-+static inline int av_cmp_q(AVRational a, AVRational b) {
-+  const int64_t tmp = a.num * (int64_t)b.den - b.num * (int64_t)a.den;
-+
-+  if (tmp)
-+    return (int)((tmp ^ a.den ^ b.den) >> 63) | 1;
-+  else if (b.den && a.den)
-+    return 0;
-+  else if (a.num && b.num)
-+    return (a.num >> 31) - (b.num >> 31);
-+  else
-+    return INT_MIN;
-+}
-+
-+/**
-+ * Convert an AVRational to a `double`.
-+ * @param a AVRational to convert
-+ * @return `a` in floating-point form
-+ * @see av_d2q()
-+ */
-+static inline double av_q2d(AVRational a) { return a.num / (double)a.den; }
-+
-+/**
-+ * Reduce a fraction.
-+ *
-+ * This is useful for framerate calculations.
-+ *
-+ * @param[out] dst_num Destination numerator
-+ * @param[out] dst_den Destination denominator
-+ * @param[in]      num Source numerator
-+ * @param[in]      den Source denominator
-+ * @param[in]      max Maximum allowed values for `dst_num` & `dst_den`
-+ * @return 1 if the operation is exact, 0 otherwise
-+ */
-+int av_reduce(int* dst_num, int* dst_den, int64_t num, int64_t den,
-+              int64_t max);
-+
-+/**
-+ * Multiply two rationals.
-+ * @param b First rational
-+ * @param c Second rational
-+ * @return b*c
-+ */
-+AVRational av_mul_q(AVRational b, AVRational c) av_const;
-+
-+/**
-+ * Divide one rational by another.
-+ * @param b First rational
-+ * @param c Second rational
-+ * @return b/c
-+ */
-+AVRational av_div_q(AVRational b, AVRational c) av_const;
-+
-+/**
-+ * Add two rationals.
-+ * @param b First rational
-+ * @param c Second rational
-+ * @return b+c
-+ */
-+AVRational av_add_q(AVRational b, AVRational c) av_const;
-+
-+/**
-+ * Subtract one rational from another.
-+ * @param b First rational
-+ * @param c Second rational
-+ * @return b-c
-+ */
-+AVRational av_sub_q(AVRational b, AVRational c) av_const;
-+
-+/**
-+ * Invert a rational.
-+ * @param q value
-+ * @return 1 / q
-+ */
-+static av_always_inline AVRational av_inv_q(AVRational q) {
-+  AVRational r = {q.den, q.num};
-+  return r;
-+}
-+
-+/**
-+ * Convert a double precision floating point number to a rational.
-+ *
-+ * In case of infinity, the returned value is expressed as `{1, 0}` or
-+ * `{-1, 0}` depending on the sign.
-+ *
-+ * In general rational numbers with |num| <= 1<<26 && |den| <= 1<<26
-+ * can be recovered exactly from their double representation.
-+ * (no exceptions were found within 1B random ones)
-+ *
-+ * @param d   `double` to convert
-+ * @param max Maximum allowed numerator and denominator
-+ * @return `d` in AVRational form
-+ * @see av_q2d()
-+ */
-+AVRational av_d2q(double d, int max) av_const;
-+
-+/**
-+ * Find which of the two rationals is closer to another rational.
-+ *
-+ * @param q     Rational to be compared against
-+ * @param q1    Rational to be tested
-+ * @param q2    Rational to be tested
-+ * @return One of the following values:
-+ *         - 1 if `q1` is nearer to `q` than `q2`
-+ *         - -1 if `q2` is nearer to `q` than `q1`
-+ *         - 0 if they have the same distance
-+ */
-+int av_nearer_q(AVRational q, AVRational q1, AVRational q2);
-+
-+/**
-+ * Find the value in a list of rationals nearest a given reference rational.
-+ *
-+ * @param q      Reference rational
-+ * @param q_list Array of rationals terminated by `{0, 0}`
-+ * @return Index of the nearest value found in the array
-+ */
-+int av_find_nearest_q_idx(AVRational q, const AVRational* q_list);
-+
-+/**
-+ * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point
-+ * format.
-+ *
-+ * @param q Rational to be converted
-+ * @return Equivalent floating-point value, expressed as an unsigned 32-bit
-+ *         integer.
-+ * @note The returned value is platform-indepedant.
-+ */
-+uint32_t av_q2intfloat(AVRational q);
-+
-+/**
-+ * Return the best rational so that a and b are multiple of it.
-+ * If the resulting denominator is larger than max_den, return def.
-+ */
-+AVRational av_gcd_q(AVRational a, AVRational b, int max_den, AVRational def);
-+
-+/**
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_RATIONAL_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/samplefmt.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/samplefmt.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/samplefmt.h
-@@ -0,0 +1,275 @@
-+/*
-+ * 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_SAMPLEFMT_H
-+#define AVUTIL_SAMPLEFMT_H
-+
-+#include <stdint.h>
-+
-+/**
-+ * @addtogroup lavu_audio
-+ * @{
-+ *
-+ * @defgroup lavu_sampfmts Audio sample formats
-+ *
-+ * Audio sample format enumeration and related convenience functions.
-+ * @{
-+ */
-+
-+/**
-+ * Audio sample formats
-+ *
-+ * - The data described by the sample format is always in native-endian order.
-+ *   Sample values can be expressed by native C types, hence the lack of a
-+ * signed 24-bit sample format even though it is a common raw audio data format.
-+ *
-+ * - The floating-point formats are based on full volume being in the range
-+ *   [-1.0, 1.0]. Any values outside this range are beyond full volume level.
-+ *
-+ * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg
-+ *   (such as AVFrame in libavcodec) is as follows:
-+ *
-+ * @par
-+ * For planar sample formats, each audio channel is in a separate data plane,
-+ * and linesize is the buffer size, in bytes, for a single plane. All data
-+ * planes must be the same size. For packed sample formats, only the first data
-+ * plane is used, and samples for each channel are interleaved. In this case,
-+ * linesize is the buffer size, in bytes, for the 1 plane.
-+ *
-+ */
-+enum AVSampleFormat {
-+  AV_SAMPLE_FMT_NONE = -1,
-+  AV_SAMPLE_FMT_U8,   ///< unsigned 8 bits
-+  AV_SAMPLE_FMT_S16,  ///< signed 16 bits
-+  AV_SAMPLE_FMT_S32,  ///< signed 32 bits
-+  AV_SAMPLE_FMT_FLT,  ///< float
-+  AV_SAMPLE_FMT_DBL,  ///< double
-+
-+  AV_SAMPLE_FMT_U8P,   ///< unsigned 8 bits, planar
-+  AV_SAMPLE_FMT_S16P,  ///< signed 16 bits, planar
-+  AV_SAMPLE_FMT_S32P,  ///< signed 32 bits, planar
-+  AV_SAMPLE_FMT_FLTP,  ///< float, planar
-+  AV_SAMPLE_FMT_DBLP,  ///< double, planar
-+  AV_SAMPLE_FMT_S64,   ///< signed 64 bits
-+  AV_SAMPLE_FMT_S64P,  ///< signed 64 bits, planar
-+
-+  AV_SAMPLE_FMT_NB  ///< Number of sample formats. DO NOT USE if linking
-+                    ///< dynamically
-+};
-+
-+/**
-+ * Return the name of sample_fmt, or NULL if sample_fmt is not
-+ * recognized.
-+ */
-+const char* av_get_sample_fmt_name(enum AVSampleFormat sample_fmt);
-+
-+/**
-+ * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE
-+ * on error.
-+ */
-+enum AVSampleFormat av_get_sample_fmt(const char* name);
-+
-+/**
-+ * Return the planar<->packed alternative form of the given sample format, or
-+ * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the
-+ * requested planar/packed format, the format returned is the same as the
-+ * input.
-+ */
-+enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt,
-+                                          int planar);
-+
-+/**
-+ * Get the packed alternative form of the given sample format.
-+ *
-+ * If the passed sample_fmt is already in packed format, the format returned is
-+ * the same as the input.
-+ *
-+ * @return  the packed alternative form of the given sample format or
-+            AV_SAMPLE_FMT_NONE on error.
-+ */
-+enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt);
-+
-+/**
-+ * Get the planar alternative form of the given sample format.
-+ *
-+ * If the passed sample_fmt is already in planar format, the format returned is
-+ * the same as the input.
-+ *
-+ * @return  the planar alternative form of the given sample format or
-+            AV_SAMPLE_FMT_NONE on error.
-+ */
-+enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt);
-+
-+/**
-+ * Generate a string corresponding to the sample format with
-+ * sample_fmt, or a header if sample_fmt is negative.
-+ *
-+ * @param buf the buffer where to write the string
-+ * @param buf_size the size of buf
-+ * @param sample_fmt the number of the sample format to print the
-+ * corresponding info string, or a negative value to print the
-+ * corresponding header.
-+ * @return the pointer to the filled buffer or NULL if sample_fmt is
-+ * unknown or in case of other errors
-+ */
-+char* av_get_sample_fmt_string(char* buf, int buf_size,
-+                               enum AVSampleFormat sample_fmt);
-+
-+/**
-+ * Return number of bytes per sample.
-+ *
-+ * @param sample_fmt the sample format
-+ * @return number of bytes per sample or zero if unknown for the given
-+ * sample format
-+ */
-+int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt);
-+
-+/**
-+ * Check if the sample format is planar.
-+ *
-+ * @param sample_fmt the sample format to inspect
-+ * @return 1 if the sample format is planar, 0 if it is interleaved
-+ */
-+int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt);
-+
-+/**
-+ * Get the required buffer size for the given audio parameters.
-+ *
-+ * @param[out] linesize calculated linesize, may be NULL
-+ * @param nb_channels   the number of channels
-+ * @param nb_samples    the number of samples in a single channel
-+ * @param sample_fmt    the sample format
-+ * @param align         buffer size alignment (0 = default, 1 = no alignment)
-+ * @return              required buffer size, or negative error code on failure
-+ */
-+int av_samples_get_buffer_size(int* linesize, int nb_channels, int nb_samples,
-+                               enum AVSampleFormat sample_fmt, int align);
-+
-+/**
-+ * @}
-+ *
-+ * @defgroup lavu_sampmanip Samples manipulation
-+ *
-+ * Functions that manipulate audio samples
-+ * @{
-+ */
-+
-+/**
-+ * Fill plane data pointers and linesize for samples with sample
-+ * format sample_fmt.
-+ *
-+ * The audio_data array is filled with the pointers to the samples data planes:
-+ * for planar, set the start point of each channel's data within the buffer,
-+ * for packed, set the start point of the entire buffer only.
-+ *
-+ * The value pointed to by linesize is set to the aligned size of each
-+ * channel's data buffer for planar layout, or to the aligned size of the
-+ * buffer for all channels for packed layout.
-+ *
-+ * The buffer in buf must be big enough to contain all the samples
-+ * (use av_samples_get_buffer_size() to compute its minimum size),
-+ * otherwise the audio_data pointers will point to invalid data.
-+ *
-+ * @see enum AVSampleFormat
-+ * The documentation for AVSampleFormat describes the data layout.
-+ *
-+ * @param[out] audio_data  array to be filled with the pointer for each channel
-+ * @param[out] linesize    calculated linesize, may be NULL
-+ * @param buf              the pointer to a buffer containing the samples
-+ * @param nb_channels      the number of channels
-+ * @param nb_samples       the number of samples in a single channel
-+ * @param sample_fmt       the sample format
-+ * @param align            buffer size alignment (0 = default, 1 = no alignment)
-+ * @return                 minimum size in bytes required for the buffer on
-+ * success, or a negative error code on failure
-+ */
-+int av_samples_fill_arrays(uint8_t** audio_data, int* linesize,
-+                           const uint8_t* buf, int nb_channels, int nb_samples,
-+                           enum AVSampleFormat sample_fmt, int align);
-+
-+/**
-+ * Allocate a samples buffer for nb_samples samples, and fill data pointers and
-+ * linesize accordingly.
-+ * The allocated samples buffer can be freed by using av_freep(&audio_data[0])
-+ * Allocated data will be initialized to silence.
-+ *
-+ * @see enum AVSampleFormat
-+ * The documentation for AVSampleFormat describes the data layout.
-+ *
-+ * @param[out] audio_data  array to be filled with the pointer for each channel
-+ * @param[out] linesize    aligned size for audio buffer(s), may be NULL
-+ * @param nb_channels      number of audio channels
-+ * @param nb_samples       number of samples per channel
-+ * @param sample_fmt       the sample format
-+ * @param align            buffer size alignment (0 = default, 1 = no alignment)
-+ * @return                 >=0 on success or a negative error code on failure
-+ * @todo return the size of the allocated buffer in case of success at the next
-+ * bump
-+ * @see av_samples_fill_arrays()
-+ * @see av_samples_alloc_array_and_samples()
-+ */
-+int av_samples_alloc(uint8_t** audio_data, int* linesize, int nb_channels,
-+                     int nb_samples, enum AVSampleFormat sample_fmt, int align);
-+
-+/**
-+ * Allocate a data pointers array, samples buffer for nb_samples
-+ * samples, and fill data pointers and linesize accordingly.
-+ *
-+ * This is the same as av_samples_alloc(), but also allocates the data
-+ * pointers array.
-+ *
-+ * @see av_samples_alloc()
-+ */
-+int av_samples_alloc_array_and_samples(uint8_t*** audio_data, int* linesize,
-+                                       int nb_channels, int nb_samples,
-+                                       enum AVSampleFormat sample_fmt,
-+                                       int align);
-+
-+/**
-+ * Copy samples from src to dst.
-+ *
-+ * @param dst destination array of pointers to data planes
-+ * @param src source array of pointers to data planes
-+ * @param dst_offset offset in samples at which the data will be written to dst
-+ * @param src_offset offset in samples at which the data will be read from src
-+ * @param nb_samples number of samples to be copied
-+ * @param nb_channels number of audio channels
-+ * @param sample_fmt audio sample format
-+ */
-+int av_samples_copy(uint8_t* const* dst, uint8_t* const* src, int dst_offset,
-+                    int src_offset, int nb_samples, int nb_channels,
-+                    enum AVSampleFormat sample_fmt);
-+
-+/**
-+ * Fill an audio buffer with silence.
-+ *
-+ * @param audio_data  array of pointers to data planes
-+ * @param offset      offset in samples at which to start filling
-+ * @param nb_samples  number of samples to fill
-+ * @param nb_channels number of audio channels
-+ * @param sample_fmt  audio sample format
-+ */
-+int av_samples_set_silence(uint8_t* const* audio_data, int offset,
-+                           int nb_samples, int nb_channels,
-+                           enum AVSampleFormat sample_fmt);
-+
-+/**
-+ * @}
-+ * @}
-+ */
-+#endif /* AVUTIL_SAMPLEFMT_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/version.h b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/version.h
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/include/libavutil/version.h
-@@ -0,0 +1,121 @@
-+/*
-+ * copyright (c) 2003 Fabrice Bellard
-+ *
-+ * 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
-+ * @ingroup lavu
-+ * Libavutil version macros
-+ */
-+
-+#ifndef AVUTIL_VERSION_H
-+#define AVUTIL_VERSION_H
-+
-+#include "macros.h"
-+
-+/**
-+ * @addtogroup version_utils
-+ *
-+ * Useful to check and match library version in order to maintain
-+ * backward compatibility.
-+ *
-+ * The FFmpeg libraries follow a versioning sheme very similar to
-+ * Semantic Versioning (http://semver.org/)
-+ * The difference is that the component called PATCH is called MICRO in FFmpeg
-+ * and its value is reset to 100 instead of 0 to keep it above or equal to 100.
-+ * Also we do not increase MICRO for every bugfix or change in git master.
-+ *
-+ * Prior to FFmpeg 3.2 point releases did not change any lib version number to
-+ * avoid aliassing different git master checkouts.
-+ * Starting with FFmpeg 3.2, the released library versions will occupy
-+ * a separate MAJOR.MINOR that is not used on the master development branch.
-+ * That is if we branch a release of master 55.10.123 we will bump to 55.11.100
-+ * for the release and master will continue at 55.12.100 after it. Each new
-+ * point release will then bump the MICRO improving the usefulness of the lib
-+ * versions.
-+ *
-+ * @{
-+ */
-+
-+#define AV_VERSION_INT(a, b, c) ((a) << 16 | (b) << 8 | (c))
-+#define AV_VERSION_DOT(a, b, c) a##.##b##.##c
-+#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
-+
-+/**
-+ * Extract version components from the full ::AV_VERSION_INT int as returned
-+ * by functions like ::avformat_version() and ::avcodec_version()
-+ */
-+#define AV_VERSION_MAJOR(a) ((a) >> 16)
-+#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8)
-+#define AV_VERSION_MICRO(a) ((a) & 0xFF)
-+
-+/**
-+ * @}
-+ */
-+
-+/**
-+ * @defgroup lavu_ver Version and Build diagnostics
-+ *
-+ * Macros and function useful to check at compiletime and at runtime
-+ * which version of libavutil is in use.
-+ *
-+ * @{
-+ */
-+
-+#define LIBAVUTIL_VERSION_MAJOR 59
-+#define LIBAVUTIL_VERSION_MINOR 13
-+#define LIBAVUTIL_VERSION_MICRO 100
-+
-+#define LIBAVUTIL_VERSION_INT                                      \
-+  AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, LIBAVUTIL_VERSION_MINOR, \
-+                 LIBAVUTIL_VERSION_MICRO)
-+#define LIBAVUTIL_VERSION                                      \
-+  AV_VERSION(LIBAVUTIL_VERSION_MAJOR, LIBAVUTIL_VERSION_MINOR, \
-+             LIBAVUTIL_VERSION_MICRO)
-+#define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT
-+
-+#define LIBAVUTIL_IDENT "Lavu" AV_STRINGIFY(LIBAVUTIL_VERSION)
-+
-+/**
-+ * @defgroup lavu_depr_guards Deprecation Guards
-+ * FF_API_* defines may be placed below to indicate public API that will be
-+ * dropped at a future version bump. The defines themselves are not part of
-+ * the public API and may change, break or disappear at any time.
-+ *
-+ * @note, when bumping the major version it is recommended to manually
-+ * disable each FF_API_* in its own commit instead of disabling them all
-+ * at once through the bump. This improves the git bisect-ability of the change.
-+ *
-+ * @{
-+ */
-+
-+#define FF_API_HDR_VIVID_THREE_SPLINE (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_FRAME_PKT (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_INTERLACED_FRAME (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_FRAME_KEY (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_PALETTE_HAS_CHANGED (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_VULKAN_CONTIGUOUS_MEMORY (LIBAVUTIL_VERSION_MAJOR < 60)
-+#define FF_API_H274_FILM_GRAIN_VCS (LIBAVUTIL_VERSION_MAJOR < 60)
-+
-+/**
-+ * @}
-+ * @}
-+ */
-+
-+#endif /* AVUTIL_VERSION_H */
-diff --git a/dom/media/platforms/ffmpeg/ffmpeg61/moz.build b/dom/media/platforms/ffmpeg/ffmpeg61/moz.build
-new file mode 100644
---- /dev/null
-+++ b/dom/media/platforms/ffmpeg/ffmpeg61/moz.build
-@@ -0,0 +1,47 @@
-+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-+# vim: set filetype=python:
-+# This Source Code Form is subject to the terms of the Mozilla Public
-+# License, v. 2.0. If a copy of the MPL was not distributed with this
-+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-+
-+UNIFIED_SOURCES += [
-+    "../FFmpegAudioDecoder.cpp",
-+    "../FFmpegAudioEncoder.cpp",
-+    "../FFmpegDataDecoder.cpp",
-+    "../FFmpegDataEncoder.cpp",
-+    "../FFmpegDecoderModule.cpp",
-+    "../FFmpegEncoderModule.cpp",
-+    "../FFmpegVideoDecoder.cpp",
-+    "../FFmpegVideoEncoder.cpp",
-+]
-+LOCAL_INCLUDES += [
-+    "..",
-+    "/media/mozva",
-+    "include",
-+]
-+
-+if CONFIG["CC_TYPE"] in ("clang", "gcc"):
-+    CXXFLAGS += ["-Wno-deprecated-declarations"]
-+if CONFIG["CC_TYPE"] == "clang":
-+    CXXFLAGS += [
-+        "-Wno-unknown-attributes",
-+    ]
-+if CONFIG["CC_TYPE"] == "gcc":
-+    CXXFLAGS += [
-+        "-Wno-attributes",
-+    ]
-+if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
-+    CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"]
-+if CONFIG["MOZ_ENABLE_VAAPI"] or CONFIG["MOZ_ENABLE_V4L2"]:
-+    UNIFIED_SOURCES += ["../FFmpegVideoFramePool.cpp"]
-+    LOCAL_INCLUDES += ["/third_party/drm/drm/include/libdrm/"]
-+    USE_LIBS += ["mozva"]
-+    DEFINES["MOZ_USE_HWDECODE"] = 1
-+
-+include("/ipc/chromium/chromium-config.mozbuild")
-+
-+LOCAL_INCLUDES += [
-+    "/media/libyuv/libyuv/include",
-+]
-+
-+FINAL_LIBRARY = "xul"
-diff --git a/dom/media/platforms/ffmpeg/moz.build b/dom/media/platforms/ffmpeg/moz.build
---- a/dom/media/platforms/ffmpeg/moz.build
-+++ b/dom/media/platforms/ffmpeg/moz.build
-@@ -11,16 +11,17 @@ EXPORTS += [
- DIRS += [
-     "libav53",
-     "libav54",
-     "libav55",
-     "ffmpeg57",
-     "ffmpeg58",
-     "ffmpeg59",
-     "ffmpeg60",
-+    "ffmpeg61",
- ]
- 
- UNIFIED_SOURCES += ["FFmpegRuntimeLinker.cpp"]
- 
- if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
-     include("/ipc/chromium/chromium-config.mozbuild")
- 
- LOCAL_INCLUDES += [
-diff --git a/tools/rewriting/ThirdPartyPaths.txt b/tools/rewriting/ThirdPartyPaths.txt
---- a/tools/rewriting/ThirdPartyPaths.txt
-+++ b/tools/rewriting/ThirdPartyPaths.txt
-@@ -31,16 +31,17 @@ dom/media/gmp/rlz/
- dom/media/gmp/widevine-adapter/content_decryption_module_export.h
- dom/media/gmp/widevine-adapter/content_decryption_module_ext.h
- dom/media/gmp/widevine-adapter/content_decryption_module.h
- dom/media/gmp/widevine-adapter/content_decryption_module_proxy.h
- dom/media/platforms/ffmpeg/ffmpeg57/
- dom/media/platforms/ffmpeg/ffmpeg58/
- dom/media/platforms/ffmpeg/ffmpeg59/
- dom/media/platforms/ffmpeg/ffmpeg60/
-+dom/media/platforms/ffmpeg/ffmpeg61/
- dom/media/platforms/ffmpeg/libav53/
- dom/media/platforms/ffmpeg/libav54/
- dom/media/platforms/ffmpeg/libav55/
- dom/media/webaudio/test/blink/
- dom/media/webrtc/tests/mochitests/helpers_from_wpt/sdp.js
- dom/media/webrtc/transport/third_party/
- dom/media/webspeech/recognition/endpointer.cc
- dom/media/webspeech/recognition/endpointer.h
-
diff --git a/d55beebe2605.patch b/d55beebe2605.patch
deleted file mode 100644
index 2294746..0000000
--- a/d55beebe2605.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-
-# HG changeset patch
-# User Paul Adenot <paul@paul.cx>
-# Date 1714486907 0
-# Node ID d55beebe260509ed62586f3fcd7f9da3d54dcab0
-# Parent  05d7a7c92cf24c6b47bf84a693c71a507b312f3c
-Bug 1889978 - FFVPX is now using FFmpeg API 7.0. r=media-playback-reviewers,alwu
-
-Differential Revision: https://phabricator.services.mozilla.com/D206925
-
-diff --git a/dom/media/platforms/ffmpeg/ffvpx/moz.build b/dom/media/platforms/ffmpeg/ffvpx/moz.build
---- a/dom/media/platforms/ffmpeg/ffvpx/moz.build
-+++ b/dom/media/platforms/ffmpeg/ffvpx/moz.build
-@@ -20,17 +20,17 @@ UNIFIED_SOURCES += [
-     "../FFmpegVideoDecoder.cpp",
-     "../FFmpegVideoEncoder.cpp",
- ]
- SOURCES += [
-     "FFVPXRuntimeLinker.cpp",
- ]
- LOCAL_INCLUDES += [
-     "..",
--    "../ffmpeg60/include",
-+    "../ffmpeg61/include",
-     "/media/mozva",
- ]
- 
- CXXFLAGS += ["-Wno-deprecated-declarations"]
- if CONFIG["CC_TYPE"] == "clang":
-     CXXFLAGS += [
-         "-Wno-unknown-attributes",
-     ]
-
diff --git a/fb10bab6cd18.patch b/fb10bab6cd18.patch
deleted file mode 100644
index a66782b..0000000
--- a/fb10bab6cd18.patch
+++ /dev/null
@@ -1,187 +0,0 @@
-
-# HG changeset patch
-# User Otto Länd <bind-autoland@mozilla.com>
-# Date 1714487318 0
-# Node ID fb10bab6cd18b43ae0bd2ef55de94b9c9db3a3a3
-# Parent  d55beebe260509ed62586f3fcd7f9da3d54dcab0
-Bug 1889978: apply code formatting via Lando
-
-# ignore-this-changeset
-
-diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
---- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
-+++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
-@@ -394,18 +394,17 @@ MediaResult FFmpegAudioDecoder<LIBAV_VER
-                                                     uint8_t* aData, int aSize,
-                                                     bool* aGotFrame,
-                                                     DecodedData& aResults) {
-   MOZ_ASSERT(mTaskQueue->IsOnCurrentThread());
-   PROCESS_DECODE_LOG(aSample);
-   AVPacket* packet;
- #if LIBAVCODEC_VERSION_MAJOR >= 61
-   packet = mLib->av_packet_alloc();
--  auto freePacket =
--    MakeScopeExit([&] { mLib->av_packet_free(&packet); });
-+  auto freePacket = MakeScopeExit([&] { mLib->av_packet_free(&packet); });
- #else
-   AVPacket packet_mem;
-   packet = &packet_mem;
-   mLib->av_init_packet(packet);
- #endif
- 
-   FFMPEG_LOG("FFmpegAudioDecoder::DoDecode: %d bytes, [%s,%s] (Duration: %s)",
-              aSize, aSample->mTime.ToString().get(),
-diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
---- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
-+++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
-@@ -164,17 +164,17 @@ FFmpegLibWrapper::LinkResult FFmpegLibWr
-   AV_FUNC(avcodec_find_encoder, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_find_encoder_by_name,
-           AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC(avcodec_flush_buffers, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_open2, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_register_all, AV_FUNC_53 | AV_FUNC_54 | AV_FUNC_55 |
-                                     AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58)
-   AV_FUNC(av_init_packet, (AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58 |
--                              AV_FUNC_59 | AV_FUNC_60))
-+                           AV_FUNC_59 | AV_FUNC_60))
-   AV_FUNC(av_parser_init, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(av_parser_close, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(av_parser_parse2, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_align_dimensions, AV_FUNC_AVCODEC_ALL)
-   AV_FUNC(avcodec_alloc_frame, (AV_FUNC_53 | AV_FUNC_54))
-   AV_FUNC(avcodec_get_frame_defaults, (AV_FUNC_53 | AV_FUNC_54))
-   AV_FUNC(avcodec_free_frame, AV_FUNC_54)
-   AV_FUNC(avcodec_send_packet,
-@@ -272,19 +272,19 @@ FFmpegLibWrapper::LinkResult FFmpegLibWr
-   AV_FUNC_OPTION_SILENT(av_hwframe_transfer_get_formats,
-                         AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_create_derived,
-                         AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(av_hwframe_ctx_alloc,
-                         AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60 | AV_FUNC_61)
-   AV_FUNC_OPTION_SILENT(avcodec_get_name, AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 |
-                                               AV_FUNC_60 | AV_FUNC_61)
--  AV_FUNC_OPTION_SILENT(
--      av_get_pix_fmt_string,
--      AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61)
-+  AV_FUNC_OPTION_SILENT(av_get_pix_fmt_string,
-+                        AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 |
-+                            AV_FUNC_AVUTIL_60 | AV_FUNC_AVUTIL_61)
- #endif
- 
-   AV_FUNC_OPTION(av_tx_init, AV_FUNC_AVUTIL_ALL)
-   AV_FUNC_OPTION(av_tx_uninit, AV_FUNC_AVUTIL_ALL)
- 
- #undef AV_FUNC
- #undef AV_FUNC_OPTION
- 
-diff --git a/dom/media/platforms/ffmpeg/FFmpegUtils.h b/dom/media/platforms/ffmpeg/FFmpegUtils.h
---- a/dom/media/platforms/ffmpeg/FFmpegUtils.h
-+++ b/dom/media/platforms/ffmpeg/FFmpegUtils.h
-@@ -47,37 +47,37 @@ inline bool IsVideoCodec(AVCodecID aCode
- #endif
-       return true;
-     default:
-       return false;
-   }
- }
- 
- // Access the correct location for the channel count, based on ffmpeg version.
--template<typename T>
-+template <typename T>
- inline int& ChannelCount(T* aObject) {
- #if LIBAVCODEC_VERSION_MAJOR <= 59
-   return aObject->channels;
- #else
-   return aObject->ch_layout.nb_channels;
- #endif
- }
- 
- // Access the correct location for the duration, based on ffmpeg version.
--template<typename T>
-+template <typename T>
- inline int64_t& Duration(T* aObject) {
- #if LIBAVCODEC_VERSION_MAJOR < 61
-   return aObject->pkt_duration;
- #else
-   return aObject->duration;
- #endif
- }
- 
- // Access the correct location for the duration, based on ffmpeg version.
--template<typename T>
-+template <typename T>
- inline const int64_t& Duration(const T* aObject) {
- #if LIBAVCODEC_VERSION_MAJOR < 61
-   return aObject->pkt_duration;
- #else
-   return aObject->duration;
- #endif
- }
- 
-diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
---- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
-+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
-@@ -869,17 +869,17 @@ int FFmpegVideoDecoder<LIBAV_VER>::GetVi
-   aFrame->linesize[2] = mapped.cr.stride;
- 
-   aFrame->width = aCodecContext->coded_width;
-   aFrame->height = aCodecContext->coded_height;
-   aFrame->format = aCodecContext->pix_fmt;
-   aFrame->extended_data = aFrame->data;
- #  if LIBAVCODEC_VERSION_MAJOR < 61
-   aFrame->reordered_opaque = aCodecContext->reordered_opaque;
--#endif
-+#  endif
-   MOZ_ASSERT(aFrame->data[0] && aFrame->data[1] && aFrame->data[2]);
- 
-   // This will hold a reference to image, and the reference would be dropped
-   // when ffmpeg tells us that the buffer is no longer needed.
-   auto imageWrapper = MakeRefPtr<ImageBufferWrapper>(image.get(), this);
-   aFrame->buf[0] =
-       mLib->av_buffer_create(aFrame->data[0], dataSize.value(),
-                              ReleaseVideoBufferWrapper, imageWrapper.get(), 0);
-@@ -1041,19 +1041,17 @@ void FFmpegVideoDecoder<LIBAV_VER>::Deco
- MediaResult FFmpegVideoDecoder<LIBAV_VER>::DoDecode(
-     MediaRawData* aSample, uint8_t* aData, int aSize, bool* aGotFrame,
-     MediaDataDecoder::DecodedData& aResults) {
-   MOZ_ASSERT(mTaskQueue->IsOnCurrentThread());
-   AVPacket* packet;
- 
- #if LIBAVCODEC_VERSION_MAJOR >= 61
-   packet = mLib->av_packet_alloc();
--  auto raii = MakeScopeExit([&]() {
--    mLib->av_packet_free(&packet);
--  });
-+  auto raii = MakeScopeExit([&]() { mLib->av_packet_free(&packet); });
- #else
-   AVPacket packet_mem;
-   packet = &packet_mem;
-   mLib->av_init_packet(packet);
- #endif
- 
- #if LIBAVCODEC_VERSION_MAJOR >= 58
-   mDecodeStats.DecodeStart();
-@@ -1176,18 +1174,18 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER
-         // Explicitly remove dmabuf surface pool as it's configured
-         // for VA-API/V4L2 support.
-         mVideoFramePool = nullptr;
-         return rv;
-       }
-     } else
- #  endif
-     {
--      rv = CreateImage(mFrame->pkt_pos, GetFramePts(mFrame),
--                       Duration(mFrame), aResults);
-+      rv = CreateImage(mFrame->pkt_pos, GetFramePts(mFrame), Duration(mFrame),
-+                       aResults);
-     }
-     if (NS_FAILED(rv)) {
-       return rv;
-     }
- 
-     mPerformanceRecorder.Record(mFrame->pkt_dts, [&](auto& aStage) {
-       aStage.SetResolution(mFrame->width, mFrame->height);
-       auto format = [&]() -> Maybe<DecodeStage::ImageFormat> {
-
diff --git a/firefox-112.0.1-no-static-libstdc++.patch b/firefox-112.0.1-no-static-libstdc++.patch
index efafb8c..f200c03 100644
--- a/firefox-112.0.1-no-static-libstdc++.patch
+++ b/firefox-112.0.1-no-static-libstdc++.patch
@@ -11,18 +11,6 @@ diff -up firefox-112.0.1/memory/replace/logalloc/replay/moz.build.omv~ firefox-1
  if CONFIG["OS_TARGET"] == "Darwin":
      # Work around "warning: 'aligned_alloc' is only available on macOS 10.15 or newer"
      # when building with MACOSX_DEPLOYMENT_TARGET < 10.15 with >= 10.15 SDK.
-diff -up firefox-112.0.1/third_party/jpeg-xl/CMakeLists.txt.omv~ firefox-112.0.1/third_party/jpeg-xl/CMakeLists.txt
---- firefox-112.0.1/third_party/jpeg-xl/CMakeLists.txt.omv~	2023-04-24 23:42:52.833216472 +0200
-+++ firefox-112.0.1/third_party/jpeg-xl/CMakeLists.txt	2023-04-24 23:43:14.731400505 +0200
-@@ -200,7 +200,7 @@ if(JPEGXL_STATIC)
-   if (NOT MSVC AND NOT APPLE)
-     set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
-     set(CMAKE_EXE_LINKER_FLAGS
--        "${CMAKE_EXE_LINKER_FLAGS} -static -static-libgcc -static-libstdc++")
-+        "${CMAKE_EXE_LINKER_FLAGS}")
-   endif()
- endif()  # JPEGXL_STATIC
- 
 diff -up firefox-112.0.1/third_party/libwebrtc/build/config/chromecast/BUILD.gn.omv~ firefox-112.0.1/third_party/libwebrtc/build/config/chromecast/BUILD.gn
 --- firefox-112.0.1/third_party/libwebrtc/build/config/chromecast/BUILD.gn.omv~	2023-04-24 23:42:33.599055289 +0200
 +++ firefox-112.0.1/third_party/libwebrtc/build/config/chromecast/BUILD.gn	2023-04-24 23:42:45.376153928 +0200
@@ -42,3 +30,18 @@ diff -up firefox-112.0.1/third_party/libwebrtc/build/config/chromecast/BUILD.gn.
    }
  }
  
+--- firefox-127.0/third_party/jpeg-xl/CMakeLists.txt.orig	2024-06-11 11:10:25.784367735 +0100
++++ firefox-127.0/third_party/jpeg-xl/CMakeLists.txt	2024-06-11 11:10:39.033930659 +0100
+@@ -211,12 +211,8 @@
+   # Clang developers say that in case to use "static" we have to build stdlib
+   # ourselves; for real use case we don't care about stdlib, as it is "granted",
+   # so just linking all other libraries is fine.
+-  if (NOT MSVC)
+-    string(APPEND CMAKE_EXE_LINKER_FLAGS " -static")
+-  endif()
+   if ((NOT WIN32 AND NOT APPLE) OR CYGWIN OR MINGW)
+     set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
+-    string(APPEND CMAKE_EXE_LINKER_FLAGS " -static-libgcc -static-libstdc++")
+   endif()
+ endif()  # JPEGXL_STATIC
+ 
diff --git a/firefox.spec b/firefox.spec
index 4b80c1f..dc36d64 100644
--- a/firefox.spec
+++ b/firefox.spec
@@ -244,8 +244,8 @@ Summary:	Next generation web browser
 Name:		firefox
 # IMPORTANT: When updating, you MUST also update the l10n files by running
 # download.sh after editing the version number
-Version:	126.0.1
-Release:	%{?beta:0.%{beta}.}1
+Version:	127.0
+Release:	%{?beta:0.%{beta}.}2
 License:	MPLv1+
 Group:		Networking/WWW
 Url:		http://www.mozilla.com/firefox/
@@ -289,17 +289,9 @@ Patch58:	https://src.fedoraproject.org/rpms/firefox/raw/rawhide/f/firefox-gcc-13
 Patch61:	https://src.fedoraproject.org/rpms/firefox/raw/rawhide/f/mozilla-1196777.patch
 Patch62:	https://src.fedoraproject.org/rpms/firefox/raw/rawhide/f/mozilla-1516803.patch
 #Patch64:	https://src.fedoraproject.org/rpms/firefox/raw/rawhide/f/mozilla-1667096.patch
-Patch65:	https://src.fedoraproject.org/rpms/firefox/raw/rawhide/f/mozilla-1669639.patch
 Patch66:	firefox-115.4.0-icu-74.patch
 
 #Patch100:	firefox-system-ffmpeg.patch
-# ffmpeg 7.0 patches as merged into 127a1 from
-# https://bugzilla.mozilla.org/show_bug.cgi?id=1889978
-Patch101:	5970587d9a7a.patch
-Patch102:	5759fe6ed8a5.patch
-Patch103:	05d7a7c92cf2.patch
-Patch104:	d55beebe2605.patch
-Patch105:	fb10bab6cd18.patch
 
 BuildRequires:	doxygen
 BuildRequires:	makedepend
diff --git a/mozilla-1669639.patch b/mozilla-1669639.patch
deleted file mode 100644
index cd04aab..0000000
--- a/mozilla-1669639.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- firefox-81.0.1/build/mach_initialize.py.old	2020-10-06 14:16:06.212974910 +0200
-+++ firefox-81.0.1/build/mach_initialize.py	2020-10-06 14:19:03.313179557 +0200
-@@ -507,7 +507,10 @@ class ImportHook(object):
-         # doesn't happen or because it doesn't matter).
-         if not os.path.exists(module.__file__[:-1]):
-             if os.path.exists(module.__file__):
--                os.remove(module.__file__)
-+                try:
-+                    os.remove(module.__file__)
-+                except:
-+                    pass
-             del sys.modules[module.__name__]
-             module = self(name, globals, locals, fromlist, level)
- 
Not Available

369start [@T] proton.meNo Comment.124d 11hrs
369start [@T] proton.meNo Comment.124d 11hrs