crux-commits
Threads by month
- ----- 2025 -----
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
March 2023
- 1 participants
- 455 discussions
commit 77e395e17b2abc8fda7eb236f3bfd72af6addf75
Author: Juergen Daubert <jue(a)jue.li>
Date: Sat Mar 11 16:27:05 2023 +0100
ldb: update to 2.7.1
diff --git a/ldb/.footprint b/ldb/.footprint
index 699aca4c5..af6f9009d 100644
--- a/ldb/.footprint
+++ b/ldb/.footprint
@@ -27,12 +27,12 @@ drwxr-xr-x root/root usr/lib/ldb/
-rwxr-xr-x root/root usr/lib/ldb/server_sort.so
-rwxr-xr-x root/root usr/lib/ldb/skel.so
-rwxr-xr-x root/root usr/lib/ldb/tdb.so
-lrwxrwxrwx root/root usr/lib/libldb.so -> libldb.so.2.6.1
-lrwxrwxrwx root/root usr/lib/libldb.so.2 -> libldb.so.2.6.1
--rwxr-xr-x root/root usr/lib/libldb.so.2.6.1
-lrwxrwxrwx root/root usr/lib/libpyldb-util.cpython-310-x86-64-linux-gnu.so -> libpyldb-util.cpython-310-x86-64-linux-gnu.so.2.6.1
-lrwxrwxrwx root/root usr/lib/libpyldb-util.cpython-310-x86-64-linux-gnu.so.2 -> libpyldb-util.cpython-310-x86-64-linux-gnu.so.2.6.1
--rwxr-xr-x root/root usr/lib/libpyldb-util.cpython-310-x86-64-linux-gnu.so.2.6.1
+lrwxrwxrwx root/root usr/lib/libldb.so -> libldb.so.2.7.1
+lrwxrwxrwx root/root usr/lib/libldb.so.2 -> libldb.so.2.7.1
+-rwxr-xr-x root/root usr/lib/libldb.so.2.7.1
+lrwxrwxrwx root/root usr/lib/libpyldb-util.cpython-310-x86-64-linux-gnu.so -> libpyldb-util.cpython-310-x86-64-linux-gnu.so.2.7.1
+lrwxrwxrwx root/root usr/lib/libpyldb-util.cpython-310-x86-64-linux-gnu.so.2 -> libpyldb-util.cpython-310-x86-64-linux-gnu.so.2.7.1
+-rwxr-xr-x root/root usr/lib/libpyldb-util.cpython-310-x86-64-linux-gnu.so.2.7.1
drwxr-xr-x root/root usr/lib/pkgconfig/
-rw-r--r-- root/root usr/lib/pkgconfig/ldb.pc
-rw-r--r-- root/root usr/lib/pkgconfig/pyldb-util.cpython-310-x86_64-linux-gnu.pc
diff --git a/ldb/.signature b/ldb/.signature
index 7c08470a5..f49082d68 100644
--- a/ldb/.signature
+++ b/ldb/.signature
@@ -1,6 +1,6 @@
untrusted comment: verify with /etc/ports/opt.pub
-RWSE3ohX2g5d/R/573oygsZGZcizCeMwEsYnP07kFwjzp6X29Q3DnRv/tRBVdEYh/pCHVe+aCAvbYlTUr9ip6F//9IoGWsTkzA0=
-SHA256 (Pkgfile) = de68b0cade1852690050e63d804de19c5ab3a13b7173d448f5de6dc05b3aa251
-SHA256 (.footprint) = 391a6083abb30258f527a01f42c932b45cad408d9bee479bda7638e1eaf278db
-SHA256 (ldb-2.6.1.tar.gz) = 467403f77df86782c3965bb175440baa2ed751a9feb9560194bd8c06bf1736c9
+RWSE3ohX2g5d/aNATZ3oLv7wJhxt3Us4aMp5sX3+mUKo2hZf1rmmH47MEDBEoQjnlEft/cJm0UOdhnC9UoSadeGiM9Z7SLvJlg4=
+SHA256 (Pkgfile) = 9c14efdf949dcd5c99a05f1561e3b040888b6dbb24fb688764eae80b30c17ce2
+SHA256 (.footprint) = 3181a4c7afd05c266a41175fc0696ba7e950e0af91ac58a7b3895f90a2b61bb5
+SHA256 (ldb-2.7.1.tar.gz) = c4632c9a7f81f8a45ed46fc14d18eb507edf4e79f6e88d16977478ef95ed5b7f
SHA256 (ldb-man-pages.tar.xz) = f1c694d557bcf1d8d0670c0a7719c83bd58bd7d5e8e5068bf458f74b18ffbb6d
diff --git a/ldb/Pkgfile b/ldb/Pkgfile
index dbfb3c212..3ccdd024f 100644
--- a/ldb/Pkgfile
+++ b/ldb/Pkgfile
@@ -4,7 +4,7 @@
# Depends on: tevent tdb popt cmocka python3
name=ldb
-version=2.6.1
+version=2.7.1
release=1
source=(https://www.samba.org/ftp/$name/$name-$version.tar.gz
$name-man-pages.tar.xz)
1
0
commit 34f39a3104688671523d7c6adbf04aafd2db0aa6
Author: Danny Rawlins <contact(a)romster.me>
Date: Sun Mar 12 00:23:48 2023 +1100
firefox: ->
diff --git a/firefox/.signature b/firefox/.signature
index 2beb151e3..80c4382c8 100644
--- a/firefox/.signature
+++ b/firefox/.signature
@@ -1,7 +1,10 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF35v8sqhzAwBDCa0o9u2FfZ16EpDoC7YGrWqeUx5gHBTzbzLMufI0n2fYqxcz28ROKGe+ePC0nnp2E/Jh1bEaHgA=
-SHA256 (Pkgfile) = 3132e0631024fb7531a11f90ef5f9278f9e84eee585163aee4fdac3924da5eed
+RWSagIOpLGJF3487znfvgNAPEMsphgy0mwTc01kTxWN7gDYkPem887OyyAgNzyZqmKi9X6KViD2KJQFxG+yaDG8zC6vMWsxGMAs=
+SHA256 (Pkgfile) = d45a22fdebabfc9c009e739be3bb72193a6247e904bbbfa3d197a14f0ad74c51
SHA256 (.footprint) = c8226cc240304363b6289982601426f70c5cd4e82ac62feff3485bee4f48e050
SHA256 (firefox-110.0.1.source.tar.xz) = f19bb74d684b992625abca68f5776198974cd2785eb5d02d51ba007fc998491f
SHA256 (firefox.desktop) = 8ba3439f3dfc5cab883641969c93d8d15f8f20d7188d9568346b2edad52d6f91
SHA256 (node-stdout-nonblocking-wrapper) = bb8c503015e49ed1b152225bdc56cf502cd831f35962d113dcbb9121967f3523
+SHA256 (0001-libwebrtc-screen-cast-sync.patch) = 43c83101b7ad7dba6f5fffeb89b70a661a547d506a031ea2beada42ccf04eec7
+SHA256 (0002-Bug-1819374-Squashed-ffmpeg-6.0-update.patch) = 9347e45cfe3e915b2293f7467fd61c216ec10823e91c70e5aeb9ca08cc5fcfcf
+SHA256 (0003-Bug-1820416-Use-correct-FFVPX-headers-from-ffmpeg-6.patch) = be9ba079a931d5e881ce38430d418cc834e8c6b157af6c79ea267998caece806
diff --git a/firefox/0001-libwebrtc-screen-cast-sync.patch b/firefox/0001-libwebrtc-screen-cast-sync.patch
new file mode 100644
index 000000000..4ac6b9a7c
--- /dev/null
+++ b/firefox/0001-libwebrtc-screen-cast-sync.patch
@@ -0,0 +1,5948 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: "Jan Alexander Steffens (heftig)" <heftig(a)archlinux.org>
+Date: Sat, 29 Oct 2022 17:43:52 +0200
+Subject: [PATCH] libwebrtc screen-cast sync
+
+Patch from Fedora, at
+https://src.fedoraproject.org/rpms/firefox/blob/rawhide/f/libwebrtc-screen-cast-sync.patch
+
+Fixes: https://bugs.archlinux.org/task/76231
+Fixes: https://bugzilla.mozilla.org/show_bug.cgi?id=1790496
+---
+ dom/media/webrtc/moz.build | 2 +
+ third_party/drm/README | 4 +
+ third_party/drm/drm/drm.h | 1193 ++++++++++++++
+ third_party/drm/drm/drm_fourcc.h | 1377 +++++++++++++++++
+ third_party/drm/drm/drm_mode.h | 1217 +++++++++++++++
+ third_party/drm/drm/xf86drm.h | 966 ++++++++++++
+ .../libpipewire => drm/libdrm}/moz.build | 4 +-
+ third_party/drm/libdrm/mozdrm.cpp | 66 +
+ third_party/gbm/README | 4 +
+ third_party/gbm/gbm/gbm.h | 452 ++++++
+ .../libpipewire => gbm/libgbm}/moz.build | 4 +-
+ third_party/gbm/libgbm/mozgbm.cpp | 66 +
+ .../desktop_capture_gn/moz.build | 48 +-
+ .../desktop_capture_options.cc | 4 +-
+ .../desktop_capture/desktop_capture_options.h | 6 +-
+ .../linux/wayland/base_capturer_pipewire.cc | 2 +-
+ .../desktop_capture/screen_capturer_linux.cc | 8 -
+ .../desktop_capture/window_capturer_linux.cc | 8 -
+ third_party/moz.build | 6 +
+ .../pipewire/libpipewire/mozpipewire.cpp | 49 +-
+ 20 files changed, 5453 insertions(+), 33 deletions(-)
+ create mode 100644 third_party/drm/README
+ create mode 100644 third_party/drm/drm/drm.h
+ create mode 100644 third_party/drm/drm/drm_fourcc.h
+ create mode 100644 third_party/drm/drm/drm_mode.h
+ create mode 100644 third_party/drm/drm/xf86drm.h
+ copy third_party/{pipewire/libpipewire => drm/libdrm}/moz.build (86%)
+ create mode 100644 third_party/drm/libdrm/mozdrm.cpp
+ create mode 100644 third_party/gbm/README
+ create mode 100644 third_party/gbm/gbm/gbm.h
+ copy third_party/{pipewire/libpipewire => gbm/libgbm}/moz.build (86%)
+ create mode 100644 third_party/gbm/libgbm/mozgbm.cpp
+
+diff --git a/dom/media/webrtc/moz.build b/dom/media/webrtc/moz.build
+index b6e09dbb5c9a..ada0fcb4a5d9 100644
+--- a/dom/media/webrtc/moz.build
++++ b/dom/media/webrtc/moz.build
+@@ -84,6 +84,8 @@ if CONFIG["MOZ_WEBRTC_SIGNALING"]:
+ ]
+
+ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
++ DIRS += ["/third_party/drm/libdrm"]
++ DIRS += ["/third_party/gbm/libgbm"]
+ DIRS += ["/third_party/pipewire/libpipewire"]
+
+ # Avoid warnings from third-party code that we can not modify.
+diff --git a/third_party/drm/README b/third_party/drm/README
+new file mode 100644
+index 000000000000..f68ed100bb77
+--- /dev/null
++++ b/third_party/drm/README
+@@ -0,0 +1,4 @@
++Libdrm is a drm library wrapper needed to build and run Firefox with
++Pipewire support on Linux (https://gitlab.freedesktop.org/mesa/drm)
++
++libdrm directory stores headers of libdrm needed for build only.
+diff --git a/third_party/drm/drm/drm.h b/third_party/drm/drm/drm.h
+new file mode 100644
+index 000000000000..5e54c3aa4c3a
+--- /dev/null
++++ b/third_party/drm/drm/drm.h
+@@ -0,0 +1,1193 @@
++/*
++ * Header for the Direct Rendering Manager
++ *
++ * Author: Rickard E. (Rik) Faith <faith(a)valinux.com>
++ *
++ * Acknowledgments:
++ * Dec 1999, Richard Henderson <rth(a)twiddle.net>, move to generic cmpxchg.
++ */
++
++/*
++ * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
++ * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
++ * All rights reserved.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++#ifndef _DRM_H_
++#define _DRM_H_
++
++#if defined(__linux__)
++
++#include <linux/types.h>
++#include <asm/ioctl.h>
++typedef unsigned int drm_handle_t;
++
++#else /* One of the BSDs */
++
++#include <stdint.h>
++#include <sys/ioccom.h>
++#include <sys/types.h>
++typedef int8_t __s8;
++typedef uint8_t __u8;
++typedef int16_t __s16;
++typedef uint16_t __u16;
++typedef int32_t __s32;
++typedef uint32_t __u32;
++typedef int64_t __s64;
++typedef uint64_t __u64;
++typedef size_t __kernel_size_t;
++typedef unsigned long drm_handle_t;
++
++#endif
++
++#if defined(__cplusplus)
++extern "C" {
++#endif
++
++#define DRM_NAME "drm" /**< Name in kernel, /dev, and /proc */
++#define DRM_MIN_ORDER 5 /**< At least 2^5 bytes = 32 bytes */
++#define DRM_MAX_ORDER 22 /**< Up to 2^22 bytes = 4MB */
++#define DRM_RAM_PERCENT 10 /**< How much system ram can we lock? */
++
++#define _DRM_LOCK_HELD 0x80000000U /**< Hardware lock is held */
++#define _DRM_LOCK_CONT 0x40000000U /**< Hardware lock is contended */
++#define _DRM_LOCK_IS_HELD(lock) ((lock) & _DRM_LOCK_HELD)
++#define _DRM_LOCK_IS_CONT(lock) ((lock) & _DRM_LOCK_CONT)
++#define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT))
++
++typedef unsigned int drm_context_t;
++typedef unsigned int drm_drawable_t;
++typedef unsigned int drm_magic_t;
++
++/*
++ * Cliprect.
++ *
++ * \warning: If you change this structure, make sure you change
++ * XF86DRIClipRectRec in the server as well
++ *
++ * \note KW: Actually it's illegal to change either for
++ * backwards-compatibility reasons.
++ */
++struct drm_clip_rect {
++ unsigned short x1;
++ unsigned short y1;
++ unsigned short x2;
++ unsigned short y2;
++};
++
++/*
++ * Drawable information.
++ */
++struct drm_drawable_info {
++ unsigned int num_rects;
++ struct drm_clip_rect *rects;
++};
++
++/*
++ * Texture region,
++ */
++struct drm_tex_region {
++ unsigned char next;
++ unsigned char prev;
++ unsigned char in_use;
++ unsigned char padding;
++ unsigned int age;
++};
++
++/*
++ * Hardware lock.
++ *
++ * The lock structure is a simple cache-line aligned integer. To avoid
++ * processor bus contention on a multiprocessor system, there should not be any
++ * other data stored in the same cache line.
++ */
++struct drm_hw_lock {
++ __volatile__ unsigned int lock; /**< lock variable */
++ char padding[60]; /**< Pad to cache line */
++};
++
++/*
++ * DRM_IOCTL_VERSION ioctl argument type.
++ *
++ * \sa drmGetVersion().
++ */
++struct drm_version {
++ int version_major; /**< Major version */
++ int version_minor; /**< Minor version */
++ int version_patchlevel; /**< Patch level */
++ __kernel_size_t name_len; /**< Length of name buffer */
++ char *name; /**< Name of driver */
++ __kernel_size_t date_len; /**< Length of date buffer */
++ char *date; /**< User-space buffer to hold date */
++ __kernel_size_t desc_len; /**< Length of desc buffer */
++ char *desc; /**< User-space buffer to hold desc */
++};
++
++/*
++ * DRM_IOCTL_GET_UNIQUE ioctl argument type.
++ *
++ * \sa drmGetBusid() and drmSetBusId().
++ */
++struct drm_unique {
++ __kernel_size_t unique_len; /**< Length of unique */
++ char *unique; /**< Unique name for driver instantiation */
++};
++
++struct drm_list {
++ int count; /**< Length of user-space structures */
++ struct drm_version *version;
++};
++
++struct drm_block {
++ int unused;
++};
++
++/*
++ * DRM_IOCTL_CONTROL ioctl argument type.
++ *
++ * \sa drmCtlInstHandler() and drmCtlUninstHandler().
++ */
++struct drm_control {
++ enum {
++ DRM_ADD_COMMAND,
++ DRM_RM_COMMAND,
++ DRM_INST_HANDLER,
++ DRM_UNINST_HANDLER
++ } func;
++ int irq;
++};
++
++/*
++ * Type of memory to map.
++ */
++enum drm_map_type {
++ _DRM_FRAME_BUFFER = 0, /**< WC (no caching), no core dump */
++ _DRM_REGISTERS = 1, /**< no caching, no core dump */
++ _DRM_SHM = 2, /**< shared, cached */
++ _DRM_AGP = 3, /**< AGP/GART */
++ _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */
++ _DRM_CONSISTENT = 5 /**< Consistent memory for PCI DMA */
++};
++
++/*
++ * Memory mapping flags.
++ */
++enum drm_map_flags {
++ _DRM_RESTRICTED = 0x01, /**< Cannot be mapped to user-virtual */
++ _DRM_READ_ONLY = 0x02,
++ _DRM_LOCKED = 0x04, /**< shared, cached, locked */
++ _DRM_KERNEL = 0x08, /**< kernel requires access */
++ _DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */
++ _DRM_CONTAINS_LOCK = 0x20, /**< SHM page that contains lock */
++ _DRM_REMOVABLE = 0x40, /**< Removable mapping */
++ _DRM_DRIVER = 0x80 /**< Managed by driver */
++};
++
++struct drm_ctx_priv_map {
++ unsigned int ctx_id; /**< Context requesting private mapping */
++ void *handle; /**< Handle of map */
++};
++
++/*
++ * DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls
++ * argument type.
++ *
++ * \sa drmAddMap().
++ */
++struct drm_map {
++ unsigned long offset; /**< Requested physical address (0 for SAREA)*/
++ unsigned long size; /**< Requested physical size (bytes) */
++ enum drm_map_type type; /**< Type of memory to map */
++ enum drm_map_flags flags; /**< Flags */
++ void *handle; /**< User-space: "Handle" to pass to mmap() */
++ /**< Kernel-space: kernel-virtual address */
++ int mtrr; /**< MTRR slot used */
++ /* Private data */
++};
++
++/*
++ * DRM_IOCTL_GET_CLIENT ioctl argument type.
++ */
++struct drm_client {
++ int idx; /**< Which client desired? */
++ int auth; /**< Is client authenticated? */
++ unsigned long pid; /**< Process ID */
++ unsigned long uid; /**< User ID */
++ unsigned long magic; /**< Magic */
++ unsigned long iocs; /**< Ioctl count */
++};
++
++enum drm_stat_type {
++ _DRM_STAT_LOCK,
++ _DRM_STAT_OPENS,
++ _DRM_STAT_CLOSES,
++ _DRM_STAT_IOCTLS,
++ _DRM_STAT_LOCKS,
++ _DRM_STAT_UNLOCKS,
++ _DRM_STAT_VALUE, /**< Generic value */
++ _DRM_STAT_BYTE, /**< Generic byte counter (1024bytes/K) */
++ _DRM_STAT_COUNT, /**< Generic non-byte counter (1000/k) */
++
++ _DRM_STAT_IRQ, /**< IRQ */
++ _DRM_STAT_PRIMARY, /**< Primary DMA bytes */
++ _DRM_STAT_SECONDARY, /**< Secondary DMA bytes */
++ _DRM_STAT_DMA, /**< DMA */
++ _DRM_STAT_SPECIAL, /**< Special DMA (e.g., priority or polled) */
++ _DRM_STAT_MISSED /**< Missed DMA opportunity */
++ /* Add to the *END* of the list */
++};
++
++/*
++ * DRM_IOCTL_GET_STATS ioctl argument type.
++ */
++struct drm_stats {
++ unsigned long count;
++ struct {
++ unsigned long value;
++ enum drm_stat_type type;
++ } data[15];
++};
++
++/*
++ * Hardware locking flags.
++ */
++enum drm_lock_flags {
++ _DRM_LOCK_READY = 0x01, /**< Wait until hardware is ready for DMA */
++ _DRM_LOCK_QUIESCENT = 0x02, /**< Wait until hardware quiescent */
++ _DRM_LOCK_FLUSH = 0x04, /**< Flush this context's DMA queue first */
++ _DRM_LOCK_FLUSH_ALL = 0x08, /**< Flush all DMA queues first */
++ /* These *HALT* flags aren't supported yet
++ -- they will be used to support the
++ full-screen DGA-like mode. */
++ _DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */
++ _DRM_HALT_CUR_QUEUES = 0x20 /**< Halt all current queues */
++};
++
++/*
++ * DRM_IOCTL_LOCK, DRM_IOCTL_UNLOCK and DRM_IOCTL_FINISH ioctl argument type.
++ *
++ * \sa drmGetLock() and drmUnlock().
++ */
++struct drm_lock {
++ int context;
++ enum drm_lock_flags flags;
++};
++
++/*
++ * DMA flags
++ *
++ * \warning
++ * These values \e must match xf86drm.h.
++ *
++ * \sa drm_dma.
++ */
++enum drm_dma_flags {
++ /* Flags for DMA buffer dispatch */
++ _DRM_DMA_BLOCK = 0x01, /**<
++ * Block until buffer dispatched.
++ *
++ * \note The buffer may not yet have
++ * been processed by the hardware --
++ * getting a hardware lock with the
++ * hardware quiescent will ensure
++ * that the buffer has been
++ * processed.
++ */
++ _DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */
++ _DRM_DMA_PRIORITY = 0x04, /**< High priority dispatch */
++
++ /* Flags for DMA buffer request */
++ _DRM_DMA_WAIT = 0x10, /**< Wait for free buffers */
++ _DRM_DMA_SMALLER_OK = 0x20, /**< Smaller-than-requested buffers OK */
++ _DRM_DMA_LARGER_OK = 0x40 /**< Larger-than-requested buffers OK */
++};
++
++/*
++ * DRM_IOCTL_ADD_BUFS and DRM_IOCTL_MARK_BUFS ioctl argument type.
++ *
++ * \sa drmAddBufs().
++ */
++struct drm_buf_desc {
++ int count; /**< Number of buffers of this size */
++ int size; /**< Size in bytes */
++ int low_mark; /**< Low water mark */
++ int high_mark; /**< High water mark */
++ enum {
++ _DRM_PAGE_ALIGN = 0x01, /**< Align on page boundaries for DMA */
++ _DRM_AGP_BUFFER = 0x02, /**< Buffer is in AGP space */
++ _DRM_SG_BUFFER = 0x04, /**< Scatter/gather memory buffer */
++ _DRM_FB_BUFFER = 0x08, /**< Buffer is in frame buffer */
++ _DRM_PCI_BUFFER_RO = 0x10 /**< Map PCI DMA buffer read-only */
++ } flags;
++ unsigned long agp_start; /**<
++ * Start address of where the AGP buffers are
++ * in the AGP aperture
++ */
++};
++
++/*
++ * DRM_IOCTL_INFO_BUFS ioctl argument type.
++ */
++struct drm_buf_info {
++ int count; /**< Entries in list */
++ struct drm_buf_desc *list;
++};
++
++/*
++ * DRM_IOCTL_FREE_BUFS ioctl argument type.
++ */
++struct drm_buf_free {
++ int count;
++ int *list;
++};
++
++/*
++ * Buffer information
++ *
++ * \sa drm_buf_map.
++ */
++struct drm_buf_pub {
++ int idx; /**< Index into the master buffer list */
++ int total; /**< Buffer size */
++ int used; /**< Amount of buffer in use (for DMA) */
++ void *address; /**< Address of buffer */
++};
++
++/*
++ * DRM_IOCTL_MAP_BUFS ioctl argument type.
++ */
++struct drm_buf_map {
++ int count; /**< Length of the buffer list */
++#ifdef __cplusplus
++ void *virt;
++#else
++ void *virtual; /**< Mmap'd area in user-virtual */
++#endif
++ struct drm_buf_pub *list; /**< Buffer information */
++};
++
++/*
++ * DRM_IOCTL_DMA ioctl argument type.
++ *
++ * Indices here refer to the offset into the buffer list in drm_buf_get.
++ *
++ * \sa drmDMA().
++ */
++struct drm_dma {
++ int context; /**< Context handle */
++ int send_count; /**< Number of buffers to send */
++ int *send_indices; /**< List of handles to buffers */
++ int *send_sizes; /**< Lengths of data to send */
++ enum drm_dma_flags flags; /**< Flags */
++ int request_count; /**< Number of buffers requested */
++ int request_size; /**< Desired size for buffers */
++ int *request_indices; /**< Buffer information */
++ int *request_sizes;
++ int granted_count; /**< Number of buffers granted */
++};
++
++enum drm_ctx_flags {
++ _DRM_CONTEXT_PRESERVED = 0x01,
++ _DRM_CONTEXT_2DONLY = 0x02
++};
++
++/*
++ * DRM_IOCTL_ADD_CTX ioctl argument type.
++ *
++ * \sa drmCreateContext() and drmDestroyContext().
++ */
++struct drm_ctx {
++ drm_context_t handle;
++ enum drm_ctx_flags flags;
++};
++
++/*
++ * DRM_IOCTL_RES_CTX ioctl argument type.
++ */
++struct drm_ctx_res {
++ int count;
++ struct drm_ctx *contexts;
++};
++
++/*
++ * DRM_IOCTL_ADD_DRAW and DRM_IOCTL_RM_DRAW ioctl argument type.
++ */
++struct drm_draw {
++ drm_drawable_t handle;
++};
++
++/*
++ * DRM_IOCTL_UPDATE_DRAW ioctl argument type.
++ */
++typedef enum {
++ DRM_DRAWABLE_CLIPRECTS
++} drm_drawable_info_type_t;
++
++struct drm_update_draw {
++ drm_drawable_t handle;
++ unsigned int type;
++ unsigned int num;
++ unsigned long long data;
++};
++
++/*
++ * DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type.
++ */
++struct drm_auth {
++ drm_magic_t magic;
++};
++
++/*
++ * DRM_IOCTL_IRQ_BUSID ioctl argument type.
++ *
++ * \sa drmGetInterruptFromBusID().
++ */
++struct drm_irq_busid {
++ int irq; /**< IRQ number */
++ int busnum; /**< bus number */
++ int devnum; /**< device number */
++ int funcnum; /**< function number */
++};
++
++enum drm_vblank_seq_type {
++ _DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */
++ _DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */
++ /* bits 1-6 are reserved for high crtcs */
++ _DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e,
++ _DRM_VBLANK_EVENT = 0x4000000, /**< Send event instead of blocking */
++ _DRM_VBLANK_FLIP = 0x8000000, /**< Scheduled buffer swap should flip */
++ _DRM_VBLANK_NEXTONMISS = 0x10000000, /**< If missed, wait for next vblank */
++ _DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */
++ _DRM_VBLANK_SIGNAL = 0x40000000 /**< Send signal instead of blocking, unsupported */
++};
++#define _DRM_VBLANK_HIGH_CRTC_SHIFT 1
++
++#define _DRM_VBLANK_TYPES_MASK (_DRM_VBLANK_ABSOLUTE | _DRM_VBLANK_RELATIVE)
++#define _DRM_VBLANK_FLAGS_MASK (_DRM_VBLANK_EVENT | _DRM_VBLANK_SIGNAL | \
++ _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS)
++
++struct drm_wait_vblank_request {
++ enum drm_vblank_seq_type type;
++ unsigned int sequence;
++ unsigned long signal;
++};
++
++struct drm_wait_vblank_reply {
++ enum drm_vblank_seq_type type;
++ unsigned int sequence;
++ long tval_sec;
++ long tval_usec;
++};
++
++/*
++ * DRM_IOCTL_WAIT_VBLANK ioctl argument type.
++ *
++ * \sa drmWaitVBlank().
++ */
++union drm_wait_vblank {
++ struct drm_wait_vblank_request request;
++ struct drm_wait_vblank_reply reply;
++};
++
++#define _DRM_PRE_MODESET 1
++#define _DRM_POST_MODESET 2
++
++/*
++ * DRM_IOCTL_MODESET_CTL ioctl argument type
++ *
++ * \sa drmModesetCtl().
++ */
++struct drm_modeset_ctl {
++ __u32 crtc;
++ __u32 cmd;
++};
++
++/*
++ * DRM_IOCTL_AGP_ENABLE ioctl argument type.
++ *
++ * \sa drmAgpEnable().
++ */
++struct drm_agp_mode {
++ unsigned long mode; /**< AGP mode */
++};
++
++/*
++ * DRM_IOCTL_AGP_ALLOC and DRM_IOCTL_AGP_FREE ioctls argument type.
++ *
++ * \sa drmAgpAlloc() and drmAgpFree().
++ */
++struct drm_agp_buffer {
++ unsigned long size; /**< In bytes -- will round to page boundary */
++ unsigned long handle; /**< Used for binding / unbinding */
++ unsigned long type; /**< Type of memory to allocate */
++ unsigned long physical; /**< Physical used by i810 */
++};
++
++/*
++ * DRM_IOCTL_AGP_BIND and DRM_IOCTL_AGP_UNBIND ioctls argument type.
++ *
++ * \sa drmAgpBind() and drmAgpUnbind().
++ */
++struct drm_agp_binding {
++ unsigned long handle; /**< From drm_agp_buffer */
++ unsigned long offset; /**< In bytes -- will round to page boundary */
++};
++
++/*
++ * DRM_IOCTL_AGP_INFO ioctl argument type.
++ *
++ * \sa drmAgpVersionMajor(), drmAgpVersionMinor(), drmAgpGetMode(),
++ * drmAgpBase(), drmAgpSize(), drmAgpMemoryUsed(), drmAgpMemoryAvail(),
++ * drmAgpVendorId() and drmAgpDeviceId().
++ */
++struct drm_agp_info {
++ int agp_version_major;
++ int agp_version_minor;
++ unsigned long mode;
++ unsigned long aperture_base; /* physical address */
++ unsigned long aperture_size; /* bytes */
++ unsigned long memory_allowed; /* bytes */
++ unsigned long memory_used;
++
++ /* PCI information */
++ unsigned short id_vendor;
++ unsigned short id_device;
++};
++
++/*
++ * DRM_IOCTL_SG_ALLOC ioctl argument type.
++ */
++struct drm_scatter_gather {
++ unsigned long size; /**< In bytes -- will round to page boundary */
++ unsigned long handle; /**< Used for mapping / unmapping */
++};
++
++/*
++ * DRM_IOCTL_SET_VERSION ioctl argument type.
++ */
++struct drm_set_version {
++ int drm_di_major;
++ int drm_di_minor;
++ int drm_dd_major;
++ int drm_dd_minor;
++};
++
++/* DRM_IOCTL_GEM_CLOSE ioctl argument type */
++struct drm_gem_close {
++ /** Handle of the object to be closed. */
++ __u32 handle;
++ __u32 pad;
++};
++
++/* DRM_IOCTL_GEM_FLINK ioctl argument type */
++struct drm_gem_flink {
++ /** Handle for the object being named */
++ __u32 handle;
++
++ /** Returned global name */
++ __u32 name;
++};
++
++/* DRM_IOCTL_GEM_OPEN ioctl argument type */
++struct drm_gem_open {
++ /** Name of object being opened */
++ __u32 name;
++
++ /** Returned handle for the object */
++ __u32 handle;
++
++ /** Returned size of the object */
++ __u64 size;
++};
++
++/**
++ * DRM_CAP_DUMB_BUFFER
++ *
++ * If set to 1, the driver supports creating dumb buffers via the
++ * &DRM_IOCTL_MODE_CREATE_DUMB ioctl.
++ */
++#define DRM_CAP_DUMB_BUFFER 0x1
++/**
++ * DRM_CAP_VBLANK_HIGH_CRTC
++ *
++ * If set to 1, the kernel supports specifying a :ref:`CRTC index<crtc_index>`
++ * in the high bits of &drm_wait_vblank_request.type.
++ *
++ * Starting kernel version 2.6.39, this capability is always set to 1.
++ */
++#define DRM_CAP_VBLANK_HIGH_CRTC 0x2
++/**
++ * DRM_CAP_DUMB_PREFERRED_DEPTH
++ *
++ * The preferred bit depth for dumb buffers.
++ *
++ * The bit depth is the number of bits used to indicate the color of a single
++ * pixel excluding any padding. This is different from the number of bits per
++ * pixel. For instance, XRGB8888 has a bit depth of 24 but has 32 bits per
++ * pixel.
++ *
++ * Note that this preference only applies to dumb buffers, it's irrelevant for
++ * other types of buffers.
++ */
++#define DRM_CAP_DUMB_PREFERRED_DEPTH 0x3
++/**
++ * DRM_CAP_DUMB_PREFER_SHADOW
++ *
++ * If set to 1, the driver prefers userspace to render to a shadow buffer
++ * instead of directly rendering to a dumb buffer. For best speed, userspace
++ * should do streaming ordered memory copies into the dumb buffer and never
++ * read from it.
++ *
++ * Note that this preference only applies to dumb buffers, it's irrelevant for
++ * other types of buffers.
++ */
++#define DRM_CAP_DUMB_PREFER_SHADOW 0x4
++/**
++ * DRM_CAP_PRIME
++ *
++ * Bitfield of supported PRIME sharing capabilities. See &DRM_PRIME_CAP_IMPORT
++ * and &DRM_PRIME_CAP_EXPORT.
++ *
++ * PRIME buffers are exposed as dma-buf file descriptors. See
++ * Documentation/gpu/drm-mm.rst, section "PRIME Buffer Sharing".
++ */
++#define DRM_CAP_PRIME 0x5
++/**
++ * DRM_PRIME_CAP_IMPORT
++ *
++ * If this bit is set in &DRM_CAP_PRIME, the driver supports importing PRIME
++ * buffers via the &DRM_IOCTL_PRIME_FD_TO_HANDLE ioctl.
++ */
++#define DRM_PRIME_CAP_IMPORT 0x1
++/**
++ * DRM_PRIME_CAP_EXPORT
++ *
++ * If this bit is set in &DRM_CAP_PRIME, the driver supports exporting PRIME
++ * buffers via the &DRM_IOCTL_PRIME_HANDLE_TO_FD ioctl.
++ */
++#define DRM_PRIME_CAP_EXPORT 0x2
++/**
++ * DRM_CAP_TIMESTAMP_MONOTONIC
++ *
++ * If set to 0, the kernel will report timestamps with ``CLOCK_REALTIME`` in
++ * struct drm_event_vblank. If set to 1, the kernel will report timestamps with
++ * ``CLOCK_MONOTONIC``. See ``clock_gettime(2)`` for the definition of these
++ * clocks.
++ *
++ * Starting from kernel version 2.6.39, the default value for this capability
++ * is 1. Starting kernel version 4.15, this capability is always set to 1.
++ */
++#define DRM_CAP_TIMESTAMP_MONOTONIC 0x6
++/**
++ * DRM_CAP_ASYNC_PAGE_FLIP
++ *
++ * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC.
++ */
++#define DRM_CAP_ASYNC_PAGE_FLIP 0x7
++/**
++ * DRM_CAP_CURSOR_WIDTH
++ *
++ * The ``CURSOR_WIDTH`` and ``CURSOR_HEIGHT`` capabilities return a valid
++ * width x height combination for the hardware cursor. The intention is that a
++ * hardware agnostic userspace can query a cursor plane size to use.
++ *
++ * Note that the cross-driver contract is to merely return a valid size;
++ * drivers are free to attach another meaning on top, eg. i915 returns the
++ * maximum plane size.
++ */
++#define DRM_CAP_CURSOR_WIDTH 0x8
++/**
++ * DRM_CAP_CURSOR_HEIGHT
++ *
++ * See &DRM_CAP_CURSOR_WIDTH.
++ */
++#define DRM_CAP_CURSOR_HEIGHT 0x9
++/**
++ * DRM_CAP_ADDFB2_MODIFIERS
++ *
++ * If set to 1, the driver supports supplying modifiers in the
++ * &DRM_IOCTL_MODE_ADDFB2 ioctl.
++ */
++#define DRM_CAP_ADDFB2_MODIFIERS 0x10
++/**
++ * DRM_CAP_PAGE_FLIP_TARGET
++ *
++ * If set to 1, the driver supports the &DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE and
++ * &DRM_MODE_PAGE_FLIP_TARGET_RELATIVE flags in
++ * &drm_mode_crtc_page_flip_target.flags for the &DRM_IOCTL_MODE_PAGE_FLIP
++ * ioctl.
++ */
++#define DRM_CAP_PAGE_FLIP_TARGET 0x11
++/**
++ * DRM_CAP_CRTC_IN_VBLANK_EVENT
++ *
++ * If set to 1, the kernel supports reporting the CRTC ID in
++ * &drm_event_vblank.crtc_id for the &DRM_EVENT_VBLANK and
++ * &DRM_EVENT_FLIP_COMPLETE events.
++ *
++ * Starting kernel version 4.12, this capability is always set to 1.
++ */
++#define DRM_CAP_CRTC_IN_VBLANK_EVENT 0x12
++/**
++ * DRM_CAP_SYNCOBJ
++ *
++ * If set to 1, the driver supports sync objects. See
++ * Documentation/gpu/drm-mm.rst, section "DRM Sync Objects".
++ */
++#define DRM_CAP_SYNCOBJ 0x13
++/**
++ * DRM_CAP_SYNCOBJ_TIMELINE
++ *
++ * If set to 1, the driver supports timeline operations on sync objects. See
++ * Documentation/gpu/drm-mm.rst, section "DRM Sync Objects".
++ */
++#define DRM_CAP_SYNCOBJ_TIMELINE 0x14
++
++/* DRM_IOCTL_GET_CAP ioctl argument type */
++struct drm_get_cap {
++ __u64 capability;
++ __u64 value;
++};
++
++/**
++ * DRM_CLIENT_CAP_STEREO_3D
++ *
++ * If set to 1, the DRM core will expose the stereo 3D capabilities of the
++ * monitor by advertising the supported 3D layouts in the flags of struct
++ * drm_mode_modeinfo. See ``DRM_MODE_FLAG_3D_*``.
++ *
++ * This capability is always supported for all drivers starting from kernel
++ * version 3.13.
++ */
++#define DRM_CLIENT_CAP_STEREO_3D 1
++
++/**
++ * DRM_CLIENT_CAP_UNIVERSAL_PLANES
++ *
++ * If set to 1, the DRM core will expose all planes (overlay, primary, and
++ * cursor) to userspace.
++ *
++ * This capability has been introduced in kernel version 3.15. Starting from
++ * kernel version 3.17, this capability is always supported for all drivers.
++ */
++#define DRM_CLIENT_CAP_UNIVERSAL_PLANES 2
++
++/**
++ * DRM_CLIENT_CAP_ATOMIC
++ *
++ * If set to 1, the DRM core will expose atomic properties to userspace. This
++ * implicitly enables &DRM_CLIENT_CAP_UNIVERSAL_PLANES and
++ * &DRM_CLIENT_CAP_ASPECT_RATIO.
++ *
++ * If the driver doesn't support atomic mode-setting, enabling this capability
++ * will fail with -EOPNOTSUPP.
++ *
++ * This capability has been introduced in kernel version 4.0. Starting from
++ * kernel version 4.2, this capability is always supported for atomic-capable
++ * drivers.
++ */
++#define DRM_CLIENT_CAP_ATOMIC 3
++
++/**
++ * DRM_CLIENT_CAP_ASPECT_RATIO
++ *
++ * If set to 1, the DRM core will provide aspect ratio information in modes.
++ * See ``DRM_MODE_FLAG_PIC_AR_*``.
++ *
++ * This capability is always supported for all drivers starting from kernel
++ * version 4.18.
++ */
++#define DRM_CLIENT_CAP_ASPECT_RATIO 4
++
++/**
++ * DRM_CLIENT_CAP_WRITEBACK_CONNECTORS
++ *
++ * If set to 1, the DRM core will expose special connectors to be used for
++ * writing back to memory the scene setup in the commit. The client must enable
++ * &DRM_CLIENT_CAP_ATOMIC first.
++ *
++ * This capability is always supported for atomic-capable drivers starting from
++ * kernel version 4.19.
++ */
++#define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5
++
++/* DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */
++struct drm_set_client_cap {
++ __u64 capability;
++ __u64 value;
++};
++
++#define DRM_RDWR O_RDWR
++#define DRM_CLOEXEC O_CLOEXEC
++struct drm_prime_handle {
++ __u32 handle;
++
++ /** Flags.. only applicable for handle->fd */
++ __u32 flags;
++
++ /** Returned dmabuf file descriptor */
++ __s32 fd;
++};
++
++struct drm_syncobj_create {
++ __u32 handle;
++#define DRM_SYNCOBJ_CREATE_SIGNALED (1 << 0)
++ __u32 flags;
++};
++
++struct drm_syncobj_destroy {
++ __u32 handle;
++ __u32 pad;
++};
++
++#define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE (1 << 0)
++#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0)
++struct drm_syncobj_handle {
++ __u32 handle;
++ __u32 flags;
++
++ __s32 fd;
++ __u32 pad;
++};
++
++struct drm_syncobj_transfer {
++ __u32 src_handle;
++ __u32 dst_handle;
++ __u64 src_point;
++ __u64 dst_point;
++ __u32 flags;
++ __u32 pad;
++};
++
++#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
++#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
++#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 2) /* wait for time point to become available */
++struct drm_syncobj_wait {
++ __u64 handles;
++ /* absolute timeout */
++ __s64 timeout_nsec;
++ __u32 count_handles;
++ __u32 flags;
++ __u32 first_signaled; /* only valid when not waiting all */
++ __u32 pad;
++};
++
++struct drm_syncobj_timeline_wait {
++ __u64 handles;
++ /* wait on specific timeline point for every handles*/
++ __u64 points;
++ /* absolute timeout */
++ __s64 timeout_nsec;
++ __u32 count_handles;
++ __u32 flags;
++ __u32 first_signaled; /* only valid when not waiting all */
++ __u32 pad;
++};
++
++
++struct drm_syncobj_array {
++ __u64 handles;
++ __u32 count_handles;
++ __u32 pad;
++};
++
++#define DRM_SYNCOBJ_QUERY_FLAGS_LAST_SUBMITTED (1 << 0) /* last available point on timeline syncobj */
++struct drm_syncobj_timeline_array {
++ __u64 handles;
++ __u64 points;
++ __u32 count_handles;
++ __u32 flags;
++};
++
++
++/* Query current scanout sequence number */
++struct drm_crtc_get_sequence {
++ __u32 crtc_id; /* requested crtc_id */
++ __u32 active; /* return: crtc output is active */
++ __u64 sequence; /* return: most recent vblank sequence */
++ __s64 sequence_ns; /* return: most recent time of first pixel out */
++};
++
++/* Queue event to be delivered at specified sequence. Time stamp marks
++ * when the first pixel of the refresh cycle leaves the display engine
++ * for the display
++ */
++#define DRM_CRTC_SEQUENCE_RELATIVE 0x00000001 /* sequence is relative to current */
++#define DRM_CRTC_SEQUENCE_NEXT_ON_MISS 0x00000002 /* Use next sequence if we've missed */
++
++struct drm_crtc_queue_sequence {
++ __u32 crtc_id;
++ __u32 flags;
++ __u64 sequence; /* on input, target sequence. on output, actual sequence */
++ __u64 user_data; /* user data passed to event */
++};
++
++#if defined(__cplusplus)
++}
++#endif
++
++#include "drm_mode.h"
++
++#if defined(__cplusplus)
++extern "C" {
++#endif
++
++#define DRM_IOCTL_BASE 'd'
++#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
++#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
++#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type)
++#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type)
++
++#define DRM_IOCTL_VERSION DRM_IOWR(0x00, struct drm_version)
++#define DRM_IOCTL_GET_UNIQUE DRM_IOWR(0x01, struct drm_unique)
++#define DRM_IOCTL_GET_MAGIC DRM_IOR( 0x02, struct drm_auth)
++#define DRM_IOCTL_IRQ_BUSID DRM_IOWR(0x03, struct drm_irq_busid)
++#define DRM_IOCTL_GET_MAP DRM_IOWR(0x04, struct drm_map)
++#define DRM_IOCTL_GET_CLIENT DRM_IOWR(0x05, struct drm_client)
++#define DRM_IOCTL_GET_STATS DRM_IOR( 0x06, struct drm_stats)
++#define DRM_IOCTL_SET_VERSION DRM_IOWR(0x07, struct drm_set_version)
++#define DRM_IOCTL_MODESET_CTL DRM_IOW(0x08, struct drm_modeset_ctl)
++#define DRM_IOCTL_GEM_CLOSE DRM_IOW (0x09, struct drm_gem_close)
++#define DRM_IOCTL_GEM_FLINK DRM_IOWR(0x0a, struct drm_gem_flink)
++#define DRM_IOCTL_GEM_OPEN DRM_IOWR(0x0b, struct drm_gem_open)
++#define DRM_IOCTL_GET_CAP DRM_IOWR(0x0c, struct drm_get_cap)
++#define DRM_IOCTL_SET_CLIENT_CAP DRM_IOW( 0x0d, struct drm_set_client_cap)
++
++#define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, struct drm_unique)
++#define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, struct drm_auth)
++#define DRM_IOCTL_BLOCK DRM_IOWR(0x12, struct drm_block)
++#define DRM_IOCTL_UNBLOCK DRM_IOWR(0x13, struct drm_block)
++#define DRM_IOCTL_CONTROL DRM_IOW( 0x14, struct drm_control)
++#define DRM_IOCTL_ADD_MAP DRM_IOWR(0x15, struct drm_map)
++#define DRM_IOCTL_ADD_BUFS DRM_IOWR(0x16, struct drm_buf_desc)
++#define DRM_IOCTL_MARK_BUFS DRM_IOW( 0x17, struct drm_buf_desc)
++#define DRM_IOCTL_INFO_BUFS DRM_IOWR(0x18, struct drm_buf_info)
++#define DRM_IOCTL_MAP_BUFS DRM_IOWR(0x19, struct drm_buf_map)
++#define DRM_IOCTL_FREE_BUFS DRM_IOW( 0x1a, struct drm_buf_free)
++
++#define DRM_IOCTL_RM_MAP DRM_IOW( 0x1b, struct drm_map)
++
++#define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, struct drm_ctx_priv_map)
++#define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map)
++
++#define DRM_IOCTL_SET_MASTER DRM_IO(0x1e)
++#define DRM_IOCTL_DROP_MASTER DRM_IO(0x1f)
++
++#define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, struct drm_ctx)
++#define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, struct drm_ctx)
++#define DRM_IOCTL_MOD_CTX DRM_IOW( 0x22, struct drm_ctx)
++#define DRM_IOCTL_GET_CTX DRM_IOWR(0x23, struct drm_ctx)
++#define DRM_IOCTL_SWITCH_CTX DRM_IOW( 0x24, struct drm_ctx)
++#define DRM_IOCTL_NEW_CTX DRM_IOW( 0x25, struct drm_ctx)
++#define DRM_IOCTL_RES_CTX DRM_IOWR(0x26, struct drm_ctx_res)
++#define DRM_IOCTL_ADD_DRAW DRM_IOWR(0x27, struct drm_draw)
++#define DRM_IOCTL_RM_DRAW DRM_IOWR(0x28, struct drm_draw)
++#define DRM_IOCTL_DMA DRM_IOWR(0x29, struct drm_dma)
++#define DRM_IOCTL_LOCK DRM_IOW( 0x2a, struct drm_lock)
++#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, struct drm_lock)
++#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, struct drm_lock)
++
++#define DRM_IOCTL_PRIME_HANDLE_TO_FD DRM_IOWR(0x2d, struct drm_prime_handle)
++#define DRM_IOCTL_PRIME_FD_TO_HANDLE DRM_IOWR(0x2e, struct drm_prime_handle)
++
++#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30)
++#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31)
++#define DRM_IOCTL_AGP_ENABLE DRM_IOW( 0x32, struct drm_agp_mode)
++#define DRM_IOCTL_AGP_INFO DRM_IOR( 0x33, struct drm_agp_info)
++#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, struct drm_agp_buffer)
++#define DRM_IOCTL_AGP_FREE DRM_IOW( 0x35, struct drm_agp_buffer)
++#define DRM_IOCTL_AGP_BIND DRM_IOW( 0x36, struct drm_agp_binding)
++#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, struct drm_agp_binding)
++
++#define DRM_IOCTL_SG_ALLOC DRM_IOWR(0x38, struct drm_scatter_gather)
++#define DRM_IOCTL_SG_FREE DRM_IOW( 0x39, struct drm_scatter_gather)
++
++#define DRM_IOCTL_WAIT_VBLANK DRM_IOWR(0x3a, union drm_wait_vblank)
++
++#define DRM_IOCTL_CRTC_GET_SEQUENCE DRM_IOWR(0x3b, struct drm_crtc_get_sequence)
++#define DRM_IOCTL_CRTC_QUEUE_SEQUENCE DRM_IOWR(0x3c, struct drm_crtc_queue_sequence)
++
++#define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw)
++
++#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
++#define DRM_IOCTL_MODE_GETCRTC DRM_IOWR(0xA1, struct drm_mode_crtc)
++#define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA2, struct drm_mode_crtc)
++#define DRM_IOCTL_MODE_CURSOR DRM_IOWR(0xA3, struct drm_mode_cursor)
++#define DRM_IOCTL_MODE_GETGAMMA DRM_IOWR(0xA4, struct drm_mode_crtc_lut)
++#define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xA5, struct drm_mode_crtc_lut)
++#define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xA6, struct drm_mode_get_encoder)
++#define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector)
++#define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA8, struct drm_mode_mode_cmd) /* deprecated (never worked) */
++#define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd) /* deprecated (never worked) */
++
++#define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAA, struct drm_mode_get_property)
++#define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xAB, struct drm_mode_connector_set_property)
++#define DRM_IOCTL_MODE_GETPROPBLOB DRM_IOWR(0xAC, struct drm_mode_get_blob)
++#define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd)
++#define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd)
++/**
++ * DRM_IOCTL_MODE_RMFB - Remove a framebuffer.
++ *
++ * This removes a framebuffer previously added via ADDFB/ADDFB2. The IOCTL
++ * argument is a framebuffer object ID.
++ *
++ * Warning: removing a framebuffer currently in-use on an enabled plane will
++ * disable that plane. The CRTC the plane is linked to may also be disabled
++ * (depending on driver capabilities).
++ */
++#define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, unsigned int)
++#define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip)
++#define DRM_IOCTL_MODE_DIRTYFB DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd)
++
++#define DRM_IOCTL_MODE_CREATE_DUMB DRM_IOWR(0xB2, struct drm_mode_create_dumb)
++#define DRM_IOCTL_MODE_MAP_DUMB DRM_IOWR(0xB3, struct drm_mode_map_dumb)
++#define DRM_IOCTL_MODE_DESTROY_DUMB DRM_IOWR(0xB4, struct drm_mode_destroy_dumb)
++#define DRM_IOCTL_MODE_GETPLANERESOURCES DRM_IOWR(0xB5, struct drm_mode_get_plane_res)
++#define DRM_IOCTL_MODE_GETPLANE DRM_IOWR(0xB6, struct drm_mode_get_plane)
++#define DRM_IOCTL_MODE_SETPLANE DRM_IOWR(0xB7, struct drm_mode_set_plane)
++#define DRM_IOCTL_MODE_ADDFB2 DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
++#define DRM_IOCTL_MODE_OBJ_GETPROPERTIES DRM_IOWR(0xB9, struct drm_mode_obj_get_properties)
++#define DRM_IOCTL_MODE_OBJ_SETPROPERTY DRM_IOWR(0xBA, struct drm_mode_obj_set_property)
++#define DRM_IOCTL_MODE_CURSOR2 DRM_IOWR(0xBB, struct drm_mode_cursor2)
++#define DRM_IOCTL_MODE_ATOMIC DRM_IOWR(0xBC, struct drm_mode_atomic)
++#define DRM_IOCTL_MODE_CREATEPROPBLOB DRM_IOWR(0xBD, struct drm_mode_create_blob)
++#define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct drm_mode_destroy_blob)
++
++#define DRM_IOCTL_SYNCOBJ_CREATE DRM_IOWR(0xBF, struct drm_syncobj_create)
++#define DRM_IOCTL_SYNCOBJ_DESTROY DRM_IOWR(0xC0, struct drm_syncobj_destroy)
++#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle)
++#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle)
++#define DRM_IOCTL_SYNCOBJ_WAIT DRM_IOWR(0xC3, struct drm_syncobj_wait)
++#define DRM_IOCTL_SYNCOBJ_RESET DRM_IOWR(0xC4, struct drm_syncobj_array)
++#define DRM_IOCTL_SYNCOBJ_SIGNAL DRM_IOWR(0xC5, struct drm_syncobj_array)
++
++#define DRM_IOCTL_MODE_CREATE_LEASE DRM_IOWR(0xC6, struct drm_mode_create_lease)
++#define DRM_IOCTL_MODE_LIST_LESSEES DRM_IOWR(0xC7, struct drm_mode_list_lessees)
++#define DRM_IOCTL_MODE_GET_LEASE DRM_IOWR(0xC8, struct drm_mode_get_lease)
++#define DRM_IOCTL_MODE_REVOKE_LEASE DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
++
++#define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
++#define DRM_IOCTL_SYNCOBJ_QUERY DRM_IOWR(0xCB, struct drm_syncobj_timeline_array)
++#define DRM_IOCTL_SYNCOBJ_TRANSFER DRM_IOWR(0xCC, struct drm_syncobj_transfer)
++#define DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL DRM_IOWR(0xCD, struct drm_syncobj_timeline_array)
++
++#define DRM_IOCTL_MODE_GETFB2 DRM_IOWR(0xCE, struct drm_mode_fb_cmd2)
++
++/*
++ * Device specific ioctls should only be in their respective headers
++ * The device specific ioctl range is from 0x40 to 0x9f.
++ * Generic IOCTLS restart at 0xA0.
++ *
++ * \sa drmCommandNone(), drmCommandRead(), drmCommandWrite(), and
++ * drmCommandReadWrite().
++ */
++#define DRM_COMMAND_BASE 0x40
++#define DRM_COMMAND_END 0xA0
++
++/*
++ * Header for events written back to userspace on the drm fd. The
++ * type defines the type of event, the length specifies the total
++ * length of the event (including the header), and user_data is
++ * typically a 64 bit value passed with the ioctl that triggered the
++ * event. A read on the drm fd will always only return complete
++ * events, that is, if for example the read buffer is 100 bytes, and
++ * there are two 64 byte events pending, only one will be returned.
++ *
++ * Event types 0 - 0x7fffffff are generic drm events, 0x80000000 and
++ * up are chipset specific.
++ */
++struct drm_event {
++ __u32 type;
++ __u32 length;
++};
++
++#define DRM_EVENT_VBLANK 0x01
++#define DRM_EVENT_FLIP_COMPLETE 0x02
++#define DRM_EVENT_CRTC_SEQUENCE 0x03
++
++struct drm_event_vblank {
++ struct drm_event base;
++ __u64 user_data;
++ __u32 tv_sec;
++ __u32 tv_usec;
++ __u32 sequence;
++ __u32 crtc_id; /* 0 on older kernels that do not support this */
++};
++
++/* Event delivered at sequence. Time stamp marks when the first pixel
++ * of the refresh cycle leaves the display engine for the display
++ */
++struct drm_event_crtc_sequence {
++ struct drm_event base;
++ __u64 user_data;
++ __s64 time_ns;
++ __u64 sequence;
++};
++
++/* typedef area */
++typedef struct drm_clip_rect drm_clip_rect_t;
++typedef struct drm_drawable_info drm_drawable_info_t;
++typedef struct drm_tex_region drm_tex_region_t;
++typedef struct drm_hw_lock drm_hw_lock_t;
++typedef struct drm_version drm_version_t;
++typedef struct drm_unique drm_unique_t;
++typedef struct drm_list drm_list_t;
++typedef struct drm_block drm_block_t;
++typedef struct drm_control drm_control_t;
++typedef enum drm_map_type drm_map_type_t;
++typedef enum drm_map_flags drm_map_flags_t;
++typedef struct drm_ctx_priv_map drm_ctx_priv_map_t;
++typedef struct drm_map drm_map_t;
++typedef struct drm_client drm_client_t;
++typedef enum drm_stat_type drm_stat_type_t;
++typedef struct drm_stats drm_stats_t;
++typedef enum drm_lock_flags drm_lock_flags_t;
++typedef struct drm_lock drm_lock_t;
++typedef enum drm_dma_flags drm_dma_flags_t;
++typedef struct drm_buf_desc drm_buf_desc_t;
++typedef struct drm_buf_info drm_buf_info_t;
++typedef struct drm_buf_free drm_buf_free_t;
++typedef struct drm_buf_pub drm_buf_pub_t;
++typedef struct drm_buf_map drm_buf_map_t;
++typedef struct drm_dma drm_dma_t;
++typedef union drm_wait_vblank drm_wait_vblank_t;
++typedef struct drm_agp_mode drm_agp_mode_t;
++typedef enum drm_ctx_flags drm_ctx_flags_t;
++typedef struct drm_ctx drm_ctx_t;
++typedef struct drm_ctx_res drm_ctx_res_t;
++typedef struct drm_draw drm_draw_t;
++typedef struct drm_update_draw drm_update_draw_t;
++typedef struct drm_auth drm_auth_t;
++typedef struct drm_irq_busid drm_irq_busid_t;
++typedef enum drm_vblank_seq_type drm_vblank_seq_type_t;
++
++typedef struct drm_agp_buffer drm_agp_buffer_t;
++typedef struct drm_agp_binding drm_agp_binding_t;
++typedef struct drm_agp_info drm_agp_info_t;
++typedef struct drm_scatter_gather drm_scatter_gather_t;
++typedef struct drm_set_version drm_set_version_t;
++
++#if defined(__cplusplus)
++}
++#endif
++
++#endif
+diff --git a/third_party/drm/drm/drm_fourcc.h b/third_party/drm/drm/drm_fourcc.h
+new file mode 100644
+index 000000000000..4ececa84baa6
+--- /dev/null
++++ b/third_party/drm/drm/drm_fourcc.h
+@@ -0,0 +1,1377 @@
++/*
++ * Copyright 2011 Intel Corporation
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++#ifndef DRM_FOURCC_H
++#define DRM_FOURCC_H
++
++#include "drm.h"
++
++#if defined(__cplusplus)
++extern "C" {
++#endif
++
++/**
++ * DOC: overview
++ *
++ * In the DRM subsystem, framebuffer pixel formats are described using the
++ * fourcc codes defined in `include/uapi/drm/drm_fourcc.h`. In addition to the
++ * fourcc code, a Format Modifier may optionally be provided, in order to
++ * further describe the buffer's format - for example tiling or compression.
++ *
++ * Format Modifiers
++ * ----------------
++ *
++ * Format modifiers are used in conjunction with a fourcc code, forming a
++ * unique fourcc:modifier pair. This format:modifier pair must fully define the
++ * format and data layout of the buffer, and should be the only way to describe
++ * that particular buffer.
++ *
++ * Having multiple fourcc:modifier pairs which describe the same layout should
++ * be avoided, as such aliases run the risk of different drivers exposing
++ * different names for the same data format, forcing userspace to understand
++ * that they are aliases.
++ *
++ * Format modifiers may change any property of the buffer, including the number
++ * of planes and/or the required allocation size. Format modifiers are
++ * vendor-namespaced, and as such the relationship between a fourcc code and a
++ * modifier is specific to the modifer being used. For example, some modifiers
++ * may preserve meaning - such as number of planes - from the fourcc code,
++ * whereas others may not.
++ *
++ * Modifiers must uniquely encode buffer layout. In other words, a buffer must
++ * match only a single modifier. A modifier must not be a subset of layouts of
++ * another modifier. For instance, it's incorrect to encode pitch alignment in
++ * a modifier: a buffer may match a 64-pixel aligned modifier and a 32-pixel
++ * aligned modifier. That said, modifiers can have implicit minimal
++ * requirements.
++ *
++ * For modifiers where the combination of fourcc code and modifier can alias,
++ * a canonical pair needs to be defined and used by all drivers. Preferred
++ * combinations are also encouraged where all combinations might lead to
++ * confusion and unnecessarily reduced interoperability. An example for the
++ * latter is AFBC, where the ABGR layouts are preferred over ARGB layouts.
++ *
++ * There are two kinds of modifier users:
++ *
++ * - Kernel and user-space drivers: for drivers it's important that modifiers
++ * don't alias, otherwise two drivers might support the same format but use
++ * different aliases, preventing them from sharing buffers in an efficient
++ * format.
++ * - Higher-level programs interfacing with KMS/GBM/EGL/Vulkan/etc: these users
++ * see modifiers as opaque tokens they can check for equality and intersect.
++ * These users musn't need to know to reason about the modifier value
++ * (i.e. they are not expected to extract information out of the modifier).
++ *
++ * Vendors should document their modifier usage in as much detail as
++ * possible, to ensure maximum compatibility across devices, drivers and
++ * applications.
++ *
++ * The authoritative list of format modifier codes is found in
++ * `include/uapi/drm/drm_fourcc.h`
++ */
++
++#define fourcc_code(a, b, c, d) ((__u32)(a) | ((__u32)(b) << 8) | \
++ ((__u32)(c) << 16) | ((__u32)(d) << 24))
++
++#define DRM_FORMAT_BIG_ENDIAN (1U<<31) /* format is big endian instead of little endian */
++
++/* Reserve 0 for the invalid format specifier */
++#define DRM_FORMAT_INVALID 0
++
++/* color index */
++#define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ') /* [7:0] C */
++
++/* 8 bpp Red */
++#define DRM_FORMAT_R8 fourcc_code('R', '8', ' ', ' ') /* [7:0] R */
++
++/* 10 bpp Red */
++#define DRM_FORMAT_R10 fourcc_code('R', '1', '0', ' ') /* [15:0] x:R 6:10 little endian */
++
++/* 12 bpp Red */
++#define DRM_FORMAT_R12 fourcc_code('R', '1', '2', ' ') /* [15:0] x:R 4:12 little endian */
++
++/* 16 bpp Red */
++#define DRM_FORMAT_R16 fourcc_code('R', '1', '6', ' ') /* [15:0] R little endian */
++
++/* 16 bpp RG */
++#define DRM_FORMAT_RG88 fourcc_code('R', 'G', '8', '8') /* [15:0] R:G 8:8 little endian */
++#define DRM_FORMAT_GR88 fourcc_code('G', 'R', '8', '8') /* [15:0] G:R 8:8 little endian */
++
++/* 32 bpp RG */
++#define DRM_FORMAT_RG1616 fourcc_code('R', 'G', '3', '2') /* [31:0] R:G 16:16 little endian */
++#define DRM_FORMAT_GR1616 fourcc_code('G', 'R', '3', '2') /* [31:0] G:R 16:16 little endian */
++
++/* 8 bpp RGB */
++#define DRM_FORMAT_RGB332 fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */
++#define DRM_FORMAT_BGR233 fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */
++
++/* 16 bpp RGB */
++#define DRM_FORMAT_XRGB4444 fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */
++#define DRM_FORMAT_XBGR4444 fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */
++#define DRM_FORMAT_RGBX4444 fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */
++#define DRM_FORMAT_BGRX4444 fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */
++
++#define DRM_FORMAT_ARGB4444 fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */
++#define DRM_FORMAT_ABGR4444 fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */
++#define DRM_FORMAT_RGBA4444 fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */
++#define DRM_FORMAT_BGRA4444 fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */
++
++#define DRM_FORMAT_XRGB1555 fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */
++#define DRM_FORMAT_XBGR1555 fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */
++#define DRM_FORMAT_RGBX5551 fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */
++#define DRM_FORMAT_BGRX5551 fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */
++
++#define DRM_FORMAT_ARGB1555 fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */
++#define DRM_FORMAT_ABGR1555 fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */
++#define DRM_FORMAT_RGBA5551 fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */
++#define DRM_FORMAT_BGRA5551 fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */
++
++#define DRM_FORMAT_RGB565 fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */
++#define DRM_FORMAT_BGR565 fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */
++
++/* 24 bpp RGB */
++#define DRM_FORMAT_RGB888 fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */
++#define DRM_FORMAT_BGR888 fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */
++
++/* 32 bpp RGB */
++#define DRM_FORMAT_XRGB8888 fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */
++#define DRM_FORMAT_XBGR8888 fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */
++#define DRM_FORMAT_RGBX8888 fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */
++#define DRM_FORMAT_BGRX8888 fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */
++
++#define DRM_FORMAT_ARGB8888 fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */
++#define DRM_FORMAT_ABGR8888 fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */
++#define DRM_FORMAT_RGBA8888 fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */
++#define DRM_FORMAT_BGRA8888 fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */
++
++#define DRM_FORMAT_XRGB2101010 fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */
++#define DRM_FORMAT_XBGR2101010 fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */
++#define DRM_FORMAT_RGBX1010102 fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */
++#define DRM_FORMAT_BGRX1010102 fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */
++
++#define DRM_FORMAT_ARGB2101010 fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */
++#define DRM_FORMAT_ABGR2101010 fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */
++#define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */
++#define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */
++
++/* 64 bpp RGB */
++#define DRM_FORMAT_XRGB16161616 fourcc_code('X', 'R', '4', '8') /* [63:0] x:R:G:B 16:16:16:16 little endian */
++#define DRM_FORMAT_XBGR16161616 fourcc_code('X', 'B', '4', '8') /* [63:0] x:B:G:R 16:16:16:16 little endian */
++
++#define DRM_FORMAT_ARGB16161616 fourcc_code('A', 'R', '4', '8') /* [63:0] A:R:G:B 16:16:16:16 little endian */
++#define DRM_FORMAT_ABGR16161616 fourcc_code('A', 'B', '4', '8') /* [63:0] A:B:G:R 16:16:16:16 little endian */
++
++/*
++ * Floating point 64bpp RGB
++ * IEEE 754-2008 binary16 half-precision float
++ * [15:0] sign:exponent:mantissa 1:5:10
++ */
++#define DRM_FORMAT_XRGB16161616F fourcc_code('X', 'R', '4', 'H') /* [63:0] x:R:G:B 16:16:16:16 little endian */
++#define DRM_FORMAT_XBGR16161616F fourcc_code('X', 'B', '4', 'H') /* [63:0] x:B:G:R 16:16:16:16 little endian */
++
++#define DRM_FORMAT_ARGB16161616F fourcc_code('A', 'R', '4', 'H') /* [63:0] A:R:G:B 16:16:16:16 little endian */
++#define DRM_FORMAT_ABGR16161616F fourcc_code('A', 'B', '4', 'H') /* [63:0] A:B:G:R 16:16:16:16 little endian */
++
++/*
++ * RGBA format with 10-bit components packed in 64-bit per pixel, with 6 bits
++ * of unused padding per component:
++ */
++#define DRM_FORMAT_AXBXGXRX106106106106 fourcc_code('A', 'B', '1', '0') /* [63:0] A:x:B:x:G:x:R:x 10:6:10:6:10:6:10:6 little endian */
++
++/* packed YCbCr */
++#define DRM_FORMAT_YUYV fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */
++#define DRM_FORMAT_YVYU fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */
++#define DRM_FORMAT_UYVY fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */
++#define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
++
++#define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
++#define DRM_FORMAT_XYUV8888 fourcc_code('X', 'Y', 'U', 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */
++#define DRM_FORMAT_VUY888 fourcc_code('V', 'U', '2', '4') /* [23:0] Cr:Cb:Y 8:8:8 little endian */
++#define DRM_FORMAT_VUY101010 fourcc_code('V', 'U', '3', '0') /* Y followed by U then V, 10:10:10. Non-linear modifier only */
++
++/*
++ * packed Y2xx indicate for each component, xx valid data occupy msb
++ * 16-xx padding occupy lsb
++ */
++#define DRM_FORMAT_Y210 fourcc_code('Y', '2', '1', '0') /* [63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 10:6:10:6:10:6:10:6 little endian per 2 Y pixels */
++#define DRM_FORMAT_Y212 fourcc_code('Y', '2', '1', '2') /* [63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 12:4:12:4:12:4:12:4 little endian per 2 Y pixels */
++#define DRM_FORMAT_Y216 fourcc_code('Y', '2', '1', '6') /* [63:0] Cr0:Y1:Cb0:Y0 16:16:16:16 little endian per 2 Y pixels */
++
++/*
++ * packed Y4xx indicate for each component, xx valid data occupy msb
++ * 16-xx padding occupy lsb except Y410
++ */
++#define DRM_FORMAT_Y410 fourcc_code('Y', '4', '1', '0') /* [31:0] A:Cr:Y:Cb 2:10:10:10 little endian */
++#define DRM_FORMAT_Y412 fourcc_code('Y', '4', '1', '2') /* [63:0] A:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian */
++#define DRM_FORMAT_Y416 fourcc_code('Y', '4', '1', '6') /* [63:0] A:Cr:Y:Cb 16:16:16:16 little endian */
++
++#define DRM_FORMAT_XVYU2101010 fourcc_code('X', 'V', '3', '0') /* [31:0] X:Cr:Y:Cb 2:10:10:10 little endian */
++#define DRM_FORMAT_XVYU12_16161616 fourcc_code('X', 'V', '3', '6') /* [63:0] X:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian */
++#define DRM_FORMAT_XVYU16161616 fourcc_code('X', 'V', '4', '8') /* [63:0] X:Cr:Y:Cb 16:16:16:16 little endian */
++
++/*
++ * packed YCbCr420 2x2 tiled formats
++ * first 64 bits will contain Y,Cb,Cr components for a 2x2 tile
++ */
++/* [63:0] A3:A2:Y3:0:Cr0:0:Y2:0:A1:A0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian */
++#define DRM_FORMAT_Y0L0 fourcc_code('Y', '0', 'L', '0')
++/* [63:0] X3:X2:Y3:0:Cr0:0:Y2:0:X1:X0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian */
++#define DRM_FORMAT_X0L0 fourcc_code('X', '0', 'L', '0')
++
++/* [63:0] A3:A2:Y3:Cr0:Y2:A1:A0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian */
++#define DRM_FORMAT_Y0L2 fourcc_code('Y', '0', 'L', '2')
++/* [63:0] X3:X2:Y3:Cr0:Y2:X1:X0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian */
++#define DRM_FORMAT_X0L2 fourcc_code('X', '0', 'L', '2')
++
++/*
++ * 1-plane YUV 4:2:0
++ * In these formats, the component ordering is specified (Y, followed by U
++ * then V), but the exact Linear layout is undefined.
++ * These formats can only be used with a non-Linear modifier.
++ */
++#define DRM_FORMAT_YUV420_8BIT fourcc_code('Y', 'U', '0', '8')
++#define DRM_FORMAT_YUV420_10BIT fourcc_code('Y', 'U', '1', '0')
++
++/*
++ * 2 plane RGB + A
++ * index 0 = RGB plane, same format as the corresponding non _A8 format has
++ * index 1 = A plane, [7:0] A
++ */
++#define DRM_FORMAT_XRGB8888_A8 fourcc_code('X', 'R', 'A', '8')
++#define DRM_FORMAT_XBGR8888_A8 fourcc_code('X', 'B', 'A', '8')
++#define DRM_FORMAT_RGBX8888_A8 fourcc_code('R', 'X', 'A', '8')
++#define DRM_FORMAT_BGRX8888_A8 fourcc_code('B', 'X', 'A', '8')
++#define DRM_FORMAT_RGB888_A8 fourcc_code('R', '8', 'A', '8')
++#define DRM_FORMAT_BGR888_A8 fourcc_code('B', '8', 'A', '8')
++#define DRM_FORMAT_RGB565_A8 fourcc_code('R', '5', 'A', '8')
++#define DRM_FORMAT_BGR565_A8 fourcc_code('B', '5', 'A', '8')
++
++/*
++ * 2 plane YCbCr
++ * index 0 = Y plane, [7:0] Y
++ * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian
++ * or
++ * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian
++ */
++#define DRM_FORMAT_NV12 fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */
++#define DRM_FORMAT_NV21 fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */
++#define DRM_FORMAT_NV16 fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */
++#define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */
++#define DRM_FORMAT_NV24 fourcc_code('N', 'V', '2', '4') /* non-subsampled Cr:Cb plane */
++#define DRM_FORMAT_NV42 fourcc_code('N', 'V', '4', '2') /* non-subsampled Cb:Cr plane */
++/*
++ * 2 plane YCbCr
++ * index 0 = Y plane, [39:0] Y3:Y2:Y1:Y0 little endian
++ * index 1 = Cr:Cb plane, [39:0] Cr1:Cb1:Cr0:Cb0 little endian
++ */
++#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') /* 2x2 subsampled Cr:Cb plane */
++
++/*
++ * 2 plane YCbCr MSB aligned
++ * index 0 = Y plane, [15:0] Y:x [10:6] little endian
++ * index 1 = Cr:Cb plane, [31:0] Cr:x:Cb:x [10:6:10:6] little endian
++ */
++#define DRM_FORMAT_P210 fourcc_code('P', '2', '1', '0') /* 2x1 subsampled Cr:Cb plane, 10 bit per channel */
++
++/*
++ * 2 plane YCbCr MSB aligned
++ * index 0 = Y plane, [15:0] Y:x [10:6] little endian
++ * index 1 = Cr:Cb plane, [31:0] Cr:x:Cb:x [10:6:10:6] little endian
++ */
++#define DRM_FORMAT_P010 fourcc_code('P', '0', '1', '0') /* 2x2 subsampled Cr:Cb plane 10 bits per channel */
++
++/*
++ * 2 plane YCbCr MSB aligned
++ * index 0 = Y plane, [15:0] Y:x [12:4] little endian
++ * index 1 = Cr:Cb plane, [31:0] Cr:x:Cb:x [12:4:12:4] little endian
++ */
++#define DRM_FORMAT_P012 fourcc_code('P', '0', '1', '2') /* 2x2 subsampled Cr:Cb plane 12 bits per channel */
++
++/*
++ * 2 plane YCbCr MSB aligned
++ * index 0 = Y plane, [15:0] Y little endian
++ * index 1 = Cr:Cb plane, [31:0] Cr:Cb [16:16] little endian
++ */
++#define DRM_FORMAT_P016 fourcc_code('P', '0', '1', '6') /* 2x2 subsampled Cr:Cb plane 16 bits per channel */
++
++/* 3 plane non-subsampled (444) YCbCr
++ * 16 bits per component, but only 10 bits are used and 6 bits are padded
++ * index 0: Y plane, [15:0] Y:x [10:6] little endian
++ * index 1: Cb plane, [15:0] Cb:x [10:6] little endian
++ * index 2: Cr plane, [15:0] Cr:x [10:6] little endian
++ */
++#define DRM_FORMAT_Q410 fourcc_code('Q', '4', '1', '0')
++
++/* 3 plane non-subsampled (444) YCrCb
++ * 16 bits per component, but only 10 bits are used and 6 bits are padded
++ * index 0: Y plane, [15:0] Y:x [10:6] little endian
++ * index 1: Cr plane, [15:0] Cr:x [10:6] little endian
++ * index 2: Cb plane, [15:0] Cb:x [10:6] little endian
++ */
++#define DRM_FORMAT_Q401 fourcc_code('Q', '4', '0', '1')
++
++/*
++ * 3 plane YCbCr
++ * index 0: Y plane, [7:0] Y
++ * index 1: Cb plane, [7:0] Cb
++ * index 2: Cr plane, [7:0] Cr
++ * or
++ * index 1: Cr plane, [7:0] Cr
++ * index 2: Cb plane, [7:0] Cb
++ */
++#define DRM_FORMAT_YUV410 fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */
++#define DRM_FORMAT_YVU410 fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */
++#define DRM_FORMAT_YUV411 fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */
++#define DRM_FORMAT_YVU411 fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */
++#define DRM_FORMAT_YUV420 fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */
++#define DRM_FORMAT_YVU420 fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */
++#define DRM_FORMAT_YUV422 fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */
++#define DRM_FORMAT_YVU422 fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */
++#define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
++#define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
++
++
++/*
++ * Format Modifiers:
++ *
++ * Format modifiers describe, typically, a re-ordering or modification
++ * of the data in a plane of an FB. This can be used to express tiled/
++ * swizzled formats, or compression, or a combination of the two.
++ *
++ * The upper 8 bits of the format modifier are a vendor-id as assigned
++ * below. The lower 56 bits are assigned as vendor sees fit.
++ */
++
++/* Vendor Ids: */
++#define DRM_FORMAT_MOD_VENDOR_NONE 0
++#define DRM_FORMAT_MOD_VENDOR_INTEL 0x01
++#define DRM_FORMAT_MOD_VENDOR_AMD 0x02
++#define DRM_FORMAT_MOD_VENDOR_NVIDIA 0x03
++#define DRM_FORMAT_MOD_VENDOR_SAMSUNG 0x04
++#define DRM_FORMAT_MOD_VENDOR_QCOM 0x05
++#define DRM_FORMAT_MOD_VENDOR_VIVANTE 0x06
++#define DRM_FORMAT_MOD_VENDOR_BROADCOM 0x07
++#define DRM_FORMAT_MOD_VENDOR_ARM 0x08
++#define DRM_FORMAT_MOD_VENDOR_ALLWINNER 0x09
++#define DRM_FORMAT_MOD_VENDOR_AMLOGIC 0x0a
++
++/* add more to the end as needed */
++
++#define DRM_FORMAT_RESERVED ((1ULL << 56) - 1)
++
++#define fourcc_mod_get_vendor(modifier) \
++ (((modifier) >> 56) & 0xff)
++
++#define fourcc_mod_is_vendor(modifier, vendor) \
++ (fourcc_mod_get_vendor(modifier) == DRM_FORMAT_MOD_VENDOR_## vendor)
++
++#define fourcc_mod_code(vendor, val) \
++ ((((__u64)DRM_FORMAT_MOD_VENDOR_## vendor) << 56) | ((val) & 0x00ffffffffffffffULL))
++
++/*
++ * Format Modifier tokens:
++ *
++ * When adding a new token please document the layout with a code comment,
++ * similar to the fourcc codes above. drm_fourcc.h is considered the
++ * authoritative source for all of these.
++ *
++ * Generic modifier names:
++ *
++ * DRM_FORMAT_MOD_GENERIC_* definitions are used to provide vendor-neutral names
++ * for layouts which are common across multiple vendors. To preserve
++ * compatibility, in cases where a vendor-specific definition already exists and
++ * a generic name for it is desired, the common name is a purely symbolic alias
++ * and must use the same numerical value as the original definition.
++ *
++ * Note that generic names should only be used for modifiers which describe
++ * generic layouts (such as pixel re-ordering), which may have
++ * independently-developed support across multiple vendors.
++ *
++ * In future cases where a generic layout is identified before merging with a
++ * vendor-specific modifier, a new 'GENERIC' vendor or modifier using vendor
++ * 'NONE' could be considered. This should only be for obvious, exceptional
++ * cases to avoid polluting the 'GENERIC' namespace with modifiers which only
++ * apply to a single vendor.
++ *
++ * Generic names should not be used for cases where multiple hardware vendors
++ * have implementations of the same standardised compression scheme (such as
++ * AFBC). In those cases, all implementations should use the same format
++ * modifier(s), reflecting the vendor of the standard.
++ */
++
++#define DRM_FORMAT_MOD_GENERIC_16_16_TILE DRM_FORMAT_MOD_SAMSUNG_16_16_TILE
++
++/*
++ * Invalid Modifier
++ *
++ * This modifier can be used as a sentinel to terminate the format modifiers
++ * list, or to initialize a variable with an invalid modifier. It might also be
++ * used to report an error back to userspace for certain APIs.
++ */
++#define DRM_FORMAT_MOD_INVALID fourcc_mod_code(NONE, DRM_FORMAT_RESERVED)
++
++/*
++ * Linear Layout
++ *
++ * Just plain linear layout. Note that this is different from no specifying any
++ * modifier (e.g. not setting DRM_MODE_FB_MODIFIERS in the DRM_ADDFB2 ioctl),
++ * which tells the driver to also take driver-internal information into account
++ * and so might actually result in a tiled framebuffer.
++ */
++#define DRM_FORMAT_MOD_LINEAR fourcc_mod_code(NONE, 0)
++
++/*
++ * Deprecated: use DRM_FORMAT_MOD_LINEAR instead
++ *
++ * The "none" format modifier doesn't actually mean that the modifier is
++ * implicit, instead it means that the layout is linear. Whether modifiers are
++ * used is out-of-band information carried in an API-specific way (e.g. in a
++ * flag for drm_mode_fb_cmd2).
++ */
++#define DRM_FORMAT_MOD_NONE 0
++
++/* Intel framebuffer modifiers */
++
++/*
++ * Intel X-tiling layout
++ *
++ * This is a tiled layout using 4Kb tiles (except on gen2 where the tiles 2Kb)
++ * in row-major layout. Within the tile bytes are laid out row-major, with
++ * a platform-dependent stride. On top of that the memory can apply
++ * platform-depending swizzling of some higher address bits into bit6.
++ *
++ * Note that this layout is only accurate on intel gen 8+ or valleyview chipsets.
++ * On earlier platforms the is highly platforms specific and not useful for
++ * cross-driver sharing. It exists since on a given platform it does uniquely
++ * identify the layout in a simple way for i915-specific userspace, which
++ * facilitated conversion of userspace to modifiers. Additionally the exact
++ * format on some really old platforms is not known.
++ */
++#define I915_FORMAT_MOD_X_TILED fourcc_mod_code(INTEL, 1)
++
++/*
++ * Intel Y-tiling layout
++ *
++ * This is a tiled layout using 4Kb tiles (except on gen2 where the tiles 2Kb)
++ * in row-major layout. Within the tile bytes are laid out in OWORD (16 bytes)
++ * chunks column-major, with a platform-dependent height. On top of that the
++ * memory can apply platform-depending swizzling of some higher address bits
++ * into bit6.
++ *
++ * Note that this layout is only accurate on intel gen 8+ or valleyview chipsets.
++ * On earlier platforms the is highly platforms specific and not useful for
++ * cross-driver sharing. It exists since on a given platform it does uniquely
++ * identify the layout in a simple way for i915-specific userspace, which
++ * facilitated conversion of userspace to modifiers. Additionally the exact
++ * format on some really old platforms is not known.
++ */
++#define I915_FORMAT_MOD_Y_TILED fourcc_mod_code(INTEL, 2)
++
++/*
++ * Intel Yf-tiling layout
++ *
++ * This is a tiled layout using 4Kb tiles in row-major layout.
++ * Within the tile pixels are laid out in 16 256 byte units / sub-tiles which
++ * are arranged in four groups (two wide, two high) with column-major layout.
++ * Each group therefore consits out of four 256 byte units, which are also laid
++ * out as 2x2 column-major.
++ * 256 byte units are made out of four 64 byte blocks of pixels, producing
++ * either a square block or a 2:1 unit.
++ * 64 byte blocks of pixels contain four pixel rows of 16 bytes, where the width
++ * in pixel depends on the pixel depth.
++ */
++#define I915_FORMAT_MOD_Yf_TILED fourcc_mod_code(INTEL, 3)
++
++/*
++ * Intel color control surface (CCS) for render compression
++ *
++ * The framebuffer format must be one of the 8:8:8:8 RGB formats.
++ * The main surface will be plane index 0 and must be Y/Yf-tiled,
++ * the CCS will be plane index 1.
++ *
++ * Each CCS tile matches a 1024x512 pixel area of the main surface.
++ * To match certain aspects of the 3D hardware the CCS is
++ * considered to be made up of normal 128Bx32 Y tiles, Thus
++ * the CCS pitch must be specified in multiples of 128 bytes.
++ *
++ * In reality the CCS tile appears to be a 64Bx64 Y tile, composed
++ * of QWORD (8 bytes) chunks instead of OWORD (16 bytes) chunks.
++ * But that fact is not relevant unless the memory is accessed
++ * directly.
++ */
++#define I915_FORMAT_MOD_Y_TILED_CCS fourcc_mod_code(INTEL, 4)
++#define I915_FORMAT_MOD_Yf_TILED_CCS fourcc_mod_code(INTEL, 5)
++
++/*
++ * Intel color control surfaces (CCS) for Gen-12 render compression.
++ *
++ * The main surface is Y-tiled and at plane index 0, the CCS is linear and
++ * at index 1. A 64B CCS cache line corresponds to an area of 4x1 tiles in
++ * main surface. In other words, 4 bits in CCS map to a main surface cache
++ * line pair. The main surface pitch is required to be a multiple of four
++ * Y-tile widths.
++ */
++#define I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS fourcc_mod_code(INTEL, 6)
++
++/*
++ * Intel color control surfaces (CCS) for Gen-12 media compression
++ *
++ * The main surface is Y-tiled and at plane index 0, the CCS is linear and
++ * at index 1. A 64B CCS cache line corresponds to an area of 4x1 tiles in
++ * main surface. In other words, 4 bits in CCS map to a main surface cache
++ * line pair. The main surface pitch is required to be a multiple of four
++ * Y-tile widths. For semi-planar formats like NV12, CCS planes follow the
++ * Y and UV planes i.e., planes 0 and 1 are used for Y and UV surfaces,
++ * planes 2 and 3 for the respective CCS.
++ */
++#define I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS fourcc_mod_code(INTEL, 7)
++
++/*
++ * Intel Color Control Surface with Clear Color (CCS) for Gen-12 render
++ * compression.
++ *
++ * The main surface is Y-tiled and is at plane index 0 whereas CCS is linear
++ * and at index 1. The clear color is stored at index 2, and the pitch should
++ * be ignored. The clear color structure is 256 bits. The first 128 bits
++ * represents Raw Clear Color Red, Green, Blue and Alpha color each represented
++ * by 32 bits. The raw clear color is consumed by the 3d engine and generates
++ * the converted clear color of size 64 bits. The first 32 bits store the Lower
++ * Converted Clear Color value and the next 32 bits store the Higher Converted
++ * Clear Color value when applicable. The Converted Clear Color values are
++ * consumed by the DE. The last 64 bits are used to store Color Discard Enable
++ * and Depth Clear Value Valid which are ignored by the DE. A CCS cache line
++ * corresponds to an area of 4x1 tiles in the main surface. The main surface
++ * pitch is required to be a multiple of 4 tile widths.
++ */
++#define I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC fourcc_mod_code(INTEL, 8)
++
++/*
++ * Tiled, NV12MT, grouped in 64 (pixels) x 32 (lines) -sized macroblocks
++ *
++ * Macroblocks are laid in a Z-shape, and each pixel data is following the
++ * standard NV12 style.
++ * As for NV12, an image is the result of two frame buffers: one for Y,
++ * one for the interleaved Cb/Cr components (1/2 the height of the Y buffer).
++ * Alignment requirements are (for each buffer):
++ * - multiple of 128 pixels for the width
++ * - multiple of 32 pixels for the height
++ *
++ * For more information: see https://linuxtv.org/downloads/v4l-dvb-apis/re32.html
++ */
++#define DRM_FORMAT_MOD_SAMSUNG_64_32_TILE fourcc_mod_code(SAMSUNG, 1)
++
++/*
++ * Tiled, 16 (pixels) x 16 (lines) - sized macroblocks
++ *
++ * This is a simple tiled layout using tiles of 16x16 pixels in a row-major
++ * layout. For YCbCr formats Cb/Cr components are taken in such a way that
++ * they correspond to their 16x16 luma block.
++ */
++#define DRM_FORMAT_MOD_SAMSUNG_16_16_TILE fourcc_mod_code(SAMSUNG, 2)
++
++/*
++ * Qualcomm Compressed Format
++ *
++ * Refers to a compressed variant of the base format that is compressed.
++ * Implementation may be platform and base-format specific.
++ *
++ * Each macrotile consists of m x n (mostly 4 x 4) tiles.
++ * Pixel data pitch/stride is aligned with macrotile width.
++ * Pixel data height is aligned with macrotile height.
++ * Entire pixel data buffer is aligned with 4k(bytes).
++ */
++#define DRM_FORMAT_MOD_QCOM_COMPRESSED fourcc_mod_code(QCOM, 1)
++
++/* Vivante framebuffer modifiers */
++
++/*
++ * Vivante 4x4 tiling layout
++ *
++ * This is a simple tiled layout using tiles of 4x4 pixels in a row-major
++ * layout.
++ */
++#define DRM_FORMAT_MOD_VIVANTE_TILED fourcc_mod_code(VIVANTE, 1)
++
++/*
++ * Vivante 64x64 super-tiling layout
++ *
++ * This is a tiled layout using 64x64 pixel super-tiles, where each super-tile
++ * contains 8x4 groups of 2x4 tiles of 4x4 pixels (like above) each, all in row-
++ * major layout.
++ *
++ * For more information: see
++ * https://github.com/etnaviv/etna_viv/blob/master/doc/hardware.md#texture-til…
++ */
++#define DRM_FORMAT_MOD_VIVANTE_SUPER_TILED fourcc_mod_code(VIVANTE, 2)
++
++/*
++ * Vivante 4x4 tiling layout for dual-pipe
++ *
++ * Same as the 4x4 tiling layout, except every second 4x4 pixel tile starts at a
++ * different base address. Offsets from the base addresses are therefore halved
++ * compared to the non-split tiled layout.
++ */
++#define DRM_FORMAT_MOD_VIVANTE_SPLIT_TILED fourcc_mod_code(VIVANTE, 3)
++
++/*
++ * Vivante 64x64 super-tiling layout for dual-pipe
++ *
++ * Same as the 64x64 super-tiling layout, except every second 4x4 pixel tile
++ * starts at a different base address. Offsets from the base addresses are
++ * therefore halved compared to the non-split super-tiled layout.
++ */
++#define DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED fourcc_mod_code(VIVANTE, 4)
++
++/* NVIDIA frame buffer modifiers */
++
++/*
++ * Tegra Tiled Layout, used by Tegra 2, 3 and 4.
++ *
++ * Pixels are arranged in simple tiles of 16 x 16 bytes.
++ */
++#define DRM_FORMAT_MOD_NVIDIA_TEGRA_TILED fourcc_mod_code(NVIDIA, 1)
++
++/*
++ * Generalized Block Linear layout, used by desktop GPUs starting with NV50/G80,
++ * and Tegra GPUs starting with Tegra K1.
++ *
++ * Pixels are arranged in Groups of Bytes (GOBs). GOB size and layout varies
++ * based on the architecture generation. GOBs themselves are then arranged in
++ * 3D blocks, with the block dimensions (in terms of GOBs) always being a power
++ * of two, and hence expressible as their log2 equivalent (E.g., "2" represents
++ * a block depth or height of "4").
++ *
++ * Chapter 20 "Pixel Memory Formats" of the Tegra X1 TRM describes this format
++ * in full detail.
++ *
++ * Macro
++ * Bits Param Description
++ * ---- ----- -----------------------------------------------------------------
++ *
++ * 3:0 h log2(height) of each block, in GOBs. Placed here for
++ * compatibility with the existing
++ * DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK()-based modifiers.
++ *
++ * 4:4 - Must be 1, to indicate block-linear layout. Necessary for
++ * compatibility with the existing
++ * DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK()-based modifiers.
++ *
++ * 8:5 - Reserved (To support 3D-surfaces with variable log2(depth) block
++ * size). Must be zero.
++ *
++ * Note there is no log2(width) parameter. Some portions of the
++ * hardware support a block width of two gobs, but it is impractical
++ * to use due to lack of support elsewhere, and has no known
++ * benefits.
++ *
++ * 11:9 - Reserved (To support 2D-array textures with variable array stride
++ * in blocks, specified via log2(tile width in blocks)). Must be
++ * zero.
++ *
++ * 19:12 k Page Kind. This value directly maps to a field in the page
++ * tables of all GPUs >= NV50. It affects the exact layout of bits
++ * in memory and can be derived from the tuple
++ *
++ * (format, GPU model, compression type, samples per pixel)
++ *
++ * Where compression type is defined below. If GPU model were
++ * implied by the format modifier, format, or memory buffer, page
++ * kind would not need to be included in the modifier itself, but
++ * since the modifier should define the layout of the associated
++ * memory buffer independent from any device or other context, it
++ * must be included here.
++ *
++ * 21:20 g GOB Height and Page Kind Generation. The height of a GOB changed
++ * starting with Fermi GPUs. Additionally, the mapping between page
++ * kind and bit layout has changed at various points.
++ *
++ * 0 = Gob Height 8, Fermi - Volta, Tegra K1+ Page Kind mapping
++ * 1 = Gob Height 4, G80 - GT2XX Page Kind mapping
++ * 2 = Gob Height 8, Turing+ Page Kind mapping
++ * 3 = Reserved for future use.
++ *
++ * 22:22 s Sector layout. On Tegra GPUs prior to Xavier, there is a further
++ * bit remapping step that occurs at an even lower level than the
++ * page kind and block linear swizzles. This causes the layout of
++ * surfaces mapped in those SOC's GPUs to be incompatible with the
++ * equivalent mapping on other GPUs in the same system.
++ *
++ * 0 = Tegra K1 - Tegra Parker/TX2 Layout.
++ * 1 = Desktop GPU and Tegra Xavier+ Layout
++ *
++ * 25:23 c Lossless Framebuffer Compression type.
++ *
++ * 0 = none
++ * 1 = ROP/3D, layout 1, exact compression format implied by Page
++ * Kind field
++ * 2 = ROP/3D, layout 2, exact compression format implied by Page
++ * Kind field
++ * 3 = CDE horizontal
++ * 4 = CDE vertical
++ * 5 = Reserved for future use
++ * 6 = Reserved for future use
++ * 7 = Reserved for future use
++ *
++ * 55:25 - Reserved for future use. Must be zero.
++ */
++#define DRM_FORMAT_MOD_NVIDIA_BLOCK_LINEAR_2D(c, s, g, k, h) \
++ fourcc_mod_code(NVIDIA, (0x10 | \
++ ((h) & 0xf) | \
++ (((k) & 0xff) << 12) | \
++ (((g) & 0x3) << 20) | \
++ (((s) & 0x1) << 22) | \
++ (((c) & 0x7) << 23)))
++
++/* To grandfather in prior block linear format modifiers to the above layout,
++ * the page kind "0", which corresponds to "pitch/linear" and hence is unusable
++ * with block-linear layouts, is remapped within drivers to the value 0xfe,
++ * which corresponds to the "generic" kind used for simple single-sample
++ * uncompressed color formats on Fermi - Volta GPUs.
++ */
++static __inline__ __u64
++drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
++{
++ if (!(modifier & 0x10) || (modifier & (0xff << 12)))
++ return modifier;
++ else
++ return modifier | (0xfe << 12);
++}
++
++/*
++ * 16Bx2 Block Linear layout, used by Tegra K1 and later
++ *
++ * Pixels are arranged in 64x8 Groups Of Bytes (GOBs). GOBs are then stacked
++ * vertically by a power of 2 (1 to 32 GOBs) to form a block.
++ *
++ * Within a GOB, data is ordered as 16B x 2 lines sectors laid in Z-shape.
++ *
++ * Parameter 'v' is the log2 encoding of the number of GOBs stacked vertically.
++ * Valid values are:
++ *
++ * 0 == ONE_GOB
++ * 1 == TWO_GOBS
++ * 2 == FOUR_GOBS
++ * 3 == EIGHT_GOBS
++ * 4 == SIXTEEN_GOBS
++ * 5 == THIRTYTWO_GOBS
++ *
++ * Chapter 20 "Pixel Memory Formats" of the Tegra X1 TRM describes this format
++ * in full detail.
++ */
++#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(v) \
++ DRM_FORMAT_MOD_NVIDIA_BLOCK_LINEAR_2D(0, 0, 0, 0, (v))
++
++#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_ONE_GOB \
++ DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(0)
++#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_TWO_GOB \
++ DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(1)
++#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_FOUR_GOB \
++ DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(2)
++#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_EIGHT_GOB \
++ DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(3)
++#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_SIXTEEN_GOB \
++ DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(4)
++#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_THIRTYTWO_GOB \
++ DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(5)
++
++/*
++ * Some Broadcom modifiers take parameters, for example the number of
++ * vertical lines in the image. Reserve the lower 32 bits for modifier
++ * type, and the next 24 bits for parameters. Top 8 bits are the
++ * vendor code.
++ */
++#define __fourcc_mod_broadcom_param_shift 8
++#define __fourcc_mod_broadcom_param_bits 48
++#define fourcc_mod_broadcom_code(val, params) \
++ fourcc_mod_code(BROADCOM, ((((__u64)params) << __fourcc_mod_broadcom_param_shift) | val))
++#define fourcc_mod_broadcom_param(m) \
++ ((int)(((m) >> __fourcc_mod_broadcom_param_shift) & \
++ ((1ULL << __fourcc_mod_broadcom_param_bits) - 1)))
++#define fourcc_mod_broadcom_mod(m) \
++ ((m) & ~(((1ULL << __fourcc_mod_broadcom_param_bits) - 1) << \
++ __fourcc_mod_broadcom_param_shift))
++
++/*
++ * Broadcom VC4 "T" format
++ *
++ * This is the primary layout that the V3D GPU can texture from (it
++ * can't do linear). The T format has:
++ *
++ * - 64b utiles of pixels in a raster-order grid according to cpp. It's 4x4
++ * pixels at 32 bit depth.
++ *
++ * - 1k subtiles made of a 4x4 raster-order grid of 64b utiles (so usually
++ * 16x16 pixels).
++ *
++ * - 4k tiles made of a 2x2 grid of 1k subtiles (so usually 32x32 pixels). On
++ * even 4k tile rows, they're arranged as (BL, TL, TR, BR), and on odd rows
++ * they're (TR, BR, BL, TL), where bottom left is start of memory.
++ *
++ * - an image made of 4k tiles in rows either left-to-right (even rows of 4k
++ * tiles) or right-to-left (odd rows of 4k tiles).
++ */
++#define DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED fourcc_mod_code(BROADCOM, 1)
++
++/*
++ * Broadcom SAND format
++ *
++ * This is the native format that the H.264 codec block uses. For VC4
++ * HVS, it is only valid for H.264 (NV12/21) and RGBA modes.
++ *
++ * The image can be considered to be split into columns, and the
++ * columns are placed consecutively into memory. The width of those
++ * columns can be either 32, 64, 128, or 256 pixels, but in practice
++ * only 128 pixel columns are used.
++ *
++ * The pitch between the start of each column is set to optimally
++ * switch between SDRAM banks. This is passed as the number of lines
++ * of column width in the modifier (we can't use the stride value due
++ * to various core checks that look at it , so you should set the
++ * stride to width*cpp).
++ *
++ * Note that the column height for this format modifier is the same
++ * for all of the planes, assuming that each column contains both Y
++ * and UV. Some SAND-using hardware stores UV in a separate tiled
++ * image from Y to reduce the column height, which is not supported
++ * with these modifiers.
++ */
++
++#define DRM_FORMAT_MOD_BROADCOM_SAND32_COL_HEIGHT(v) \
++ fourcc_mod_broadcom_code(2, v)
++#define DRM_FORMAT_MOD_BROADCOM_SAND64_COL_HEIGHT(v) \
++ fourcc_mod_broadcom_code(3, v)
++#define DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(v) \
++ fourcc_mod_broadcom_code(4, v)
++#define DRM_FORMAT_MOD_BROADCOM_SAND256_COL_HEIGHT(v) \
++ fourcc_mod_broadcom_code(5, v)
++
++#define DRM_FORMAT_MOD_BROADCOM_SAND32 \
++ DRM_FORMAT_MOD_BROADCOM_SAND32_COL_HEIGHT(0)
++#define DRM_FORMAT_MOD_BROADCOM_SAND64 \
++ DRM_FORMAT_MOD_BROADCOM_SAND64_COL_HEIGHT(0)
++#define DRM_FORMAT_MOD_BROADCOM_SAND128 \
++ DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(0)
++#define DRM_FORMAT_MOD_BROADCOM_SAND256 \
++ DRM_FORMAT_MOD_BROADCOM_SAND256_COL_HEIGHT(0)
++
++/* Broadcom UIF format
++ *
++ * This is the common format for the current Broadcom multimedia
++ * blocks, including V3D 3.x and newer, newer video codecs, and
++ * displays.
++ *
++ * The image consists of utiles (64b blocks), UIF blocks (2x2 utiles),
++ * and macroblocks (4x4 UIF blocks). Those 4x4 UIF block groups are
++ * stored in columns, with padding between the columns to ensure that
++ * moving from one column to the next doesn't hit the same SDRAM page
++ * bank.
++ *
++ * To calculate the padding, it is assumed that each hardware block
++ * and the software driving it knows the platform's SDRAM page size,
++ * number of banks, and XOR address, and that it's identical between
++ * all blocks using the format. This tiling modifier will use XOR as
++ * necessary to reduce the padding. If a hardware block can't do XOR,
++ * the assumption is that a no-XOR tiling modifier will be created.
++ */
++#define DRM_FORMAT_MOD_BROADCOM_UIF fourcc_mod_code(BROADCOM, 6)
++
++/*
++ * Arm Framebuffer Compression (AFBC) modifiers
++ *
++ * AFBC is a proprietary lossless image compression protocol and format.
++ * It provides fine-grained random access and minimizes the amount of data
++ * transferred between IP blocks.
++ *
++ * AFBC has several features which may be supported and/or used, which are
++ * represented using bits in the modifier. Not all combinations are valid,
++ * and different devices or use-cases may support different combinations.
++ *
++ * Further information on the use of AFBC modifiers can be found in
++ * Documentation/gpu/afbc.rst
++ */
++
++/*
++ * The top 4 bits (out of the 56 bits alloted for specifying vendor specific
++ * modifiers) denote the category for modifiers. Currently we have three
++ * categories of modifiers ie AFBC, MISC and AFRC. We can have a maximum of
++ * sixteen different categories.
++ */
++#define DRM_FORMAT_MOD_ARM_CODE(__type, __val) \
++ fourcc_mod_code(ARM, ((__u64)(__type) << 52) | ((__val) & 0x000fffffffffffffULL))
++
++#define DRM_FORMAT_MOD_ARM_TYPE_AFBC 0x00
++#define DRM_FORMAT_MOD_ARM_TYPE_MISC 0x01
++
++#define DRM_FORMAT_MOD_ARM_AFBC(__afbc_mode) \
++ DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_AFBC, __afbc_mode)
++
++/*
++ * AFBC superblock size
++ *
++ * Indicates the superblock size(s) used for the AFBC buffer. The buffer
++ * size (in pixels) must be aligned to a multiple of the superblock size.
++ * Four lowest significant bits(LSBs) are reserved for block size.
++ *
++ * Where one superblock size is specified, it applies to all planes of the
++ * buffer (e.g. 16x16, 32x8). When multiple superblock sizes are specified,
++ * the first applies to the Luma plane and the second applies to the Chroma
++ * plane(s). e.g. (32x8_64x4 means 32x8 Luma, with 64x4 Chroma).
++ * Multiple superblock sizes are only valid for multi-plane YCbCr formats.
++ */
++#define AFBC_FORMAT_MOD_BLOCK_SIZE_MASK 0xf
++#define AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 (1ULL)
++#define AFBC_FORMAT_MOD_BLOCK_SIZE_32x8 (2ULL)
++#define AFBC_FORMAT_MOD_BLOCK_SIZE_64x4 (3ULL)
++#define AFBC_FORMAT_MOD_BLOCK_SIZE_32x8_64x4 (4ULL)
++
++/*
++ * AFBC lossless colorspace transform
++ *
++ * Indicates that the buffer makes use of the AFBC lossless colorspace
++ * transform.
++ */
++#define AFBC_FORMAT_MOD_YTR (1ULL << 4)
++
++/*
++ * AFBC block-split
++ *
++ * Indicates that the payload of each superblock is split. The second
++ * half of the payload is positioned at a predefined offset from the start
++ * of the superblock payload.
++ */
++#define AFBC_FORMAT_MOD_SPLIT (1ULL << 5)
++
++/*
++ * AFBC sparse layout
++ *
++ * This flag indicates that the payload of each superblock must be stored at a
++ * predefined position relative to the other superblocks in the same AFBC
++ * buffer. This order is the same order used by the header buffer. In this mode
++ * each superblock is given the same amount of space as an uncompressed
++ * superblock of the particular format would require, rounding up to the next
++ * multiple of 128 bytes in size.
++ */
++#define AFBC_FORMAT_MOD_SPARSE (1ULL << 6)
++
++/*
++ * AFBC copy-block restrict
++ *
++ * Buffers with this flag must obey the copy-block restriction. The restriction
++ * is such that there are no copy-blocks referring across the border of 8x8
++ * blocks. For the subsampled data the 8x8 limitation is also subsampled.
++ */
++#define AFBC_FORMAT_MOD_CBR (1ULL << 7)
++
++/*
++ * AFBC tiled layout
++ *
++ * The tiled layout groups superblocks in 8x8 or 4x4 tiles, where all
++ * superblocks inside a tile are stored together in memory. 8x8 tiles are used
++ * for pixel formats up to and including 32 bpp while 4x4 tiles are used for
++ * larger bpp formats. The order between the tiles is scan line.
++ * When the tiled layout is used, the buffer size (in pixels) must be aligned
++ * to the tile size.
++ */
++#define AFBC_FORMAT_MOD_TILED (1ULL << 8)
++
++/*
++ * AFBC solid color blocks
++ *
++ * Indicates that the buffer makes use of solid-color blocks, whereby bandwidth
++ * can be reduced if a whole superblock is a single color.
++ */
++#define AFBC_FORMAT_MOD_SC (1ULL << 9)
++
++/*
++ * AFBC double-buffer
++ *
++ * Indicates that the buffer is allocated in a layout safe for front-buffer
++ * rendering.
++ */
++#define AFBC_FORMAT_MOD_DB (1ULL << 10)
++
++/*
++ * AFBC buffer content hints
++ *
++ * Indicates that the buffer includes per-superblock content hints.
++ */
++#define AFBC_FORMAT_MOD_BCH (1ULL << 11)
++
++/* AFBC uncompressed storage mode
++ *
++ * Indicates that the buffer is using AFBC uncompressed storage mode.
++ * In this mode all superblock payloads in the buffer use the uncompressed
++ * storage mode, which is usually only used for data which cannot be compressed.
++ * The buffer layout is the same as for AFBC buffers without USM set, this only
++ * affects the storage mode of the individual superblocks. Note that even a
++ * buffer without USM set may use uncompressed storage mode for some or all
++ * superblocks, USM just guarantees it for all.
++ */
++#define AFBC_FORMAT_MOD_USM (1ULL << 12)
++
++/*
++ * Arm Fixed-Rate Compression (AFRC) modifiers
++ *
++ * AFRC is a proprietary fixed rate image compression protocol and format,
++ * designed to provide guaranteed bandwidth and memory footprint
++ * reductions in graphics and media use-cases.
++ *
++ * AFRC buffers consist of one or more planes, with the same components
++ * and meaning as an uncompressed buffer using the same pixel format.
++ *
++ * Within each plane, the pixel/luma/chroma values are grouped into
++ * "coding unit" blocks which are individually compressed to a
++ * fixed size (in bytes). All coding units within a given plane of a buffer
++ * store the same number of values, and have the same compressed size.
++ *
++ * The coding unit size is configurable, allowing different rates of compression.
++ *
++ * The start of each AFRC buffer plane must be aligned to an alignment granule which
++ * depends on the coding unit size.
++ *
++ * Coding Unit Size Plane Alignment
++ * ---------------- ---------------
++ * 16 bytes 1024 bytes
++ * 24 bytes 512 bytes
++ * 32 bytes 2048 bytes
++ *
++ * Coding units are grouped into paging tiles. AFRC buffer dimensions must be aligned
++ * to a multiple of the paging tile dimensions.
++ * The dimensions of each paging tile depend on whether the buffer is optimised for
++ * scanline (SCAN layout) or rotated (ROT layout) access.
++ *
++ * Layout Paging Tile Width Paging Tile Height
++ * ------ ----------------- ------------------
++ * SCAN 16 coding units 4 coding units
++ * ROT 8 coding units 8 coding units
++ *
++ * The dimensions of each coding unit depend on the number of components
++ * in the compressed plane and whether the buffer is optimised for
++ * scanline (SCAN layout) or rotated (ROT layout) access.
++ *
++ * Number of Components in Plane Layout Coding Unit Width Coding Unit Height
++ * ----------------------------- --------- ----------------- ------------------
++ * 1 SCAN 16 samples 4 samples
++ * Example: 16x4 luma samples in a 'Y' plane
++ * 16x4 chroma 'V' values, in the 'V' plane of a fully-planar YUV buffer
++ * ----------------------------- --------- ----------------- ------------------
++ * 1 ROT 8 samples 8 samples
++ * Example: 8x8 luma samples in a 'Y' plane
++ * 8x8 chroma 'V' values, in the 'V' plane of a fully-planar YUV buffer
++ * ----------------------------- --------- ----------------- ------------------
++ * 2 DONT CARE 8 samples 4 samples
++ * Example: 8x4 chroma pairs in the 'UV' plane of a semi-planar YUV buffer
++ * ----------------------------- --------- ----------------- ------------------
++ * 3 DONT CARE 4 samples 4 samples
++ * Example: 4x4 pixels in an RGB buffer without alpha
++ * ----------------------------- --------- ----------------- ------------------
++ * 4 DONT CARE 4 samples 4 samples
++ * Example: 4x4 pixels in an RGB buffer with alpha
++ */
++
++#define DRM_FORMAT_MOD_ARM_TYPE_AFRC 0x02
++
++#define DRM_FORMAT_MOD_ARM_AFRC(__afrc_mode) \
++ DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_AFRC, __afrc_mode)
++
++/*
++ * AFRC coding unit size modifier.
++ *
++ * Indicates the number of bytes used to store each compressed coding unit for
++ * one or more planes in an AFRC encoded buffer. The coding unit size for chrominance
++ * is the same for both Cb and Cr, which may be stored in separate planes.
++ *
++ * AFRC_FORMAT_MOD_CU_SIZE_P0 indicates the number of bytes used to store
++ * each compressed coding unit in the first plane of the buffer. For RGBA buffers
++ * this is the only plane, while for semi-planar and fully-planar YUV buffers,
++ * this corresponds to the luma plane.
++ *
++ * AFRC_FORMAT_MOD_CU_SIZE_P12 indicates the number of bytes used to store
++ * each compressed coding unit in the second and third planes in the buffer.
++ * For semi-planar and fully-planar YUV buffers, this corresponds to the chroma plane(s).
++ *
++ * For single-plane buffers, AFRC_FORMAT_MOD_CU_SIZE_P0 must be specified
++ * and AFRC_FORMAT_MOD_CU_SIZE_P12 must be zero.
++ * For semi-planar and fully-planar buffers, both AFRC_FORMAT_MOD_CU_SIZE_P0 and
++ * AFRC_FORMAT_MOD_CU_SIZE_P12 must be specified.
++ */
++#define AFRC_FORMAT_MOD_CU_SIZE_MASK 0xf
++#define AFRC_FORMAT_MOD_CU_SIZE_16 (1ULL)
++#define AFRC_FORMAT_MOD_CU_SIZE_24 (2ULL)
++#define AFRC_FORMAT_MOD_CU_SIZE_32 (3ULL)
++
++#define AFRC_FORMAT_MOD_CU_SIZE_P0(__afrc_cu_size) (__afrc_cu_size)
++#define AFRC_FORMAT_MOD_CU_SIZE_P12(__afrc_cu_size) ((__afrc_cu_size) << 4)
++
++/*
++ * AFRC scanline memory layout.
++ *
++ * Indicates if the buffer uses the scanline-optimised layout
++ * for an AFRC encoded buffer, otherwise, it uses the rotation-optimised layout.
++ * The memory layout is the same for all planes.
++ */
++#define AFRC_FORMAT_MOD_LAYOUT_SCAN (1ULL << 8)
++
++/*
++ * Arm 16x16 Block U-Interleaved modifier
++ *
++ * This is used by Arm Mali Utgard and Midgard GPUs. It divides the image
++ * into 16x16 pixel blocks. Blocks are stored linearly in order, but pixels
++ * in the block are reordered.
++ */
++#define DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED \
++ DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_MISC, 1ULL)
++
++/*
++ * Allwinner tiled modifier
++ *
++ * This tiling mode is implemented by the VPU found on all Allwinner platforms,
++ * codenamed sunxi. It is associated with a YUV format that uses either 2 or 3
++ * planes.
++ *
++ * With this tiling, the luminance samples are disposed in tiles representing
++ * 32x32 pixels and the chrominance samples in tiles representing 32x64 pixels.
++ * The pixel order in each tile is linear and the tiles are disposed linearly,
++ * both in row-major order.
++ */
++#define DRM_FORMAT_MOD_ALLWINNER_TILED fourcc_mod_code(ALLWINNER, 1)
++
++/*
++ * Amlogic Video Framebuffer Compression modifiers
++ *
++ * Amlogic uses a proprietary lossless image compression protocol and format
++ * for their hardware video codec accelerators, either video decoders or
++ * video input encoders.
++ *
++ * It considerably reduces memory bandwidth while writing and reading
++ * frames in memory.
++ *
++ * The underlying storage is considered to be 3 components, 8bit or 10-bit
++ * per component YCbCr 420, single plane :
++ * - DRM_FORMAT_YUV420_8BIT
++ * - DRM_FORMAT_YUV420_10BIT
++ *
++ * The first 8 bits of the mode defines the layout, then the following 8 bits
++ * defines the options changing the layout.
++ *
++ * Not all combinations are valid, and different SoCs may support different
++ * combinations of layout and options.
++ */
++#define __fourcc_mod_amlogic_layout_mask 0xff
++#define __fourcc_mod_amlogic_options_shift 8
++#define __fourcc_mod_amlogic_options_mask 0xff
++
++#define DRM_FORMAT_MOD_AMLOGIC_FBC(__layout, __options) \
++ fourcc_mod_code(AMLOGIC, \
++ ((__layout) & __fourcc_mod_amlogic_layout_mask) | \
++ (((__options) & __fourcc_mod_amlogic_options_mask) \
++ << __fourcc_mod_amlogic_options_shift))
++
++/* Amlogic FBC Layouts */
++
++/*
++ * Amlogic FBC Basic Layout
++ *
++ * The basic layout is composed of:
++ * - a body content organized in 64x32 superblocks with 4096 bytes per
++ * superblock in default mode.
++ * - a 32 bytes per 128x64 header block
++ *
++ * This layout is transferrable between Amlogic SoCs supporting this modifier.
++ */
++#define AMLOGIC_FBC_LAYOUT_BASIC (1ULL)
++
++/*
++ * Amlogic FBC Scatter Memory layout
++ *
++ * Indicates the header contains IOMMU references to the compressed
++ * frames content to optimize memory access and layout.
++ *
++ * In this mode, only the header memory address is needed, thus the
++ * content memory organization is tied to the current producer
++ * execution and cannot be saved/dumped neither transferrable between
++ * Amlogic SoCs supporting this modifier.
++ *
++ * Due to the nature of the layout, these buffers are not expected to
++ * be accessible by the user-space clients, but only accessible by the
++ * hardware producers and consumers.
++ *
++ * The user-space clients should expect a failure while trying to mmap
++ * the DMA-BUF handle returned by the producer.
++ */
++#define AMLOGIC_FBC_LAYOUT_SCATTER (2ULL)
++
++/* Amlogic FBC Layout Options Bit Mask */
++
++/*
++ * Amlogic FBC Memory Saving mode
++ *
++ * Indicates the storage is packed when pixel size is multiple of word
++ * boudaries, i.e. 8bit should be stored in this mode to save allocation
++ * memory.
++ *
++ * This mode reduces body layout to 3072 bytes per 64x32 superblock with
++ * the basic layout and 3200 bytes per 64x32 superblock combined with
++ * the scatter layout.
++ */
++#define AMLOGIC_FBC_OPTION_MEM_SAVING (1ULL << 0)
++
++/*
++ * AMD modifiers
++ *
++ * Memory layout:
++ *
++ * without DCC:
++ * - main surface
++ *
++ * with DCC & without DCC_RETILE:
++ * - main surface in plane 0
++ * - DCC surface in plane 1 (RB-aligned, pipe-aligned if DCC_PIPE_ALIGN is set)
++ *
++ * with DCC & DCC_RETILE:
++ * - main surface in plane 0
++ * - displayable DCC surface in plane 1 (not RB-aligned & not pipe-aligned)
++ * - pipe-aligned DCC surface in plane 2 (RB-aligned & pipe-aligned)
++ *
++ * For multi-plane formats the above surfaces get merged into one plane for
++ * each format plane, based on the required alignment only.
++ *
++ * Bits Parameter Notes
++ * ----- ------------------------ ---------------------------------------------
++ *
++ * 7:0 TILE_VERSION Values are AMD_FMT_MOD_TILE_VER_*
++ * 12:8 TILE Values are AMD_FMT_MOD_TILE_<version>_*
++ * 13 DCC
++ * 14 DCC_RETILE
++ * 15 DCC_PIPE_ALIGN
++ * 16 DCC_INDEPENDENT_64B
++ * 17 DCC_INDEPENDENT_128B
++ * 19:18 DCC_MAX_COMPRESSED_BLOCK Values are AMD_FMT_MOD_DCC_BLOCK_*
++ * 20 DCC_CONSTANT_ENCODE
++ * 23:21 PIPE_XOR_BITS Only for some chips
++ * 26:24 BANK_XOR_BITS Only for some chips
++ * 29:27 PACKERS Only for some chips
++ * 32:30 RB Only for some chips
++ * 35:33 PIPE Only for some chips
++ * 55:36 - Reserved for future use, must be zero
++ */
++#define AMD_FMT_MOD fourcc_mod_code(AMD, 0)
++
++#define IS_AMD_FMT_MOD(val) (((val) >> 56) == DRM_FORMAT_MOD_VENDOR_AMD)
++
++/* Reserve 0 for GFX8 and older */
++#define AMD_FMT_MOD_TILE_VER_GFX9 1
++#define AMD_FMT_MOD_TILE_VER_GFX10 2
++#define AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS 3
++
++/*
++ * 64K_S is the same for GFX9/GFX10/GFX10_RBPLUS and hence has GFX9 as canonical
++ * version.
++ */
++#define AMD_FMT_MOD_TILE_GFX9_64K_S 9
++
++/*
++ * 64K_D for non-32 bpp is the same for GFX9/GFX10/GFX10_RBPLUS and hence has
++ * GFX9 as canonical version.
++ */
++#define AMD_FMT_MOD_TILE_GFX9_64K_D 10
++#define AMD_FMT_MOD_TILE_GFX9_64K_S_X 25
++#define AMD_FMT_MOD_TILE_GFX9_64K_D_X 26
++#define AMD_FMT_MOD_TILE_GFX9_64K_R_X 27
++
++#define AMD_FMT_MOD_DCC_BLOCK_64B 0
++#define AMD_FMT_MOD_DCC_BLOCK_128B 1
++#define AMD_FMT_MOD_DCC_BLOCK_256B 2
++
++#define AMD_FMT_MOD_TILE_VERSION_SHIFT 0
++#define AMD_FMT_MOD_TILE_VERSION_MASK 0xFF
++#define AMD_FMT_MOD_TILE_SHIFT 8
++#define AMD_FMT_MOD_TILE_MASK 0x1F
++
++/* Whether DCC compression is enabled. */
++#define AMD_FMT_MOD_DCC_SHIFT 13
++#define AMD_FMT_MOD_DCC_MASK 0x1
++
++/*
++ * Whether to include two DCC surfaces, one which is rb & pipe aligned, and
++ * one which is not-aligned.
++ */
++#define AMD_FMT_MOD_DCC_RETILE_SHIFT 14
++#define AMD_FMT_MOD_DCC_RETILE_MASK 0x1
++
++/* Only set if DCC_RETILE = false */
++#define AMD_FMT_MOD_DCC_PIPE_ALIGN_SHIFT 15
++#define AMD_FMT_MOD_DCC_PIPE_ALIGN_MASK 0x1
++
++#define AMD_FMT_MOD_DCC_INDEPENDENT_64B_SHIFT 16
++#define AMD_FMT_MOD_DCC_INDEPENDENT_64B_MASK 0x1
++#define AMD_FMT_MOD_DCC_INDEPENDENT_128B_SHIFT 17
++#define AMD_FMT_MOD_DCC_INDEPENDENT_128B_MASK 0x1
++#define AMD_FMT_MOD_DCC_MAX_COMPRESSED_BLOCK_SHIFT 18
++#define AMD_FMT_MOD_DCC_MAX_COMPRESSED_BLOCK_MASK 0x3
++
++/*
++ * DCC supports embedding some clear colors directly in the DCC surface.
++ * However, on older GPUs the rendering HW ignores the embedded clear color
++ * and prefers the driver provided color. This necessitates doing a fastclear
++ * eliminate operation before a process transfers control.
++ *
++ * If this bit is set that means the fastclear eliminate is not needed for these
++ * embeddable colors.
++ */
++#define AMD_FMT_MOD_DCC_CONSTANT_ENCODE_SHIFT 20
++#define AMD_FMT_MOD_DCC_CONSTANT_ENCODE_MASK 0x1
++
++/*
++ * The below fields are for accounting for per GPU differences. These are only
++ * relevant for GFX9 and later and if the tile field is *_X/_T.
++ *
++ * PIPE_XOR_BITS = always needed
++ * BANK_XOR_BITS = only for TILE_VER_GFX9
++ * PACKERS = only for TILE_VER_GFX10_RBPLUS
++ * RB = only for TILE_VER_GFX9 & DCC
++ * PIPE = only for TILE_VER_GFX9 & DCC & (DCC_RETILE | DCC_PIPE_ALIGN)
++ */
++#define AMD_FMT_MOD_PIPE_XOR_BITS_SHIFT 21
++#define AMD_FMT_MOD_PIPE_XOR_BITS_MASK 0x7
++#define AMD_FMT_MOD_BANK_XOR_BITS_SHIFT 24
++#define AMD_FMT_MOD_BANK_XOR_BITS_MASK 0x7
++#define AMD_FMT_MOD_PACKERS_SHIFT 27
++#define AMD_FMT_MOD_PACKERS_MASK 0x7
++#define AMD_FMT_MOD_RB_SHIFT 30
++#define AMD_FMT_MOD_RB_MASK 0x7
++#define AMD_FMT_MOD_PIPE_SHIFT 33
++#define AMD_FMT_MOD_PIPE_MASK 0x7
++
++#define AMD_FMT_MOD_SET(field, value) \
++ ((uint64_t)(value) << AMD_FMT_MOD_##field##_SHIFT)
++#define AMD_FMT_MOD_GET(field, value) \
++ (((value) >> AMD_FMT_MOD_##field##_SHIFT) & AMD_FMT_MOD_##field##_MASK)
++#define AMD_FMT_MOD_CLEAR(field) \
++ (~((uint64_t)AMD_FMT_MOD_##field##_MASK << AMD_FMT_MOD_##field##_SHIFT))
++
++#if defined(__cplusplus)
++}
++#endif
++
++#endif /* DRM_FOURCC_H */
+diff --git a/third_party/drm/drm/drm_mode.h b/third_party/drm/drm/drm_mode.h
+new file mode 100644
+index 000000000000..e1e351682872
+--- /dev/null
++++ b/third_party/drm/drm/drm_mode.h
+@@ -0,0 +1,1217 @@
++/*
++ * Copyright (c) 2007 Dave Airlie <airlied(a)linux.ie>
++ * Copyright (c) 2007 Jakob Bornecrantz <wallbraker(a)gmail.com>
++ * Copyright (c) 2008 Red Hat Inc.
++ * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA
++ * Copyright (c) 2007-2008 Intel Corporation
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
++ * IN THE SOFTWARE.
++ */
++
++#ifndef _DRM_MODE_H
++#define _DRM_MODE_H
++
++#include "drm.h"
++
++#if defined(__cplusplus)
++extern "C" {
++#endif
++
++/**
++ * DOC: overview
++ *
++ * DRM exposes many UAPI and structure definition to have a consistent
++ * and standardized interface with user.
++ * Userspace can refer to these structure definitions and UAPI formats
++ * to communicate to driver
++ */
++
++#define DRM_CONNECTOR_NAME_LEN 32
++#define DRM_DISPLAY_MODE_LEN 32
++#define DRM_PROP_NAME_LEN 32
++
++#define DRM_MODE_TYPE_BUILTIN (1<<0) /* deprecated */
++#define DRM_MODE_TYPE_CLOCK_C ((1<<1) | DRM_MODE_TYPE_BUILTIN) /* deprecated */
++#define DRM_MODE_TYPE_CRTC_C ((1<<2) | DRM_MODE_TYPE_BUILTIN) /* deprecated */
++#define DRM_MODE_TYPE_PREFERRED (1<<3)
++#define DRM_MODE_TYPE_DEFAULT (1<<4) /* deprecated */
++#define DRM_MODE_TYPE_USERDEF (1<<5)
++#define DRM_MODE_TYPE_DRIVER (1<<6)
++
++#define DRM_MODE_TYPE_ALL (DRM_MODE_TYPE_PREFERRED | \
++ DRM_MODE_TYPE_USERDEF | \
++ DRM_MODE_TYPE_DRIVER)
++
++/* Video mode flags */
++/* bit compatible with the xrandr RR_ definitions (bits 0-13)
++ *
++ * ABI warning: Existing userspace really expects
++ * the mode flags to match the xrandr definitions. Any
++ * changes that don't match the xrandr definitions will
++ * likely need a new client cap or some other mechanism
++ * to avoid breaking existing userspace. This includes
++ * allocating new flags in the previously unused bits!
++ */
++#define DRM_MODE_FLAG_PHSYNC (1<<0)
++#define DRM_MODE_FLAG_NHSYNC (1<<1)
++#define DRM_MODE_FLAG_PVSYNC (1<<2)
++#define DRM_MODE_FLAG_NVSYNC (1<<3)
++#define DRM_MODE_FLAG_INTERLACE (1<<4)
++#define DRM_MODE_FLAG_DBLSCAN (1<<5)
++#define DRM_MODE_FLAG_CSYNC (1<<6)
++#define DRM_MODE_FLAG_PCSYNC (1<<7)
++#define DRM_MODE_FLAG_NCSYNC (1<<8)
++#define DRM_MODE_FLAG_HSKEW (1<<9) /* hskew provided */
++#define DRM_MODE_FLAG_BCAST (1<<10) /* deprecated */
++#define DRM_MODE_FLAG_PIXMUX (1<<11) /* deprecated */
++#define DRM_MODE_FLAG_DBLCLK (1<<12)
++#define DRM_MODE_FLAG_CLKDIV2 (1<<13)
++ /*
++ * When adding a new stereo mode don't forget to adjust DRM_MODE_FLAGS_3D_MAX
++ * (define not exposed to user space).
++ */
++#define DRM_MODE_FLAG_3D_MASK (0x1f<<14)
++#define DRM_MODE_FLAG_3D_NONE (0<<14)
++#define DRM_MODE_FLAG_3D_FRAME_PACKING (1<<14)
++#define DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE (2<<14)
++#define DRM_MODE_FLAG_3D_LINE_ALTERNATIVE (3<<14)
++#define DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL (4<<14)
++#define DRM_MODE_FLAG_3D_L_DEPTH (5<<14)
++#define DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH (6<<14)
++#define DRM_MODE_FLAG_3D_TOP_AND_BOTTOM (7<<14)
++#define DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF (8<<14)
++
++/* Picture aspect ratio options */
++#define DRM_MODE_PICTURE_ASPECT_NONE 0
++#define DRM_MODE_PICTURE_ASPECT_4_3 1
++#define DRM_MODE_PICTURE_ASPECT_16_9 2
++#define DRM_MODE_PICTURE_ASPECT_64_27 3
++#define DRM_MODE_PICTURE_ASPECT_256_135 4
++
++/* Content type options */
++#define DRM_MODE_CONTENT_TYPE_NO_DATA 0
++#define DRM_MODE_CONTENT_TYPE_GRAPHICS 1
++#define DRM_MODE_CONTENT_TYPE_PHOTO 2
++#define DRM_MODE_CONTENT_TYPE_CINEMA 3
++#define DRM_MODE_CONTENT_TYPE_GAME 4
++
++/* Aspect ratio flag bitmask (4 bits 22:19) */
++#define DRM_MODE_FLAG_PIC_AR_MASK (0x0F<<19)
++#define DRM_MODE_FLAG_PIC_AR_NONE \
++ (DRM_MODE_PICTURE_ASPECT_NONE<<19)
++#define DRM_MODE_FLAG_PIC_AR_4_3 \
++ (DRM_MODE_PICTURE_ASPECT_4_3<<19)
++#define DRM_MODE_FLAG_PIC_AR_16_9 \
++ (DRM_MODE_PICTURE_ASPECT_16_9<<19)
++#define DRM_MODE_FLAG_PIC_AR_64_27 \
++ (DRM_MODE_PICTURE_ASPECT_64_27<<19)
++#define DRM_MODE_FLAG_PIC_AR_256_135 \
++ (DRM_MODE_PICTURE_ASPECT_256_135<<19)
++
++#define DRM_MODE_FLAG_ALL (DRM_MODE_FLAG_PHSYNC | \
++ DRM_MODE_FLAG_NHSYNC | \
++ DRM_MODE_FLAG_PVSYNC | \
++ DRM_MODE_FLAG_NVSYNC | \
++ DRM_MODE_FLAG_INTERLACE | \
++ DRM_MODE_FLAG_DBLSCAN | \
++ DRM_MODE_FLAG_CSYNC | \
++ DRM_MODE_FLAG_PCSYNC | \
++ DRM_MODE_FLAG_NCSYNC | \
++ DRM_MODE_FLAG_HSKEW | \
++ DRM_MODE_FLAG_DBLCLK | \
++ DRM_MODE_FLAG_CLKDIV2 | \
++ DRM_MODE_FLAG_3D_MASK)
++
++/* DPMS flags */
++/* bit compatible with the xorg definitions. */
++#define DRM_MODE_DPMS_ON 0
++#define DRM_MODE_DPMS_STANDBY 1
++#define DRM_MODE_DPMS_SUSPEND 2
++#define DRM_MODE_DPMS_OFF 3
++
++/* Scaling mode options */
++#define DRM_MODE_SCALE_NONE 0 /* Unmodified timing (display or
++ software can still scale) */
++#define DRM_MODE_SCALE_FULLSCREEN 1 /* Full screen, ignore aspect */
++#define DRM_MODE_SCALE_CENTER 2 /* Centered, no scaling */
++#define DRM_MODE_SCALE_ASPECT 3 /* Full screen, preserve aspect */
++
++/* Dithering mode options */
++#define DRM_MODE_DITHERING_OFF 0
++#define DRM_MODE_DITHERING_ON 1
++#define DRM_MODE_DITHERING_AUTO 2
++
++/* Dirty info options */
++#define DRM_MODE_DIRTY_OFF 0
++#define DRM_MODE_DIRTY_ON 1
++#define DRM_MODE_DIRTY_ANNOTATE 2
++
++/* Link Status options */
++#define DRM_MODE_LINK_STATUS_GOOD 0
++#define DRM_MODE_LINK_STATUS_BAD 1
++
++/*
++ * DRM_MODE_ROTATE_<degrees>
++ *
++ * Signals that a drm plane is been rotated <degrees> degrees in counter
++ * clockwise direction.
++ *
++ * This define is provided as a convenience, looking up the property id
++ * using the name->prop id lookup is the preferred method.
++ */
++#define DRM_MODE_ROTATE_0 (1<<0)
++#define DRM_MODE_ROTATE_90 (1<<1)
++#define DRM_MODE_ROTATE_180 (1<<2)
++#define DRM_MODE_ROTATE_270 (1<<3)
++
++/*
++ * DRM_MODE_ROTATE_MASK
++ *
++ * Bitmask used to look for drm plane rotations.
++ */
++#define DRM_MODE_ROTATE_MASK (\
++ DRM_MODE_ROTATE_0 | \
++ DRM_MODE_ROTATE_90 | \
++ DRM_MODE_ROTATE_180 | \
++ DRM_MODE_ROTATE_270)
++
++/*
++ * DRM_MODE_REFLECT_<axis>
++ *
++ * Signals that the contents of a drm plane is reflected along the <axis> axis,
++ * in the same way as mirroring.
++ * See kerneldoc chapter "Plane Composition Properties" for more details.
++ *
++ * This define is provided as a convenience, looking up the property id
++ * using the name->prop id lookup is the preferred method.
++ */
++#define DRM_MODE_REFLECT_X (1<<4)
++#define DRM_MODE_REFLECT_Y (1<<5)
++
++/*
++ * DRM_MODE_REFLECT_MASK
++ *
++ * Bitmask used to look for drm plane reflections.
++ */
++#define DRM_MODE_REFLECT_MASK (\
++ DRM_MODE_REFLECT_X | \
++ DRM_MODE_REFLECT_Y)
++
++/* Content Protection Flags */
++#define DRM_MODE_CONTENT_PROTECTION_UNDESIRED 0
++#define DRM_MODE_CONTENT_PROTECTION_DESIRED 1
++#define DRM_MODE_CONTENT_PROTECTION_ENABLED 2
++
++/**
++ * struct drm_mode_modeinfo - Display mode information.
++ * @clock: pixel clock in kHz
++ * @hdisplay: horizontal display size
++ * @hsync_start: horizontal sync start
++ * @hsync_end: horizontal sync end
++ * @htotal: horizontal total size
++ * @hskew: horizontal skew
++ * @vdisplay: vertical display size
++ * @vsync_start: vertical sync start
++ * @vsync_end: vertical sync end
++ * @vtotal: vertical total size
++ * @vscan: vertical scan
++ * @vrefresh: approximate vertical refresh rate in Hz
++ * @flags: bitmask of misc. flags, see DRM_MODE_FLAG_* defines
++ * @type: bitmask of type flags, see DRM_MODE_TYPE_* defines
++ * @name: string describing the mode resolution
++ *
++ * This is the user-space API display mode information structure. For the
++ * kernel version see struct drm_display_mode.
++ */
++struct drm_mode_modeinfo {
++ __u32 clock;
++ __u16 hdisplay;
++ __u16 hsync_start;
++ __u16 hsync_end;
++ __u16 htotal;
++ __u16 hskew;
++ __u16 vdisplay;
++ __u16 vsync_start;
++ __u16 vsync_end;
++ __u16 vtotal;
++ __u16 vscan;
++
++ __u32 vrefresh;
++
++ __u32 flags;
++ __u32 type;
++ char name[DRM_DISPLAY_MODE_LEN];
++};
++
++struct drm_mode_card_res {
++ __u64 fb_id_ptr;
++ __u64 crtc_id_ptr;
++ __u64 connector_id_ptr;
++ __u64 encoder_id_ptr;
++ __u32 count_fbs;
++ __u32 count_crtcs;
++ __u32 count_connectors;
++ __u32 count_encoders;
++ __u32 min_width;
++ __u32 max_width;
++ __u32 min_height;
++ __u32 max_height;
++};
++
++struct drm_mode_crtc {
++ __u64 set_connectors_ptr;
++ __u32 count_connectors;
++
++ __u32 crtc_id; /**< Id */
++ __u32 fb_id; /**< Id of framebuffer */
++
++ __u32 x; /**< x Position on the framebuffer */
++ __u32 y; /**< y Position on the framebuffer */
++
++ __u32 gamma_size;
++ __u32 mode_valid;
++ struct drm_mode_modeinfo mode;
++};
++
++#define DRM_MODE_PRESENT_TOP_FIELD (1<<0)
++#define DRM_MODE_PRESENT_BOTTOM_FIELD (1<<1)
++
++/* Planes blend with or override other bits on the CRTC */
++struct drm_mode_set_plane {
++ __u32 plane_id;
++ __u32 crtc_id;
++ __u32 fb_id; /* fb object contains surface format type */
++ __u32 flags; /* see above flags */
++
++ /* Signed dest location allows it to be partially off screen */
++ __s32 crtc_x;
++ __s32 crtc_y;
++ __u32 crtc_w;
++ __u32 crtc_h;
++
++ /* Source values are 16.16 fixed point */
++ __u32 src_x;
++ __u32 src_y;
++ __u32 src_h;
++ __u32 src_w;
++};
++
++/**
++ * struct drm_mode_get_plane - Get plane metadata.
++ *
++ * Userspace can perform a GETPLANE ioctl to retrieve information about a
++ * plane.
++ *
++ * To retrieve the number of formats supported, set @count_format_types to zero
++ * and call the ioctl. @count_format_types will be updated with the value.
++ *
++ * To retrieve these formats, allocate an array with the memory needed to store
++ * @count_format_types formats. Point @format_type_ptr to this array and call
++ * the ioctl again (with @count_format_types still set to the value returned in
++ * the first ioctl call).
++ */
++struct drm_mode_get_plane {
++ /**
++ * @plane_id: Object ID of the plane whose information should be
++ * retrieved. Set by caller.
++ */
++ __u32 plane_id;
++
++ /** @crtc_id: Object ID of the current CRTC. */
++ __u32 crtc_id;
++ /** @fb_id: Object ID of the current fb. */
++ __u32 fb_id;
++
++ /**
++ * @possible_crtcs: Bitmask of CRTC's compatible with the plane. CRTC's
++ * are created and they receive an index, which corresponds to their
++ * position in the bitmask. Bit N corresponds to
++ * :ref:`CRTC index<crtc_index>` N.
++ */
++ __u32 possible_crtcs;
++ /** @gamma_size: Never used. */
++ __u32 gamma_size;
++
++ /** @count_format_types: Number of formats. */
++ __u32 count_format_types;
++ /**
++ * @format_type_ptr: Pointer to ``__u32`` array of formats that are
++ * supported by the plane. These formats do not require modifiers.
++ */
++ __u64 format_type_ptr;
++};
++
++struct drm_mode_get_plane_res {
++ __u64 plane_id_ptr;
++ __u32 count_planes;
++};
++
++#define DRM_MODE_ENCODER_NONE 0
++#define DRM_MODE_ENCODER_DAC 1
++#define DRM_MODE_ENCODER_TMDS 2
++#define DRM_MODE_ENCODER_LVDS 3
++#define DRM_MODE_ENCODER_TVDAC 4
++#define DRM_MODE_ENCODER_VIRTUAL 5
++#define DRM_MODE_ENCODER_DSI 6
++#define DRM_MODE_ENCODER_DPMST 7
++#define DRM_MODE_ENCODER_DPI 8
++
++struct drm_mode_get_encoder {
++ __u32 encoder_id;
++ __u32 encoder_type;
++
++ __u32 crtc_id; /**< Id of crtc */
++
++ __u32 possible_crtcs;
++ __u32 possible_clones;
++};
++
++/* This is for connectors with multiple signal types. */
++/* Try to match DRM_MODE_CONNECTOR_X as closely as possible. */
++enum drm_mode_subconnector {
++ DRM_MODE_SUBCONNECTOR_Automatic = 0, /* DVI-I, TV */
++ DRM_MODE_SUBCONNECTOR_Unknown = 0, /* DVI-I, TV, DP */
++ DRM_MODE_SUBCONNECTOR_VGA = 1, /* DP */
++ DRM_MODE_SUBCONNECTOR_DVID = 3, /* DVI-I DP */
++ DRM_MODE_SUBCONNECTOR_DVIA = 4, /* DVI-I */
++ DRM_MODE_SUBCONNECTOR_Composite = 5, /* TV */
++ DRM_MODE_SUBCONNECTOR_SVIDEO = 6, /* TV */
++ DRM_MODE_SUBCONNECTOR_Component = 8, /* TV */
++ DRM_MODE_SUBCONNECTOR_SCART = 9, /* TV */
++ DRM_MODE_SUBCONNECTOR_DisplayPort = 10, /* DP */
++ DRM_MODE_SUBCONNECTOR_HDMIA = 11, /* DP */
++ DRM_MODE_SUBCONNECTOR_Native = 15, /* DP */
++ DRM_MODE_SUBCONNECTOR_Wireless = 18, /* DP */
++};
++
++#define DRM_MODE_CONNECTOR_Unknown 0
++#define DRM_MODE_CONNECTOR_VGA 1
++#define DRM_MODE_CONNECTOR_DVII 2
++#define DRM_MODE_CONNECTOR_DVID 3
++#define DRM_MODE_CONNECTOR_DVIA 4
++#define DRM_MODE_CONNECTOR_Composite 5
++#define DRM_MODE_CONNECTOR_SVIDEO 6
++#define DRM_MODE_CONNECTOR_LVDS 7
++#define DRM_MODE_CONNECTOR_Component 8
++#define DRM_MODE_CONNECTOR_9PinDIN 9
++#define DRM_MODE_CONNECTOR_DisplayPort 10
++#define DRM_MODE_CONNECTOR_HDMIA 11
++#define DRM_MODE_CONNECTOR_HDMIB 12
++#define DRM_MODE_CONNECTOR_TV 13
++#define DRM_MODE_CONNECTOR_eDP 14
++#define DRM_MODE_CONNECTOR_VIRTUAL 15
++#define DRM_MODE_CONNECTOR_DSI 16
++#define DRM_MODE_CONNECTOR_DPI 17
++#define DRM_MODE_CONNECTOR_WRITEBACK 18
++#define DRM_MODE_CONNECTOR_SPI 19
++#define DRM_MODE_CONNECTOR_USB 20
++
++/**
++ * struct drm_mode_get_connector - Get connector metadata.
++ *
++ * User-space can perform a GETCONNECTOR ioctl to retrieve information about a
++ * connector. User-space is expected to retrieve encoders, modes and properties
++ * by performing this ioctl at least twice: the first time to retrieve the
++ * number of elements, the second time to retrieve the elements themselves.
++ *
++ * To retrieve the number of elements, set @count_props and @count_encoders to
++ * zero, set @count_modes to 1, and set @modes_ptr to a temporary struct
++ * drm_mode_modeinfo element.
++ *
++ * To retrieve the elements, allocate arrays for @encoders_ptr, @modes_ptr,
++ * @props_ptr and @prop_values_ptr, then set @count_modes, @count_props and
++ * @count_encoders to their capacity.
++ *
++ * Performing the ioctl only twice may be racy: the number of elements may have
++ * changed with a hotplug event in-between the two ioctls. User-space is
++ * expected to retry the last ioctl until the number of elements stabilizes.
++ * The kernel won't fill any array which doesn't have the expected length.
++ *
++ * **Force-probing a connector**
++ *
++ * If the @count_modes field is set to zero and the DRM client is the current
++ * DRM master, the kernel will perform a forced probe on the connector to
++ * refresh the connector status, modes and EDID. A forced-probe can be slow,
++ * might cause flickering and the ioctl will block.
++ *
++ * User-space needs to force-probe connectors to ensure their metadata is
++ * up-to-date at startup and after receiving a hot-plug event. User-space
++ * may perform a forced-probe when the user explicitly requests it. User-space
++ * shouldn't perform a forced-probe in other situations.
++ */
++struct drm_mode_get_connector {
++ /** @encoders_ptr: Pointer to ``__u32`` array of object IDs. */
++ __u64 encoders_ptr;
++ /** @modes_ptr: Pointer to struct drm_mode_modeinfo array. */
++ __u64 modes_ptr;
++ /** @props_ptr: Pointer to ``__u32`` array of property IDs. */
++ __u64 props_ptr;
++ /** @prop_values_ptr: Pointer to ``__u64`` array of property values. */
++ __u64 prop_values_ptr;
++
++ /** @count_modes: Number of modes. */
++ __u32 count_modes;
++ /** @count_props: Number of properties. */
++ __u32 count_props;
++ /** @count_encoders: Number of encoders. */
++ __u32 count_encoders;
++
++ /** @encoder_id: Object ID of the current encoder. */
++ __u32 encoder_id;
++ /** @connector_id: Object ID of the connector. */
++ __u32 connector_id;
++ /**
++ * @connector_type: Type of the connector.
++ *
++ * See DRM_MODE_CONNECTOR_* defines.
++ */
++ __u32 connector_type;
++ /**
++ * @connector_type_id: Type-specific connector number.
++ *
++ * This is not an object ID. This is a per-type connector number. Each
++ * (type, type_id) combination is unique across all connectors of a DRM
++ * device.
++ */
++ __u32 connector_type_id;
++
++ /**
++ * @connection: Status of the connector.
++ *
++ * See enum drm_connector_status.
++ */
++ __u32 connection;
++ /** @mm_width: Width of the connected sink in millimeters. */
++ __u32 mm_width;
++ /** @mm_height: Height of the connected sink in millimeters. */
++ __u32 mm_height;
++ /**
++ * @subpixel: Subpixel order of the connected sink.
++ *
++ * See enum subpixel_order.
++ */
++ __u32 subpixel;
++
++ /** @pad: Padding, must be zero. */
++ __u32 pad;
++};
++
++#define DRM_MODE_PROP_PENDING (1<<0) /* deprecated, do not use */
++#define DRM_MODE_PROP_RANGE (1<<1)
++#define DRM_MODE_PROP_IMMUTABLE (1<<2)
++#define DRM_MODE_PROP_ENUM (1<<3) /* enumerated type with text strings */
++#define DRM_MODE_PROP_BLOB (1<<4)
++#define DRM_MODE_PROP_BITMASK (1<<5) /* bitmask of enumerated types */
++
++/* non-extended types: legacy bitmask, one bit per type: */
++#define DRM_MODE_PROP_LEGACY_TYPE ( \
++ DRM_MODE_PROP_RANGE | \
++ DRM_MODE_PROP_ENUM | \
++ DRM_MODE_PROP_BLOB | \
++ DRM_MODE_PROP_BITMASK)
++
++/* extended-types: rather than continue to consume a bit per type,
++ * grab a chunk of the bits to use as integer type id.
++ */
++#define DRM_MODE_PROP_EXTENDED_TYPE 0x0000ffc0
++#define DRM_MODE_PROP_TYPE(n) ((n) << 6)
++#define DRM_MODE_PROP_OBJECT DRM_MODE_PROP_TYPE(1)
++#define DRM_MODE_PROP_SIGNED_RANGE DRM_MODE_PROP_TYPE(2)
++
++/* the PROP_ATOMIC flag is used to hide properties from userspace that
++ * is not aware of atomic properties. This is mostly to work around
++ * older userspace (DDX drivers) that read/write each prop they find,
++ * witout being aware that this could be triggering a lengthy modeset.
++ */
++#define DRM_MODE_PROP_ATOMIC 0x80000000
++
++/**
++ * struct drm_mode_property_enum - Description for an enum/bitfield entry.
++ * @value: numeric value for this enum entry.
++ * @name: symbolic name for this enum entry.
++ *
++ * See struct drm_property_enum for details.
++ */
++struct drm_mode_property_enum {
++ __u64 value;
++ char name[DRM_PROP_NAME_LEN];
++};
++
++/**
++ * struct drm_mode_get_property - Get property metadata.
++ *
++ * User-space can perform a GETPROPERTY ioctl to retrieve information about a
++ * property. The same property may be attached to multiple objects, see
++ * "Modeset Base Object Abstraction".
++ *
++ * The meaning of the @values_ptr field changes depending on the property type.
++ * See &drm_property.flags for more details.
++ *
++ * The @enum_blob_ptr and @count_enum_blobs fields are only meaningful when the
++ * property has the type &DRM_MODE_PROP_ENUM or &DRM_MODE_PROP_BITMASK. For
++ * backwards compatibility, the kernel will always set @count_enum_blobs to
++ * zero when the property has the type &DRM_MODE_PROP_BLOB. User-space must
++ * ignore these two fields if the property has a different type.
++ *
++ * User-space is expected to retrieve values and enums by performing this ioctl
++ * at least twice: the first time to retrieve the number of elements, the
++ * second time to retrieve the elements themselves.
++ *
++ * To retrieve the number of elements, set @count_values and @count_enum_blobs
++ * to zero, then call the ioctl. @count_values will be updated with the number
++ * of elements. If the property has the type &DRM_MODE_PROP_ENUM or
++ * &DRM_MODE_PROP_BITMASK, @count_enum_blobs will be updated as well.
++ *
++ * To retrieve the elements themselves, allocate an array for @values_ptr and
++ * set @count_values to its capacity. If the property has the type
++ * &DRM_MODE_PROP_ENUM or &DRM_MODE_PROP_BITMASK, allocate an array for
++ * @enum_blob_ptr and set @count_enum_blobs to its capacity. Calling the ioctl
++ * again will fill the arrays.
++ */
++struct drm_mode_get_property {
++ /** @values_ptr: Pointer to a ``__u64`` array. */
++ __u64 values_ptr;
++ /** @enum_blob_ptr: Pointer to a struct drm_mode_property_enum array. */
++ __u64 enum_blob_ptr;
++
++ /**
++ * @prop_id: Object ID of the property which should be retrieved. Set
++ * by the caller.
++ */
++ __u32 prop_id;
++ /**
++ * @flags: ``DRM_MODE_PROP_*`` bitfield. See &drm_property.flags for
++ * a definition of the flags.
++ */
++ __u32 flags;
++ /**
++ * @name: Symbolic property name. User-space should use this field to
++ * recognize properties.
++ */
++ char name[DRM_PROP_NAME_LEN];
++
++ /** @count_values: Number of elements in @values_ptr. */
++ __u32 count_values;
++ /** @count_enum_blobs: Number of elements in @enum_blob_ptr. */
++ __u32 count_enum_blobs;
++};
++
++struct drm_mode_connector_set_property {
++ __u64 value;
++ __u32 prop_id;
++ __u32 connector_id;
++};
++
++#define DRM_MODE_OBJECT_CRTC 0xcccccccc
++#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
++#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
++#define DRM_MODE_OBJECT_MODE 0xdededede
++#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
++#define DRM_MODE_OBJECT_FB 0xfbfbfbfb
++#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
++#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
++#define DRM_MODE_OBJECT_ANY 0
++
++struct drm_mode_obj_get_properties {
++ __u64 props_ptr;
++ __u64 prop_values_ptr;
++ __u32 count_props;
++ __u32 obj_id;
++ __u32 obj_type;
++};
++
++struct drm_mode_obj_set_property {
++ __u64 value;
++ __u32 prop_id;
++ __u32 obj_id;
++ __u32 obj_type;
++};
++
++struct drm_mode_get_blob {
++ __u32 blob_id;
++ __u32 length;
++ __u64 data;
++};
++
++struct drm_mode_fb_cmd {
++ __u32 fb_id;
++ __u32 width;
++ __u32 height;
++ __u32 pitch;
++ __u32 bpp;
++ __u32 depth;
++ /* driver specific handle */
++ __u32 handle;
++};
++
++#define DRM_MODE_FB_INTERLACED (1<<0) /* for interlaced framebuffers */
++#define DRM_MODE_FB_MODIFIERS (1<<1) /* enables ->modifer[] */
++
++struct drm_mode_fb_cmd2 {
++ __u32 fb_id;
++ __u32 width;
++ __u32 height;
++ __u32 pixel_format; /* fourcc code from drm_fourcc.h */
++ __u32 flags; /* see above flags */
++
++ /*
++ * In case of planar formats, this ioctl allows up to 4
++ * buffer objects with offsets and pitches per plane.
++ * The pitch and offset order is dictated by the fourcc,
++ * e.g. NV12 (https://fourcc.org/yuv.php#NV12) is described as:
++ *
++ * YUV 4:2:0 image with a plane of 8 bit Y samples
++ * followed by an interleaved U/V plane containing
++ * 8 bit 2x2 subsampled colour difference samples.
++ *
++ * So it would consist of Y as offsets[0] and UV as
++ * offsets[1]. Note that offsets[0] will generally
++ * be 0 (but this is not required).
++ *
++ * To accommodate tiled, compressed, etc formats, a
++ * modifier can be specified. The default value of zero
++ * indicates "native" format as specified by the fourcc.
++ * Vendor specific modifier token. Note that even though
++ * it looks like we have a modifier per-plane, we in fact
++ * do not. The modifier for each plane must be identical.
++ * Thus all combinations of different data layouts for
++ * multi plane formats must be enumerated as separate
++ * modifiers.
++ */
++ __u32 handles[4];
++ __u32 pitches[4]; /* pitch for each plane */
++ __u32 offsets[4]; /* offset of each plane */
++ __u64 modifier[4]; /* ie, tiling, compress */
++};
++
++#define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01
++#define DRM_MODE_FB_DIRTY_ANNOTATE_FILL 0x02
++#define DRM_MODE_FB_DIRTY_FLAGS 0x03
++
++#define DRM_MODE_FB_DIRTY_MAX_CLIPS 256
++
++/*
++ * Mark a region of a framebuffer as dirty.
++ *
++ * Some hardware does not automatically update display contents
++ * as a hardware or software draw to a framebuffer. This ioctl
++ * allows userspace to tell the kernel and the hardware what
++ * regions of the framebuffer have changed.
++ *
++ * The kernel or hardware is free to update more then just the
++ * region specified by the clip rects. The kernel or hardware
++ * may also delay and/or coalesce several calls to dirty into a
++ * single update.
++ *
++ * Userspace may annotate the updates, the annotates are a
++ * promise made by the caller that the change is either a copy
++ * of pixels or a fill of a single color in the region specified.
++ *
++ * If the DRM_MODE_FB_DIRTY_ANNOTATE_COPY flag is given then
++ * the number of updated regions are half of num_clips given,
++ * where the clip rects are paired in src and dst. The width and
++ * height of each one of the pairs must match.
++ *
++ * If the DRM_MODE_FB_DIRTY_ANNOTATE_FILL flag is given the caller
++ * promises that the region specified of the clip rects is filled
++ * completely with a single color as given in the color argument.
++ */
++
++struct drm_mode_fb_dirty_cmd {
++ __u32 fb_id;
++ __u32 flags;
++ __u32 color;
++ __u32 num_clips;
++ __u64 clips_ptr;
++};
++
++struct drm_mode_mode_cmd {
++ __u32 connector_id;
++ struct drm_mode_modeinfo mode;
++};
++
++#define DRM_MODE_CURSOR_BO 0x01
++#define DRM_MODE_CURSOR_MOVE 0x02
++#define DRM_MODE_CURSOR_FLAGS 0x03
++
++/*
++ * depending on the value in flags different members are used.
++ *
++ * CURSOR_BO uses
++ * crtc_id
++ * width
++ * height
++ * handle - if 0 turns the cursor off
++ *
++ * CURSOR_MOVE uses
++ * crtc_id
++ * x
++ * y
++ */
++struct drm_mode_cursor {
++ __u32 flags;
++ __u32 crtc_id;
++ __s32 x;
++ __s32 y;
++ __u32 width;
++ __u32 height;
++ /* driver specific handle */
++ __u32 handle;
++};
++
++struct drm_mode_cursor2 {
++ __u32 flags;
++ __u32 crtc_id;
++ __s32 x;
++ __s32 y;
++ __u32 width;
++ __u32 height;
++ /* driver specific handle */
++ __u32 handle;
++ __s32 hot_x;
++ __s32 hot_y;
++};
++
++struct drm_mode_crtc_lut {
++ __u32 crtc_id;
++ __u32 gamma_size;
++
++ /* pointers to arrays */
++ __u64 red;
++ __u64 green;
++ __u64 blue;
++};
++
++struct drm_color_ctm {
++ /*
++ * Conversion matrix in S31.32 sign-magnitude
++ * (not two's complement!) format.
++ */
++ __u64 matrix[9];
++};
++
++struct drm_color_lut {
++ /*
++ * Values are mapped linearly to 0.0 - 1.0 range, with 0x0 == 0.0 and
++ * 0xffff == 1.0.
++ */
++ __u16 red;
++ __u16 green;
++ __u16 blue;
++ __u16 reserved;
++};
++
++/**
++ * struct hdr_metadata_infoframe - HDR Metadata Infoframe Data.
++ *
++ * HDR Metadata Infoframe as per CTA 861.G spec. This is expected
++ * to match exactly with the spec.
++ *
++ * Userspace is expected to pass the metadata information as per
++ * the format described in this structure.
++ */
++struct hdr_metadata_infoframe {
++ /**
++ * @eotf: Electro-Optical Transfer Function (EOTF)
++ * used in the stream.
++ */
++ __u8 eotf;
++ /**
++ * @metadata_type: Static_Metadata_Descriptor_ID.
++ */
++ __u8 metadata_type;
++ /**
++ * @display_primaries: Color Primaries of the Data.
++ * These are coded as unsigned 16-bit values in units of
++ * 0.00002, where 0x0000 represents zero and 0xC350
++ * represents 1.0000.
++ * @display_primaries.x: X cordinate of color primary.
++ * @display_primaries.y: Y cordinate of color primary.
++ */
++ struct {
++ __u16 x, y;
++ } display_primaries[3];
++ /**
++ * @white_point: White Point of Colorspace Data.
++ * These are coded as unsigned 16-bit values in units of
++ * 0.00002, where 0x0000 represents zero and 0xC350
++ * represents 1.0000.
++ * @white_point.x: X cordinate of whitepoint of color primary.
++ * @white_point.y: Y cordinate of whitepoint of color primary.
++ */
++ struct {
++ __u16 x, y;
++ } white_point;
++ /**
++ * @max_display_mastering_luminance: Max Mastering Display Luminance.
++ * This value is coded as an unsigned 16-bit value in units of 1 cd/m2,
++ * where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.
++ */
++ __u16 max_display_mastering_luminance;
++ /**
++ * @min_display_mastering_luminance: Min Mastering Display Luminance.
++ * This value is coded as an unsigned 16-bit value in units of
++ * 0.0001 cd/m2, where 0x0001 represents 0.0001 cd/m2 and 0xFFFF
++ * represents 6.5535 cd/m2.
++ */
++ __u16 min_display_mastering_luminance;
++ /**
++ * @max_cll: Max Content Light Level.
++ * This value is coded as an unsigned 16-bit value in units of 1 cd/m2,
++ * where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.
++ */
++ __u16 max_cll;
++ /**
++ * @max_fall: Max Frame Average Light Level.
++ * This value is coded as an unsigned 16-bit value in units of 1 cd/m2,
++ * where 0x0001 represents 1 cd/m2 and 0xFFFF represents 65535 cd/m2.
++ */
++ __u16 max_fall;
++};
++
++/**
++ * struct hdr_output_metadata - HDR output metadata
++ *
++ * Metadata Information to be passed from userspace
++ */
++struct hdr_output_metadata {
++ /**
++ * @metadata_type: Static_Metadata_Descriptor_ID.
++ */
++ __u32 metadata_type;
++ /**
++ * @hdmi_metadata_type1: HDR Metadata Infoframe.
++ */
++ union {
++ struct hdr_metadata_infoframe hdmi_metadata_type1;
++ };
++};
++
++#define DRM_MODE_PAGE_FLIP_EVENT 0x01
++#define DRM_MODE_PAGE_FLIP_ASYNC 0x02
++#define DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE 0x4
++#define DRM_MODE_PAGE_FLIP_TARGET_RELATIVE 0x8
++#define DRM_MODE_PAGE_FLIP_TARGET (DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE | \
++ DRM_MODE_PAGE_FLIP_TARGET_RELATIVE)
++#define DRM_MODE_PAGE_FLIP_FLAGS (DRM_MODE_PAGE_FLIP_EVENT | \
++ DRM_MODE_PAGE_FLIP_ASYNC | \
++ DRM_MODE_PAGE_FLIP_TARGET)
++
++/*
++ * Request a page flip on the specified crtc.
++ *
++ * This ioctl will ask KMS to schedule a page flip for the specified
++ * crtc. Once any pending rendering targeting the specified fb (as of
++ * ioctl time) has completed, the crtc will be reprogrammed to display
++ * that fb after the next vertical refresh. The ioctl returns
++ * immediately, but subsequent rendering to the current fb will block
++ * in the execbuffer ioctl until the page flip happens. If a page
++ * flip is already pending as the ioctl is called, EBUSY will be
++ * returned.
++ *
++ * Flag DRM_MODE_PAGE_FLIP_EVENT requests that drm sends back a vblank
++ * event (see drm.h: struct drm_event_vblank) when the page flip is
++ * done. The user_data field passed in with this ioctl will be
++ * returned as the user_data field in the vblank event struct.
++ *
++ * Flag DRM_MODE_PAGE_FLIP_ASYNC requests that the flip happen
++ * 'as soon as possible', meaning that it not delay waiting for vblank.
++ * This may cause tearing on the screen.
++ *
++ * The reserved field must be zero.
++ */
++
++struct drm_mode_crtc_page_flip {
++ __u32 crtc_id;
++ __u32 fb_id;
++ __u32 flags;
++ __u32 reserved;
++ __u64 user_data;
++};
++
++/*
++ * Request a page flip on the specified crtc.
++ *
++ * Same as struct drm_mode_crtc_page_flip, but supports new flags and
++ * re-purposes the reserved field:
++ *
++ * The sequence field must be zero unless either of the
++ * DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE/RELATIVE flags is specified. When
++ * the ABSOLUTE flag is specified, the sequence field denotes the absolute
++ * vblank sequence when the flip should take effect. When the RELATIVE
++ * flag is specified, the sequence field denotes the relative (to the
++ * current one when the ioctl is called) vblank sequence when the flip
++ * should take effect. NOTE: DRM_IOCTL_WAIT_VBLANK must still be used to
++ * make sure the vblank sequence before the target one has passed before
++ * calling this ioctl. The purpose of the
++ * DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE/RELATIVE flags is merely to clarify
++ * the target for when code dealing with a page flip runs during a
++ * vertical blank period.
++ */
++
++struct drm_mode_crtc_page_flip_target {
++ __u32 crtc_id;
++ __u32 fb_id;
++ __u32 flags;
++ __u32 sequence;
++ __u64 user_data;
++};
++
++/* create a dumb scanout buffer */
++struct drm_mode_create_dumb {
++ __u32 height;
++ __u32 width;
++ __u32 bpp;
++ __u32 flags;
++ /* handle, pitch, size will be returned */
++ __u32 handle;
++ __u32 pitch;
++ __u64 size;
++};
++
++/* set up for mmap of a dumb scanout buffer */
++struct drm_mode_map_dumb {
++ /** Handle for the object being mapped. */
++ __u32 handle;
++ __u32 pad;
++ /**
++ * Fake offset to use for subsequent mmap call
++ *
++ * This is a fixed-size type for 32/64 compatibility.
++ */
++ __u64 offset;
++};
++
++struct drm_mode_destroy_dumb {
++ __u32 handle;
++};
++
++/* page-flip flags are valid, plus: */
++#define DRM_MODE_ATOMIC_TEST_ONLY 0x0100
++#define DRM_MODE_ATOMIC_NONBLOCK 0x0200
++#define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400
++
++#define DRM_MODE_ATOMIC_FLAGS (\
++ DRM_MODE_PAGE_FLIP_EVENT |\
++ DRM_MODE_PAGE_FLIP_ASYNC |\
++ DRM_MODE_ATOMIC_TEST_ONLY |\
++ DRM_MODE_ATOMIC_NONBLOCK |\
++ DRM_MODE_ATOMIC_ALLOW_MODESET)
++
++struct drm_mode_atomic {
++ __u32 flags;
++ __u32 count_objs;
++ __u64 objs_ptr;
++ __u64 count_props_ptr;
++ __u64 props_ptr;
++ __u64 prop_values_ptr;
++ __u64 reserved;
++ __u64 user_data;
++};
++
++struct drm_format_modifier_blob {
++#define FORMAT_BLOB_CURRENT 1
++ /* Version of this blob format */
++ __u32 version;
++
++ /* Flags */
++ __u32 flags;
++
++ /* Number of fourcc formats supported */
++ __u32 count_formats;
++
++ /* Where in this blob the formats exist (in bytes) */
++ __u32 formats_offset;
++
++ /* Number of drm_format_modifiers */
++ __u32 count_modifiers;
++
++ /* Where in this blob the modifiers exist (in bytes) */
++ __u32 modifiers_offset;
++
++ /* __u32 formats[] */
++ /* struct drm_format_modifier modifiers[] */
++};
++
++struct drm_format_modifier {
++ /* Bitmask of formats in get_plane format list this info applies to. The
++ * offset allows a sliding window of which 64 formats (bits).
++ *
++ * Some examples:
++ * In today's world with < 65 formats, and formats 0, and 2 are
++ * supported
++ * 0x0000000000000005
++ * ^-offset = 0, formats = 5
++ *
++ * If the number formats grew to 128, and formats 98-102 are
++ * supported with the modifier:
++ *
++ * 0x0000007c00000000 0000000000000000
++ * ^
++ * |__offset = 64, formats = 0x7c00000000
++ *
++ */
++ __u64 formats;
++ __u32 offset;
++ __u32 pad;
++
++ /* The modifier that applies to the >get_plane format list bitmask. */
++ __u64 modifier;
++};
++
++/**
++ * struct drm_mode_create_blob - Create New blob property
++ *
++ * Create a new 'blob' data property, copying length bytes from data pointer,
++ * and returning new blob ID.
++ */
++struct drm_mode_create_blob {
++ /** @data: Pointer to data to copy. */
++ __u64 data;
++ /** @length: Length of data to copy. */
++ __u32 length;
++ /** @blob_id: Return: new property ID. */
++ __u32 blob_id;
++};
++
++/**
++ * struct drm_mode_destroy_blob - Destroy user blob
++ * @blob_id: blob_id to destroy
++ *
++ * Destroy a user-created blob property.
++ *
++ * User-space can release blobs as soon as they do not need to refer to them by
++ * their blob object ID. For instance, if you are using a MODE_ID blob in an
++ * atomic commit and you will not make another commit re-using the same ID, you
++ * can destroy the blob as soon as the commit has been issued, without waiting
++ * for it to complete.
++ */
++struct drm_mode_destroy_blob {
++ __u32 blob_id;
++};
++
++/**
++ * struct drm_mode_create_lease - Create lease
++ *
++ * Lease mode resources, creating another drm_master.
++ *
++ * The @object_ids array must reference at least one CRTC, one connector and
++ * one plane if &DRM_CLIENT_CAP_UNIVERSAL_PLANES is enabled. Alternatively,
++ * the lease can be completely empty.
++ */
++struct drm_mode_create_lease {
++ /** @object_ids: Pointer to array of object ids (__u32) */
++ __u64 object_ids;
++ /** @object_count: Number of object ids */
++ __u32 object_count;
++ /** @flags: flags for new FD (O_CLOEXEC, etc) */
++ __u32 flags;
++
++ /** @lessee_id: Return: unique identifier for lessee. */
++ __u32 lessee_id;
++ /** @fd: Return: file descriptor to new drm_master file */
++ __u32 fd;
++};
++
++/**
++ * struct drm_mode_list_lessees - List lessees
++ *
++ * List lesses from a drm_master.
++ */
++struct drm_mode_list_lessees {
++ /**
++ * @count_lessees: Number of lessees.
++ *
++ * On input, provides length of the array.
++ * On output, provides total number. No
++ * more than the input number will be written
++ * back, so two calls can be used to get
++ * the size and then the data.
++ */
++ __u32 count_lessees;
++ /** @pad: Padding. */
++ __u32 pad;
++
++ /**
++ * @lessees_ptr: Pointer to lessees.
++ *
++ * Pointer to __u64 array of lessee ids
++ */
++ __u64 lessees_ptr;
++};
++
++/**
++ * struct drm_mode_get_lease - Get Lease
++ *
++ * Get leased objects.
++ */
++struct drm_mode_get_lease {
++ /**
++ * @count_objects: Number of leased objects.
++ *
++ * On input, provides length of the array.
++ * On output, provides total number. No
++ * more than the input number will be written
++ * back, so two calls can be used to get
++ * the size and then the data.
++ */
++ __u32 count_objects;
++ /** @pad: Padding. */
++ __u32 pad;
++
++ /**
++ * @objects_ptr: Pointer to objects.
++ *
++ * Pointer to __u32 array of object ids.
++ */
++ __u64 objects_ptr;
++};
++
++/**
++ * struct drm_mode_revoke_lease - Revoke lease
++ */
++struct drm_mode_revoke_lease {
++ /** @lessee_id: Unique ID of lessee */
++ __u32 lessee_id;
++};
++
++/**
++ * struct drm_mode_rect - Two dimensional rectangle.
++ * @x1: Horizontal starting coordinate (inclusive).
++ * @y1: Vertical starting coordinate (inclusive).
++ * @x2: Horizontal ending coordinate (exclusive).
++ * @y2: Vertical ending coordinate (exclusive).
++ *
++ * With drm subsystem using struct drm_rect to manage rectangular area this
++ * export it to user-space.
++ *
++ * Currently used by drm_mode_atomic blob property FB_DAMAGE_CLIPS.
++ */
++struct drm_mode_rect {
++ __s32 x1;
++ __s32 y1;
++ __s32 x2;
++ __s32 y2;
++};
++
++#if defined(__cplusplus)
++}
++#endif
++
++#endif
+diff --git a/third_party/drm/drm/xf86drm.h b/third_party/drm/drm/xf86drm.h
+new file mode 100644
+index 000000000000..501ab9e9d36d
+--- /dev/null
++++ b/third_party/drm/drm/xf86drm.h
+@@ -0,0 +1,966 @@
++/**
++ * \file xf86drm.h
++ * OS-independent header for DRM user-level library interface.
++ *
++ * \author Rickard E. (Rik) Faith <faith(a)valinux.com>
++ */
++
++/*
++ * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
++ * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
++ * All Rights Reserved.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ *
++ */
++
++#ifndef _XF86DRM_H_
++#define _XF86DRM_H_
++
++#include <stdarg.h>
++#include <sys/types.h>
++#include <stdint.h>
++#include <drm/drm.h>
++
++#if defined(__cplusplus)
++extern "C" {
++#endif
++
++#ifndef DRM_MAX_MINOR
++#define DRM_MAX_MINOR 16
++#endif
++
++#if defined(__linux__)
++
++#define DRM_IOCTL_NR(n) _IOC_NR(n)
++#define DRM_IOC_VOID _IOC_NONE
++#define DRM_IOC_READ _IOC_READ
++#define DRM_IOC_WRITE _IOC_WRITE
++#define DRM_IOC_READWRITE _IOC_READ|_IOC_WRITE
++#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
++
++#else /* One of the *BSDs */
++
++#include <sys/ioccom.h>
++#define DRM_IOCTL_NR(n) ((n) & 0xff)
++#define DRM_IOC_VOID IOC_VOID
++#define DRM_IOC_READ IOC_OUT
++#define DRM_IOC_WRITE IOC_IN
++#define DRM_IOC_READWRITE IOC_INOUT
++#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
++
++#endif
++
++ /* Defaults, if nothing set in xf86config */
++#define DRM_DEV_UID 0
++#define DRM_DEV_GID 0
++/* Default /dev/dri directory permissions 0755 */
++#define DRM_DEV_DIRMODE \
++ (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
++#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
++
++#ifdef __OpenBSD__
++#define DRM_DIR_NAME "/dev"
++#define DRM_PRIMARY_MINOR_NAME "drm"
++#define DRM_CONTROL_MINOR_NAME "drmC"
++#define DRM_RENDER_MINOR_NAME "drmR"
++#else
++#define DRM_DIR_NAME "/dev/dri"
++#define DRM_PRIMARY_MINOR_NAME "card"
++#define DRM_CONTROL_MINOR_NAME "controlD"
++#define DRM_RENDER_MINOR_NAME "renderD"
++#define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */
++#endif
++
++#define DRM_DEV_NAME "%s/" DRM_PRIMARY_MINOR_NAME "%d"
++#define DRM_CONTROL_DEV_NAME "%s/" DRM_CONTROL_MINOR_NAME "%d"
++#define DRM_RENDER_DEV_NAME "%s/" DRM_RENDER_MINOR_NAME "%d"
++
++#define DRM_NODE_NAME_MAX \
++ (sizeof(DRM_DIR_NAME) + 1 /* slash */ \
++ + MAX3(sizeof(DRM_PRIMARY_MINOR_NAME), \
++ sizeof(DRM_CONTROL_MINOR_NAME), \
++ sizeof(DRM_RENDER_MINOR_NAME)) \
++ + sizeof("144") /* highest possible node number */ \
++ + 1) /* NULL-terminator */
++
++#define DRM_ERR_NO_DEVICE (-1001)
++#define DRM_ERR_NO_ACCESS (-1002)
++#define DRM_ERR_NOT_ROOT (-1003)
++#define DRM_ERR_INVALID (-1004)
++#define DRM_ERR_NO_FD (-1005)
++
++#define DRM_AGP_NO_HANDLE 0
++
++typedef unsigned int drmSize, *drmSizePtr; /**< For mapped regions */
++typedef void *drmAddress, **drmAddressPtr; /**< For mapped regions */
++
++#if (__GNUC__ >= 3)
++#define DRM_PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a)))
++#else
++#define DRM_PRINTFLIKE(f, a)
++#endif
++
++typedef struct _drmServerInfo {
++ int (*debug_print)(const char *format, va_list ap) DRM_PRINTFLIKE(1,0);
++ int (*load_module)(const char *name);
++ void (*get_perms)(gid_t *, mode_t *);
++} drmServerInfo, *drmServerInfoPtr;
++
++typedef struct drmHashEntry {
++ int fd;
++ void (*f)(int, void *, void *);
++ void *tagTable;
++} drmHashEntry;
++
++extern int drmIoctl(int fd, unsigned long request, void *arg);
++extern void *drmGetHashTable(void);
++extern drmHashEntry *drmGetEntry(int fd);
++
++/**
++ * Driver version information.
++ *
++ * \sa drmGetVersion() and drmSetVersion().
++ */
++typedef struct _drmVersion {
++ int version_major; /**< Major version */
++ int version_minor; /**< Minor version */
++ int version_patchlevel; /**< Patch level */
++ int name_len; /**< Length of name buffer */
++ char *name; /**< Name of driver */
++ int date_len; /**< Length of date buffer */
++ char *date; /**< User-space buffer to hold date */
++ int desc_len; /**< Length of desc buffer */
++ char *desc; /**< User-space buffer to hold desc */
++} drmVersion, *drmVersionPtr;
++
++typedef struct _drmStats {
++ unsigned long count; /**< Number of data */
++ struct {
++ unsigned long value; /**< Value from kernel */
++ const char *long_format; /**< Suggested format for long_name */
++ const char *long_name; /**< Long name for value */
++ const char *rate_format; /**< Suggested format for rate_name */
++ const char *rate_name; /**< Short name for value per second */
++ int isvalue; /**< True if value (vs. counter) */
++ const char *mult_names; /**< Multiplier names (e.g., "KGM") */
++ int mult; /**< Multiplier value (e.g., 1024) */
++ int verbose; /**< Suggest only in verbose output */
++ } data[15];
++} drmStatsT;
++
++
++ /* All of these enums *MUST* match with the
++ kernel implementation -- so do *NOT*
++ change them! (The drmlib implementation
++ will just copy the flags instead of
++ translating them.) */
++typedef enum {
++ DRM_FRAME_BUFFER = 0, /**< WC, no caching, no core dump */
++ DRM_REGISTERS = 1, /**< no caching, no core dump */
++ DRM_SHM = 2, /**< shared, cached */
++ DRM_AGP = 3, /**< AGP/GART */
++ DRM_SCATTER_GATHER = 4, /**< PCI scatter/gather */
++ DRM_CONSISTENT = 5 /**< PCI consistent */
++} drmMapType;
++
++typedef enum {
++ DRM_RESTRICTED = 0x0001, /**< Cannot be mapped to client-virtual */
++ DRM_READ_ONLY = 0x0002, /**< Read-only in client-virtual */
++ DRM_LOCKED = 0x0004, /**< Physical pages locked */
++ DRM_KERNEL = 0x0008, /**< Kernel requires access */
++ DRM_WRITE_COMBINING = 0x0010, /**< Use write-combining, if available */
++ DRM_CONTAINS_LOCK = 0x0020, /**< SHM page that contains lock */
++ DRM_REMOVABLE = 0x0040 /**< Removable mapping */
++} drmMapFlags;
++
++/**
++ * \warning These values *MUST* match drm.h
++ */
++typedef enum {
++ /** \name Flags for DMA buffer dispatch */
++ /*@{*/
++ DRM_DMA_BLOCK = 0x01, /**<
++ * Block until buffer dispatched.
++ *
++ * \note the buffer may not yet have been
++ * processed by the hardware -- getting a
++ * hardware lock with the hardware quiescent
++ * will ensure that the buffer has been
++ * processed.
++ */
++ DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */
++ DRM_DMA_PRIORITY = 0x04, /**< High priority dispatch */
++ /*@}*/
++
++ /** \name Flags for DMA buffer request */
++ /*@{*/
++ DRM_DMA_WAIT = 0x10, /**< Wait for free buffers */
++ DRM_DMA_SMALLER_OK = 0x20, /**< Smaller-than-requested buffers OK */
++ DRM_DMA_LARGER_OK = 0x40 /**< Larger-than-requested buffers OK */
++ /*@}*/
++} drmDMAFlags;
++
++typedef enum {
++ DRM_PAGE_ALIGN = 0x01,
++ DRM_AGP_BUFFER = 0x02,
++ DRM_SG_BUFFER = 0x04,
++ DRM_FB_BUFFER = 0x08,
++ DRM_PCI_BUFFER_RO = 0x10
++} drmBufDescFlags;
++
++typedef enum {
++ DRM_LOCK_READY = 0x01, /**< Wait until hardware is ready for DMA */
++ DRM_LOCK_QUIESCENT = 0x02, /**< Wait until hardware quiescent */
++ DRM_LOCK_FLUSH = 0x04, /**< Flush this context's DMA queue first */
++ DRM_LOCK_FLUSH_ALL = 0x08, /**< Flush all DMA queues first */
++ /* These *HALT* flags aren't supported yet
++ -- they will be used to support the
++ full-screen DGA-like mode. */
++ DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */
++ DRM_HALT_CUR_QUEUES = 0x20 /**< Halt all current queues */
++} drmLockFlags;
++
++typedef enum {
++ DRM_CONTEXT_PRESERVED = 0x01, /**< This context is preserved and
++ never swapped. */
++ DRM_CONTEXT_2DONLY = 0x02 /**< This context is for 2D rendering only. */
++} drm_context_tFlags, *drm_context_tFlagsPtr;
++
++typedef struct _drmBufDesc {
++ int count; /**< Number of buffers of this size */
++ int size; /**< Size in bytes */
++ int low_mark; /**< Low water mark */
++ int high_mark; /**< High water mark */
++} drmBufDesc, *drmBufDescPtr;
++
++typedef struct _drmBufInfo {
++ int count; /**< Number of buffers described in list */
++ drmBufDescPtr list; /**< List of buffer descriptions */
++} drmBufInfo, *drmBufInfoPtr;
++
++typedef struct _drmBuf {
++ int idx; /**< Index into the master buffer list */
++ int total; /**< Buffer size */
++ int used; /**< Amount of buffer in use (for DMA) */
++ drmAddress address; /**< Address */
++} drmBuf, *drmBufPtr;
++
++/**
++ * Buffer mapping information.
++ *
++ * Used by drmMapBufs() and drmUnmapBufs() to store information about the
++ * mapped buffers.
++ */
++typedef struct _drmBufMap {
++ int count; /**< Number of buffers mapped */
++ drmBufPtr list; /**< Buffers */
++} drmBufMap, *drmBufMapPtr;
++
++typedef struct _drmLock {
++ volatile unsigned int lock;
++ char padding[60];
++ /* This is big enough for most current (and future?) architectures:
++ DEC Alpha: 32 bytes
++ Intel Merced: ?
++ Intel P5/PPro/PII/PIII: 32 bytes
++ Intel StrongARM: 32 bytes
++ Intel i386/i486: 16 bytes
++ MIPS: 32 bytes (?)
++ Motorola 68k: 16 bytes
++ Motorola PowerPC: 32 bytes
++ Sun SPARC: 32 bytes
++ */
++} drmLock, *drmLockPtr;
++
++/**
++ * Indices here refer to the offset into
++ * list in drmBufInfo
++ */
++typedef struct _drmDMAReq {
++ drm_context_t context; /**< Context handle */
++ int send_count; /**< Number of buffers to send */
++ int *send_list; /**< List of handles to buffers */
++ int *send_sizes; /**< Lengths of data to send, in bytes */
++ drmDMAFlags flags; /**< Flags */
++ int request_count; /**< Number of buffers requested */
++ int request_size; /**< Desired size of buffers requested */
++ int *request_list; /**< Buffer information */
++ int *request_sizes; /**< Minimum acceptable sizes */
++ int granted_count; /**< Number of buffers granted at this size */
++} drmDMAReq, *drmDMAReqPtr;
++
++typedef struct _drmRegion {
++ drm_handle_t handle;
++ unsigned int offset;
++ drmSize size;
++ drmAddress map;
++} drmRegion, *drmRegionPtr;
++
++typedef struct _drmTextureRegion {
++ unsigned char next;
++ unsigned char prev;
++ unsigned char in_use;
++ unsigned char padding; /**< Explicitly pad this out */
++ unsigned int age;
++} drmTextureRegion, *drmTextureRegionPtr;
++
++
++typedef enum {
++ DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */
++ DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */
++ /* bits 1-6 are reserved for high crtcs */
++ DRM_VBLANK_HIGH_CRTC_MASK = 0x0000003e,
++ DRM_VBLANK_EVENT = 0x4000000, /**< Send event instead of blocking */
++ DRM_VBLANK_FLIP = 0x8000000, /**< Scheduled buffer swap should flip */
++ DRM_VBLANK_NEXTONMISS = 0x10000000, /**< If missed, wait for next vblank */
++ DRM_VBLANK_SECONDARY = 0x20000000, /**< Secondary display controller */
++ DRM_VBLANK_SIGNAL = 0x40000000 /* Send signal instead of blocking */
++} drmVBlankSeqType;
++#define DRM_VBLANK_HIGH_CRTC_SHIFT 1
++
++typedef struct _drmVBlankReq {
++ drmVBlankSeqType type;
++ unsigned int sequence;
++ unsigned long signal;
++} drmVBlankReq, *drmVBlankReqPtr;
++
++typedef struct _drmVBlankReply {
++ drmVBlankSeqType type;
++ unsigned int sequence;
++ long tval_sec;
++ long tval_usec;
++} drmVBlankReply, *drmVBlankReplyPtr;
++
++typedef union _drmVBlank {
++ drmVBlankReq request;
++ drmVBlankReply reply;
++} drmVBlank, *drmVBlankPtr;
++
++typedef struct _drmSetVersion {
++ int drm_di_major;
++ int drm_di_minor;
++ int drm_dd_major;
++ int drm_dd_minor;
++} drmSetVersion, *drmSetVersionPtr;
++
++#define __drm_dummy_lock(lock) (*(__volatile__ unsigned int *)lock)
++
++#define DRM_LOCK_HELD 0x80000000U /**< Hardware lock is held */
++#define DRM_LOCK_CONT 0x40000000U /**< Hardware lock is contended */
++
++#if defined(__GNUC__) && (__GNUC__ >= 2)
++# if defined(__i386) || defined(__AMD64__) || defined(__x86_64__) || defined(__amd64__)
++ /* Reflect changes here to drmP.h */
++#define DRM_CAS(lock,old,new,__ret) \
++ do { \
++ int __dummy; /* Can't mark eax as clobbered */ \
++ __asm__ __volatile__( \
++ "lock ; cmpxchg %4,%1\n\t" \
++ "setnz %0" \
++ : "=d" (__ret), \
++ "=m" (__drm_dummy_lock(lock)), \
++ "=a" (__dummy) \
++ : "2" (old), \
++ "r" (new)); \
++ } while (0)
++
++#elif defined(__alpha__)
++
++#define DRM_CAS(lock, old, new, ret) \
++ do { \
++ int tmp, old32; \
++ __asm__ __volatile__( \
++ " addl $31, %5, %3\n" \
++ "1: ldl_l %0, %2\n" \
++ " cmpeq %0, %3, %1\n" \
++ " beq %1, 2f\n" \
++ " mov %4, %0\n" \
++ " stl_c %0, %2\n" \
++ " beq %0, 3f\n" \
++ " mb\n" \
++ "2: cmpeq %1, 0, %1\n" \
++ ".subsection 2\n" \
++ "3: br 1b\n" \
++ ".previous" \
++ : "=&r"(tmp), "=&r"(ret), \
++ "=m"(__drm_dummy_lock(lock)), \
++ "=&r"(old32) \
++ : "r"(new), "r"(old) \
++ : "memory"); \
++ } while (0)
++
++#elif defined(__sparc__)
++
++#define DRM_CAS(lock,old,new,__ret) \
++do { register unsigned int __old __asm("o0"); \
++ register unsigned int __new __asm("o1"); \
++ register volatile unsigned int *__lock __asm("o2"); \
++ __old = old; \
++ __new = new; \
++ __lock = (volatile unsigned int *)lock; \
++ __asm__ __volatile__( \
++ /*"cas [%2], %3, %0"*/ \
++ ".word 0xd3e29008\n\t" \
++ /*"membar #StoreStore | #StoreLoad"*/ \
++ ".word 0x8143e00a" \
++ : "=&r" (__new) \
++ : "0" (__new), \
++ "r" (__lock), \
++ "r" (__old) \
++ : "memory"); \
++ __ret = (__new != __old); \
++} while(0)
++
++#elif defined(__ia64__)
++
++#ifdef __INTEL_COMPILER
++/* this currently generates bad code (missing stop bits)... */
++#include <ia64intrin.h>
++
++#define DRM_CAS(lock,old,new,__ret) \
++ do { \
++ unsigned long __result, __old = (old) & 0xffffffff; \
++ __mf(); \
++ __result = _InterlockedCompareExchange_acq(&__drm_dummy_lock(lock), (new), __old);\
++ __ret = (__result) != (__old); \
++/* __ret = (__sync_val_compare_and_swap(&__drm_dummy_lock(lock), \
++ (old), (new)) \
++ != (old)); */\
++ } while (0)
++
++#else
++#define DRM_CAS(lock,old,new,__ret) \
++ do { \
++ unsigned int __result, __old = (old); \
++ __asm__ __volatile__( \
++ "mf\n" \
++ "mov ar.ccv=%2\n" \
++ ";;\n" \
++ "cmpxchg4.acq %0=%1,%3,ar.ccv" \
++ : "=r" (__result), "=m" (__drm_dummy_lock(lock)) \
++ : "r" ((unsigned long)__old), "r" (new) \
++ : "memory"); \
++ __ret = (__result) != (__old); \
++ } while (0)
++
++#endif
++
++#elif defined(__powerpc__)
++
++#define DRM_CAS(lock,old,new,__ret) \
++ do { \
++ __asm__ __volatile__( \
++ "sync;" \
++ "0: lwarx %0,0,%1;" \
++ " xor. %0,%3,%0;" \
++ " bne 1f;" \
++ " stwcx. %2,0,%1;" \
++ " bne- 0b;" \
++ "1: " \
++ "sync;" \
++ : "=&r"(__ret) \
++ : "r"(lock), "r"(new), "r"(old) \
++ : "cr0", "memory"); \
++ } while (0)
++
++# elif defined (__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
++ || defined (__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) \
++ || defined (__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) \
++ || defined (__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
++ || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
++ || defined(__ARM_ARCH_7EM__)
++ /* excluding ARMv4/ARMv5 and lower (lacking ldrex/strex support) */
++ #undef DRM_DEV_MODE
++ #define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
++
++ #define DRM_CAS(lock,old,new,__ret) \
++ do { \
++ __asm__ __volatile__ ( \
++ "1: ldrex %0, [%1]\n" \
++ " teq %0, %2\n" \
++ " ite eq\n" \
++ " strexeq %0, %3, [%1]\n" \
++ " movne %0, #1\n" \
++ : "=&r" (__ret) \
++ : "r" (lock), "r" (old), "r" (new) \
++ : "cc","memory"); \
++ } while (0)
++
++#endif /* architecture */
++#endif /* __GNUC__ >= 2 */
++
++#ifndef DRM_CAS
++#define DRM_CAS(lock,old,new,ret) do { ret=1; } while (0) /* FAST LOCK FAILS */
++#endif
++
++#if defined(__alpha__)
++#define DRM_CAS_RESULT(_result) long _result
++#elif defined(__powerpc__)
++#define DRM_CAS_RESULT(_result) int _result
++#else
++#define DRM_CAS_RESULT(_result) char _result
++#endif
++
++#define DRM_LIGHT_LOCK(fd,lock,context) \
++ do { \
++ DRM_CAS_RESULT(__ret); \
++ DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret); \
++ if (__ret) drmGetLock(fd,context,0); \
++ } while(0)
++
++ /* This one counts fast locks -- for
++ benchmarking only. */
++#define DRM_LIGHT_LOCK_COUNT(fd,lock,context,count) \
++ do { \
++ DRM_CAS_RESULT(__ret); \
++ DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret); \
++ if (__ret) drmGetLock(fd,context,0); \
++ else ++count; \
++ } while(0)
++
++#define DRM_LOCK(fd,lock,context,flags) \
++ do { \
++ if (flags) drmGetLock(fd,context,flags); \
++ else DRM_LIGHT_LOCK(fd,lock,context); \
++ } while(0)
++
++#define DRM_UNLOCK(fd,lock,context) \
++ do { \
++ DRM_CAS_RESULT(__ret); \
++ DRM_CAS(lock,DRM_LOCK_HELD|context,context,__ret); \
++ if (__ret) drmUnlock(fd,context); \
++ } while(0)
++
++ /* Simple spin locks */
++#define DRM_SPINLOCK(spin,val) \
++ do { \
++ DRM_CAS_RESULT(__ret); \
++ do { \
++ DRM_CAS(spin,0,val,__ret); \
++ if (__ret) while ((spin)->lock); \
++ } while (__ret); \
++ } while(0)
++
++#define DRM_SPINLOCK_TAKE(spin,val) \
++ do { \
++ DRM_CAS_RESULT(__ret); \
++ int cur; \
++ do { \
++ cur = (*spin).lock; \
++ DRM_CAS(spin,cur,val,__ret); \
++ } while (__ret); \
++ } while(0)
++
++#define DRM_SPINLOCK_COUNT(spin,val,count,__ret) \
++ do { \
++ int __i; \
++ __ret = 1; \
++ for (__i = 0; __ret && __i < count; __i++) { \
++ DRM_CAS(spin,0,val,__ret); \
++ if (__ret) for (;__i < count && (spin)->lock; __i++); \
++ } \
++ } while(0)
++
++#define DRM_SPINUNLOCK(spin,val) \
++ do { \
++ DRM_CAS_RESULT(__ret); \
++ if ((*spin).lock == val) { /* else server stole lock */ \
++ do { \
++ DRM_CAS(spin,val,0,__ret); \
++ } while (__ret); \
++ } \
++ } while(0)
++
++
++
++/* General user-level programmer's API: unprivileged */
++extern int drmAvailable(void);
++extern int drmOpen(const char *name, const char *busid);
++
++#define DRM_NODE_PRIMARY 0
++#define DRM_NODE_CONTROL 1
++#define DRM_NODE_RENDER 2
++#define DRM_NODE_MAX 3
++
++extern int drmOpenWithType(const char *name, const char *busid,
++ int type);
++
++extern int drmOpenControl(int minor);
++extern int drmOpenRender(int minor);
++extern int drmClose(int fd);
++extern drmVersionPtr drmGetVersion(int fd);
++extern drmVersionPtr drmGetLibVersion(int fd);
++extern int drmGetCap(int fd, uint64_t capability, uint64_t *value);
++extern void drmFreeVersion(drmVersionPtr);
++extern int drmGetMagic(int fd, drm_magic_t * magic);
++extern char *drmGetBusid(int fd);
++extern int drmGetInterruptFromBusID(int fd, int busnum, int devnum,
++ int funcnum);
++extern int drmGetMap(int fd, int idx, drm_handle_t *offset,
++ drmSize *size, drmMapType *type,
++ drmMapFlags *flags, drm_handle_t *handle,
++ int *mtrr);
++extern int drmGetClient(int fd, int idx, int *auth, int *pid,
++ int *uid, unsigned long *magic,
++ unsigned long *iocs);
++extern int drmGetStats(int fd, drmStatsT *stats);
++extern int drmSetInterfaceVersion(int fd, drmSetVersion *version);
++extern int drmCommandNone(int fd, unsigned long drmCommandIndex);
++extern int drmCommandRead(int fd, unsigned long drmCommandIndex,
++ void *data, unsigned long size);
++extern int drmCommandWrite(int fd, unsigned long drmCommandIndex,
++ void *data, unsigned long size);
++extern int drmCommandWriteRead(int fd, unsigned long drmCommandIndex,
++ void *data, unsigned long size);
++
++/* General user-level programmer's API: X server (root) only */
++extern void drmFreeBusid(const char *busid);
++extern int drmSetBusid(int fd, const char *busid);
++extern int drmAuthMagic(int fd, drm_magic_t magic);
++extern int drmAddMap(int fd,
++ drm_handle_t offset,
++ drmSize size,
++ drmMapType type,
++ drmMapFlags flags,
++ drm_handle_t * handle);
++extern int drmRmMap(int fd, drm_handle_t handle);
++extern int drmAddContextPrivateMapping(int fd, drm_context_t ctx_id,
++ drm_handle_t handle);
++
++extern int drmAddBufs(int fd, int count, int size,
++ drmBufDescFlags flags,
++ int agp_offset);
++extern int drmMarkBufs(int fd, double low, double high);
++extern int drmCreateContext(int fd, drm_context_t * handle);
++extern int drmSetContextFlags(int fd, drm_context_t context,
++ drm_context_tFlags flags);
++extern int drmGetContextFlags(int fd, drm_context_t context,
++ drm_context_tFlagsPtr flags);
++extern int drmAddContextTag(int fd, drm_context_t context, void *tag);
++extern int drmDelContextTag(int fd, drm_context_t context);
++extern void *drmGetContextTag(int fd, drm_context_t context);
++extern drm_context_t * drmGetReservedContextList(int fd, int *count);
++extern void drmFreeReservedContextList(drm_context_t *);
++extern int drmSwitchToContext(int fd, drm_context_t context);
++extern int drmDestroyContext(int fd, drm_context_t handle);
++extern int drmCreateDrawable(int fd, drm_drawable_t * handle);
++extern int drmDestroyDrawable(int fd, drm_drawable_t handle);
++extern int drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
++ drm_drawable_info_type_t type,
++ unsigned int num, void *data);
++extern int drmCtlInstHandler(int fd, int irq);
++extern int drmCtlUninstHandler(int fd);
++extern int drmSetClientCap(int fd, uint64_t capability,
++ uint64_t value);
++
++extern int drmCrtcGetSequence(int fd, uint32_t crtcId,
++ uint64_t *sequence, uint64_t *ns);
++extern int drmCrtcQueueSequence(int fd, uint32_t crtcId,
++ uint32_t flags, uint64_t sequence,
++ uint64_t *sequence_queued,
++ uint64_t user_data);
++/* General user-level programmer's API: authenticated client and/or X */
++extern int drmMap(int fd,
++ drm_handle_t handle,
++ drmSize size,
++ drmAddressPtr address);
++extern int drmUnmap(drmAddress address, drmSize size);
++extern drmBufInfoPtr drmGetBufInfo(int fd);
++extern drmBufMapPtr drmMapBufs(int fd);
++extern int drmUnmapBufs(drmBufMapPtr bufs);
++extern int drmDMA(int fd, drmDMAReqPtr request);
++extern int drmFreeBufs(int fd, int count, int *list);
++extern int drmGetLock(int fd,
++ drm_context_t context,
++ drmLockFlags flags);
++extern int drmUnlock(int fd, drm_context_t context);
++extern int drmFinish(int fd, int context, drmLockFlags flags);
++extern int drmGetContextPrivateMapping(int fd, drm_context_t ctx_id,
++ drm_handle_t * handle);
++
++/* AGP/GART support: X server (root) only */
++extern int drmAgpAcquire(int fd);
++extern int drmAgpRelease(int fd);
++extern int drmAgpEnable(int fd, unsigned long mode);
++extern int drmAgpAlloc(int fd, unsigned long size,
++ unsigned long type, unsigned long *address,
++ drm_handle_t *handle);
++extern int drmAgpFree(int fd, drm_handle_t handle);
++extern int drmAgpBind(int fd, drm_handle_t handle,
++ unsigned long offset);
++extern int drmAgpUnbind(int fd, drm_handle_t handle);
++
++/* AGP/GART info: authenticated client and/or X */
++extern int drmAgpVersionMajor(int fd);
++extern int drmAgpVersionMinor(int fd);
++extern unsigned long drmAgpGetMode(int fd);
++extern unsigned long drmAgpBase(int fd); /* Physical location */
++extern unsigned long drmAgpSize(int fd); /* Bytes */
++extern unsigned long drmAgpMemoryUsed(int fd);
++extern unsigned long drmAgpMemoryAvail(int fd);
++extern unsigned int drmAgpVendorId(int fd);
++extern unsigned int drmAgpDeviceId(int fd);
++
++/* PCI scatter/gather support: X server (root) only */
++extern int drmScatterGatherAlloc(int fd, unsigned long size,
++ drm_handle_t *handle);
++extern int drmScatterGatherFree(int fd, drm_handle_t handle);
++
++extern int drmWaitVBlank(int fd, drmVBlankPtr vbl);
++
++/* Support routines */
++extern void drmSetServerInfo(drmServerInfoPtr info);
++extern int drmError(int err, const char *label);
++extern void *drmMalloc(int size);
++extern void drmFree(void *pt);
++
++/* Hash table routines */
++extern void *drmHashCreate(void);
++extern int drmHashDestroy(void *t);
++extern int drmHashLookup(void *t, unsigned long key, void **value);
++extern int drmHashInsert(void *t, unsigned long key, void *value);
++extern int drmHashDelete(void *t, unsigned long key);
++extern int drmHashFirst(void *t, unsigned long *key, void **value);
++extern int drmHashNext(void *t, unsigned long *key, void **value);
++
++/* PRNG routines */
++extern void *drmRandomCreate(unsigned long seed);
++extern int drmRandomDestroy(void *state);
++extern unsigned long drmRandom(void *state);
++extern double drmRandomDouble(void *state);
++
++/* Skip list routines */
++
++extern void *drmSLCreate(void);
++extern int drmSLDestroy(void *l);
++extern int drmSLLookup(void *l, unsigned long key, void **value);
++extern int drmSLInsert(void *l, unsigned long key, void *value);
++extern int drmSLDelete(void *l, unsigned long key);
++extern int drmSLNext(void *l, unsigned long *key, void **value);
++extern int drmSLFirst(void *l, unsigned long *key, void **value);
++extern void drmSLDump(void *l);
++extern int drmSLLookupNeighbors(void *l, unsigned long key,
++ unsigned long *prev_key, void **prev_value,
++ unsigned long *next_key, void **next_value);
++
++extern int drmOpenOnce(void *unused, const char *BusID, int *newlyopened);
++extern int drmOpenOnceWithType(const char *BusID, int *newlyopened, int type);
++extern void drmCloseOnce(int fd);
++extern void drmMsg(const char *format, ...) DRM_PRINTFLIKE(1, 2);
++
++extern int drmSetMaster(int fd);
++extern int drmDropMaster(int fd);
++extern int drmIsMaster(int fd);
++
++#define DRM_EVENT_CONTEXT_VERSION 4
++
++typedef struct _drmEventContext {
++
++ /* This struct is versioned so we can add more pointers if we
++ * add more events. */
++ int version;
++
++ void (*vblank_handler)(int fd,
++ unsigned int sequence,
++ unsigned int tv_sec,
++ unsigned int tv_usec,
++ void *user_data);
++
++ void (*page_flip_handler)(int fd,
++ unsigned int sequence,
++ unsigned int tv_sec,
++ unsigned int tv_usec,
++ void *user_data);
++
++ void (*page_flip_handler2)(int fd,
++ unsigned int sequence,
++ unsigned int tv_sec,
++ unsigned int tv_usec,
++ unsigned int crtc_id,
++ void *user_data);
++
++ void (*sequence_handler)(int fd,
++ uint64_t sequence,
++ uint64_t ns,
++ uint64_t user_data);
++} drmEventContext, *drmEventContextPtr;
++
++extern int drmHandleEvent(int fd, drmEventContextPtr evctx);
++
++extern char *drmGetDeviceNameFromFd(int fd);
++
++/* Improved version of drmGetDeviceNameFromFd which attributes for any type of
++ * device/node - card, control or renderD.
++ */
++extern char *drmGetDeviceNameFromFd2(int fd);
++extern int drmGetNodeTypeFromFd(int fd);
++
++/* Convert between GEM handles and DMA-BUF file descriptors.
++ *
++ * Warning: since GEM handles are not reference-counted and are unique per
++ * DRM file description, the caller is expected to perform its own reference
++ * counting. drmPrimeFDToHandle is guaranteed to return the same handle for
++ * different FDs if they reference the same underlying buffer object. This
++ * could even be a buffer object originally created on the same DRM FD.
++ *
++ * When sharing a DRM FD with an API such as EGL or GBM, the caller must not
++ * use drmPrimeHandleToFD nor drmPrimeFDToHandle. A single user-space
++ * reference-counting implementation is necessary to avoid double-closing GEM
++ * handles.
++ *
++ * Two processes can't share the same DRM FD and both use it to create or
++ * import GEM handles, even when using a single user-space reference-counting
++ * implementation like GBM, because GBM doesn't share its state between
++ * processes.
++ */
++extern int drmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags, int *prime_fd);
++extern int drmPrimeFDToHandle(int fd, int prime_fd, uint32_t *handle);
++
++extern int drmCloseBufferHandle(int fd, uint32_t handle);
++
++extern char *drmGetPrimaryDeviceNameFromFd(int fd);
++extern char *drmGetRenderDeviceNameFromFd(int fd);
++
++#define DRM_BUS_PCI 0
++#define DRM_BUS_USB 1
++#define DRM_BUS_PLATFORM 2
++#define DRM_BUS_HOST1X 3
++
++typedef struct _drmPciBusInfo {
++ uint16_t domain;
++ uint8_t bus;
++ uint8_t dev;
++ uint8_t func;
++} drmPciBusInfo, *drmPciBusInfoPtr;
++
++typedef struct _drmPciDeviceInfo {
++ uint16_t vendor_id;
++ uint16_t device_id;
++ uint16_t subvendor_id;
++ uint16_t subdevice_id;
++ uint8_t revision_id;
++} drmPciDeviceInfo, *drmPciDeviceInfoPtr;
++
++typedef struct _drmUsbBusInfo {
++ uint8_t bus;
++ uint8_t dev;
++} drmUsbBusInfo, *drmUsbBusInfoPtr;
++
++typedef struct _drmUsbDeviceInfo {
++ uint16_t vendor;
++ uint16_t product;
++} drmUsbDeviceInfo, *drmUsbDeviceInfoPtr;
++
++#define DRM_PLATFORM_DEVICE_NAME_LEN 512
++
++typedef struct _drmPlatformBusInfo {
++ char fullname[DRM_PLATFORM_DEVICE_NAME_LEN];
++} drmPlatformBusInfo, *drmPlatformBusInfoPtr;
++
++typedef struct _drmPlatformDeviceInfo {
++ char **compatible; /* NULL terminated list of compatible strings */
++} drmPlatformDeviceInfo, *drmPlatformDeviceInfoPtr;
++
++#define DRM_HOST1X_DEVICE_NAME_LEN 512
++
++typedef struct _drmHost1xBusInfo {
++ char fullname[DRM_HOST1X_DEVICE_NAME_LEN];
++} drmHost1xBusInfo, *drmHost1xBusInfoPtr;
++
++typedef struct _drmHost1xDeviceInfo {
++ char **compatible; /* NULL terminated list of compatible strings */
++} drmHost1xDeviceInfo, *drmHost1xDeviceInfoPtr;
++
++typedef struct _drmDevice {
++ char **nodes; /* DRM_NODE_MAX sized array */
++ int available_nodes; /* DRM_NODE_* bitmask */
++ int bustype;
++ union {
++ drmPciBusInfoPtr pci;
++ drmUsbBusInfoPtr usb;
++ drmPlatformBusInfoPtr platform;
++ drmHost1xBusInfoPtr host1x;
++ } businfo;
++ union {
++ drmPciDeviceInfoPtr pci;
++ drmUsbDeviceInfoPtr usb;
++ drmPlatformDeviceInfoPtr platform;
++ drmHost1xDeviceInfoPtr host1x;
++ } deviceinfo;
++} drmDevice, *drmDevicePtr;
++
++extern int drmGetDevice(int fd, drmDevicePtr *device);
++extern void drmFreeDevice(drmDevicePtr *device);
++
++extern int drmGetDevices(drmDevicePtr devices[], int max_devices);
++extern void drmFreeDevices(drmDevicePtr devices[], int count);
++
++#define DRM_DEVICE_GET_PCI_REVISION (1 << 0)
++extern int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device);
++extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices);
++
++extern int drmGetDeviceFromDevId(dev_t dev_id, uint32_t flags, drmDevicePtr *device);
++
++extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b);
++
++extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle);
++extern int drmSyncobjDestroy(int fd, uint32_t handle);
++extern int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd);
++extern int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle);
++
++extern int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd);
++extern int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd);
++extern int drmSyncobjWait(int fd, uint32_t *handles, unsigned num_handles,
++ int64_t timeout_nsec, unsigned flags,
++ uint32_t *first_signaled);
++extern int drmSyncobjReset(int fd, const uint32_t *handles, uint32_t handle_count);
++extern int drmSyncobjSignal(int fd, const uint32_t *handles, uint32_t handle_count);
++extern int drmSyncobjTimelineSignal(int fd, const uint32_t *handles,
++ uint64_t *points, uint32_t handle_count);
++extern int drmSyncobjTimelineWait(int fd, uint32_t *handles, uint64_t *points,
++ unsigned num_handles,
++ int64_t timeout_nsec, unsigned flags,
++ uint32_t *first_signaled);
++extern int drmSyncobjQuery(int fd, uint32_t *handles, uint64_t *points,
++ uint32_t handle_count);
++extern int drmSyncobjQuery2(int fd, uint32_t *handles, uint64_t *points,
++ uint32_t handle_count, uint32_t flags);
++extern int drmSyncobjTransfer(int fd,
++ uint32_t dst_handle, uint64_t dst_point,
++ uint32_t src_handle, uint64_t src_point,
++ uint32_t flags);
++
++extern char *
++drmGetFormatModifierVendor(uint64_t modifier);
++
++extern char *
++drmGetFormatModifierName(uint64_t modifier);
++
++#ifndef fourcc_mod_get_vendor
++#define fourcc_mod_get_vendor(modifier) \
++ (((modifier) >> 56) & 0xff)
++#endif
++
++#if defined(__cplusplus)
++}
++#endif
++
++#endif
+diff --git a/third_party/pipewire/libpipewire/moz.build b/third_party/drm/libdrm/moz.build
+similarity index 86%
+copy from third_party/pipewire/libpipewire/moz.build
+copy to third_party/drm/libdrm/moz.build
+index 3102b3cb69b7..3b37b913e8b2 100644
+--- a/third_party/pipewire/libpipewire/moz.build
++++ b/third_party/drm/libdrm/moz.build
+@@ -5,12 +5,12 @@
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+ SOURCES += [
+- 'mozpipewire.cpp',
++ 'mozdrm.cpp',
+ ]
+
+ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
+ CXXFLAGS += CONFIG['MOZ_GTK3_CFLAGS']
+
+-LOCAL_INCLUDES += ['/third_party/pipewire']
++LOCAL_INCLUDES += ['/third_party/drm']
+
+ FINAL_LIBRARY = 'xul'
+diff --git a/third_party/drm/libdrm/mozdrm.cpp b/third_party/drm/libdrm/mozdrm.cpp
+new file mode 100644
+index 000000000000..b2fb59be64a2
+--- /dev/null
++++ b/third_party/drm/libdrm/mozdrm.cpp
+@@ -0,0 +1,66 @@
++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* vim:expandtab:shiftwidth=4:tabstop=4:
++ */
++/* 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 "mozilla/Types.h"
++#include "prlink.h"
++
++#include <drm/xf86drm.h>
++
++#define GET_FUNC(func, lib) \
++ func##_fn = \
++ (decltype(func##_fn))PR_FindFunctionSymbol(lib, #func) \
++
++#define IS_FUNC_LOADED(func) \
++ (func != nullptr) \
++
++static int (*drmGetDevices2_fn)(uint32_t flags, drmDevicePtr devices[], int max_devices);
++static void (*drmFreeDevices_fn)(drmDevicePtr devices[], int count);
++
++bool IsDRMLibraryLoaded() {
++ static bool isLoaded =
++ (IS_FUNC_LOADED(drmGetDevices2_fn) &&
++ IS_FUNC_LOADED(drmFreeDevices_fn));
++
++ return isLoaded;
++}
++
++bool LoadDRMLibrary() {
++ static PRLibrary* drmLib = nullptr;
++ static bool drmInitialized = false;
++
++ //TODO Thread safe
++ if (!drmInitialized) {
++ drmInitialized = true;
++ drmLib = PR_LoadLibrary("libdrm.so.2");
++ if (!drmLib) {
++ return false;
++ }
++
++ GET_FUNC(drmGetDevices2, drmLib);
++ GET_FUNC(drmFreeDevices, drmLib);
++ }
++
++ return IsDRMLibraryLoaded();
++}
++
++int
++drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_devices)
++{
++ if (!LoadDRMLibrary()) {
++ return 0;
++ }
++ return drmGetDevices2_fn(flags, devices, max_devices);
++}
++
++void
++drmFreeDevices(drmDevicePtr devices[], int count)
++{
++ if (!LoadDRMLibrary()) {
++ return;
++ }
++ return drmFreeDevices_fn(devices, count);
++}
+diff --git a/third_party/gbm/README b/third_party/gbm/README
+new file mode 100644
+index 000000000000..4b6e2e8e02b2
+--- /dev/null
++++ b/third_party/gbm/README
+@@ -0,0 +1,4 @@
++Libgbm is a gbm library wrapper needed to build and run Firefox with
++Pipewire support on Linux (https://gitlab.freedesktop.org/mesa/gbm)
++
++libgbm directory stores headers of libgbm needed for build only.
+diff --git a/third_party/gbm/gbm/gbm.h b/third_party/gbm/gbm/gbm.h
+new file mode 100644
+index 000000000000..e28fa04aaed8
+--- /dev/null
++++ b/third_party/gbm/gbm/gbm.h
+@@ -0,0 +1,452 @@
++/*
++ * Copyright © 2011 Intel Corporation
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ *
++ * Authors:
++ * Benjamin Franzke <benjaminfranzke(a)googlemail.com>
++ */
++
++#ifndef _GBM_H_
++#define _GBM_H_
++
++#define __GBM__ 1
++
++#include <stddef.h>
++#include <stdint.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/**
++ * \file gbm.h
++ * \brief Generic Buffer Manager
++ */
++
++struct gbm_device;
++struct gbm_bo;
++struct gbm_surface;
++
++/**
++ * \mainpage The Generic Buffer Manager
++ *
++ * This module provides an abstraction that the caller can use to request a
++ * buffer from the underlying memory management system for the platform.
++ *
++ * This allows the creation of portable code whilst still allowing access to
++ * the underlying memory manager.
++ */
++
++/**
++ * Abstraction representing the handle to a buffer allocated by the
++ * manager
++ */
++union gbm_bo_handle {
++ void *ptr;
++ int32_t s32;
++ uint32_t u32;
++ int64_t s64;
++ uint64_t u64;
++};
++
++/** Format of the allocated buffer */
++enum gbm_bo_format {
++ /** RGB with 8 bits per channel in a 32 bit value */
++ GBM_BO_FORMAT_XRGB8888,
++ /** ARGB with 8 bits per channel in a 32 bit value */
++ GBM_BO_FORMAT_ARGB8888
++};
++
++
++/**
++ * The FourCC format codes are taken from the drm_fourcc.h definition, and
++ * re-namespaced. New GBM formats must not be added, unless they are
++ * identical ports from drm_fourcc.
++ */
++#define __gbm_fourcc_code(a,b,c,d) ((uint32_t)(a) | ((uint32_t)(b) << 8) | \
++ ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24))
++
++#define GBM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */
++
++/* color index */
++#define GBM_FORMAT_C8 __gbm_fourcc_code('C', '8', ' ', ' ') /* [7:0] C */
++
++/* 8 bpp Red */
++#define GBM_FORMAT_R8 __gbm_fourcc_code('R', '8', ' ', ' ') /* [7:0] R */
++
++/* 16 bpp Red */
++#define GBM_FORMAT_R16 __gbm_fourcc_code('R', '1', '6', ' ') /* [15:0] R little endian */
++
++/* 16 bpp RG */
++#define GBM_FORMAT_GR88 __gbm_fourcc_code('G', 'R', '8', '8') /* [15:0] G:R 8:8 little endian */
++
++/* 8 bpp RGB */
++#define GBM_FORMAT_RGB332 __gbm_fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */
++#define GBM_FORMAT_BGR233 __gbm_fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */
++
++/* 16 bpp RGB */
++#define GBM_FORMAT_XRGB4444 __gbm_fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */
++#define GBM_FORMAT_XBGR4444 __gbm_fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */
++#define GBM_FORMAT_RGBX4444 __gbm_fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */
++#define GBM_FORMAT_BGRX4444 __gbm_fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */
++
++#define GBM_FORMAT_ARGB4444 __gbm_fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */
++#define GBM_FORMAT_ABGR4444 __gbm_fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */
++#define GBM_FORMAT_RGBA4444 __gbm_fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */
++#define GBM_FORMAT_BGRA4444 __gbm_fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */
++
++#define GBM_FORMAT_XRGB1555 __gbm_fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */
++#define GBM_FORMAT_XBGR1555 __gbm_fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */
++#define GBM_FORMAT_RGBX5551 __gbm_fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */
++#define GBM_FORMAT_BGRX5551 __gbm_fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */
++
++#define GBM_FORMAT_ARGB1555 __gbm_fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */
++#define GBM_FORMAT_ABGR1555 __gbm_fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */
++#define GBM_FORMAT_RGBA5551 __gbm_fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */
++#define GBM_FORMAT_BGRA5551 __gbm_fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */
++
++#define GBM_FORMAT_RGB565 __gbm_fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */
++#define GBM_FORMAT_BGR565 __gbm_fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */
++
++/* 24 bpp RGB */
++#define GBM_FORMAT_RGB888 __gbm_fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */
++#define GBM_FORMAT_BGR888 __gbm_fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */
++
++/* 32 bpp RGB */
++#define GBM_FORMAT_XRGB8888 __gbm_fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */
++#define GBM_FORMAT_XBGR8888 __gbm_fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */
++#define GBM_FORMAT_RGBX8888 __gbm_fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */
++#define GBM_FORMAT_BGRX8888 __gbm_fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */
++
++#define GBM_FORMAT_ARGB8888 __gbm_fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */
++#define GBM_FORMAT_ABGR8888 __gbm_fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */
++#define GBM_FORMAT_RGBA8888 __gbm_fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */
++#define GBM_FORMAT_BGRA8888 __gbm_fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */
++
++#define GBM_FORMAT_XRGB2101010 __gbm_fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */
++#define GBM_FORMAT_XBGR2101010 __gbm_fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */
++#define GBM_FORMAT_RGBX1010102 __gbm_fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */
++#define GBM_FORMAT_BGRX1010102 __gbm_fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */
++
++#define GBM_FORMAT_ARGB2101010 __gbm_fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */
++#define GBM_FORMAT_ABGR2101010 __gbm_fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */
++#define GBM_FORMAT_RGBA1010102 __gbm_fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */
++#define GBM_FORMAT_BGRA1010102 __gbm_fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */
++
++/*
++ * Floating point 64bpp RGB
++ * IEEE 754-2008 binary16 half-precision float
++ * [15:0] sign:exponent:mantissa 1:5:10
++ */
++#define GBM_FORMAT_XBGR16161616F __gbm_fourcc_code('X', 'B', '4', 'H') /* [63:0] x:B:G:R 16:16:16:16 little endian */
++
++#define GBM_FORMAT_ABGR16161616F __gbm_fourcc_code('A', 'B', '4', 'H') /* [63:0] A:B:G:R 16:16:16:16 little endian */
++
++/* packed YCbCr */
++#define GBM_FORMAT_YUYV __gbm_fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */
++#define GBM_FORMAT_YVYU __gbm_fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */
++#define GBM_FORMAT_UYVY __gbm_fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */
++#define GBM_FORMAT_VYUY __gbm_fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
++
++#define GBM_FORMAT_AYUV __gbm_fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
++
++/*
++ * 2 plane YCbCr
++ * index 0 = Y plane, [7:0] Y
++ * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian
++ * or
++ * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian
++ */
++#define GBM_FORMAT_NV12 __gbm_fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */
++#define GBM_FORMAT_NV21 __gbm_fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */
++#define GBM_FORMAT_NV16 __gbm_fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */
++#define GBM_FORMAT_NV61 __gbm_fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */
++
++/*
++ * 3 plane YCbCr
++ * index 0: Y plane, [7:0] Y
++ * index 1: Cb plane, [7:0] Cb
++ * index 2: Cr plane, [7:0] Cr
++ * or
++ * index 1: Cr plane, [7:0] Cr
++ * index 2: Cb plane, [7:0] Cb
++ */
++#define GBM_FORMAT_YUV410 __gbm_fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */
++#define GBM_FORMAT_YVU410 __gbm_fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */
++#define GBM_FORMAT_YUV411 __gbm_fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */
++#define GBM_FORMAT_YVU411 __gbm_fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */
++#define GBM_FORMAT_YUV420 __gbm_fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */
++#define GBM_FORMAT_YVU420 __gbm_fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */
++#define GBM_FORMAT_YUV422 __gbm_fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */
++#define GBM_FORMAT_YVU422 __gbm_fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */
++#define GBM_FORMAT_YUV444 __gbm_fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
++#define GBM_FORMAT_YVU444 __gbm_fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
++
++struct gbm_format_name_desc {
++ char name[5];
++};
++
++/**
++ * Flags to indicate the intended use for the buffer - these are passed into
++ * gbm_bo_create(). The caller must set the union of all the flags that are
++ * appropriate
++ *
++ * \sa Use gbm_device_is_format_supported() to check if the combination of format
++ * and use flags are supported
++ */
++enum gbm_bo_flags {
++ /**
++ * Buffer is going to be presented to the screen using an API such as KMS
++ */
++ GBM_BO_USE_SCANOUT = (1 << 0),
++ /**
++ * Buffer is going to be used as cursor
++ */
++ GBM_BO_USE_CURSOR = (1 << 1),
++ /**
++ * Deprecated
++ */
++ GBM_BO_USE_CURSOR_64X64 = GBM_BO_USE_CURSOR,
++ /**
++ * Buffer is to be used for rendering - for example it is going to be used
++ * as the storage for a color buffer
++ */
++ GBM_BO_USE_RENDERING = (1 << 2),
++ /**
++ * Buffer can be used for gbm_bo_write. This is guaranteed to work
++ * with GBM_BO_USE_CURSOR, but may not work for other combinations.
++ */
++ GBM_BO_USE_WRITE = (1 << 3),
++ /**
++ * Buffer is linear, i.e. not tiled.
++ */
++ GBM_BO_USE_LINEAR = (1 << 4),
++ /**
++ * Buffer is protected, i.e. encrypted and not readable by CPU or any
++ * other non-secure / non-trusted components nor by non-trusted OpenGL,
++ * OpenCL, and Vulkan applications.
++ */
++ GBM_BO_USE_PROTECTED = (1 << 5),
++};
++
++int
++gbm_device_get_fd(struct gbm_device *gbm);
++
++const char *
++gbm_device_get_backend_name(struct gbm_device *gbm);
++
++int
++gbm_device_is_format_supported(struct gbm_device *gbm,
++ uint32_t format, uint32_t flags);
++
++int
++gbm_device_get_format_modifier_plane_count(struct gbm_device *gbm,
++ uint32_t format,
++ uint64_t modifier);
++
++void
++gbm_device_destroy(struct gbm_device *gbm);
++
++struct gbm_device *
++gbm_create_device(int fd);
++
++struct gbm_bo *
++gbm_bo_create(struct gbm_device *gbm,
++ uint32_t width, uint32_t height,
++ uint32_t format, uint32_t flags);
++
++struct gbm_bo *
++gbm_bo_create_with_modifiers(struct gbm_device *gbm,
++ uint32_t width, uint32_t height,
++ uint32_t format,
++ const uint64_t *modifiers,
++ const unsigned int count);
++
++struct gbm_bo *
++gbm_bo_create_with_modifiers2(struct gbm_device *gbm,
++ uint32_t width, uint32_t height,
++ uint32_t format,
++ const uint64_t *modifiers,
++ const unsigned int count,
++ uint32_t flags);
++
++#define GBM_BO_IMPORT_WL_BUFFER 0x5501
++#define GBM_BO_IMPORT_EGL_IMAGE 0x5502
++#define GBM_BO_IMPORT_FD 0x5503
++#define GBM_BO_IMPORT_FD_MODIFIER 0x5504
++
++struct gbm_import_fd_data {
++ int fd;
++ uint32_t width;
++ uint32_t height;
++ uint32_t stride;
++ uint32_t format;
++};
++
++#define GBM_MAX_PLANES 4
++
++struct gbm_import_fd_modifier_data {
++ uint32_t width;
++ uint32_t height;
++ uint32_t format;
++ uint32_t num_fds;
++ int fds[GBM_MAX_PLANES];
++ int strides[GBM_MAX_PLANES];
++ int offsets[GBM_MAX_PLANES];
++ uint64_t modifier;
++};
++
++struct gbm_bo *
++gbm_bo_import(struct gbm_device *gbm, uint32_t type,
++ void *buffer, uint32_t flags);
++
++/**
++ * Flags to indicate the type of mapping for the buffer - these are
++ * passed into gbm_bo_map(). The caller must set the union of all the
++ * flags that are appropriate.
++ *
++ * These flags are independent of the GBM_BO_USE_* creation flags. However,
++ * mapping the buffer may require copying to/from a staging buffer.
++ *
++ * See also: pipe_map_flags
++ */
++enum gbm_bo_transfer_flags {
++ /**
++ * Buffer contents read back (or accessed directly) at transfer
++ * create time.
++ */
++ GBM_BO_TRANSFER_READ = (1 << 0),
++ /**
++ * Buffer contents will be written back at unmap time
++ * (or modified as a result of being accessed directly).
++ */
++ GBM_BO_TRANSFER_WRITE = (1 << 1),
++ /**
++ * Read/modify/write
++ */
++ GBM_BO_TRANSFER_READ_WRITE = (GBM_BO_TRANSFER_READ | GBM_BO_TRANSFER_WRITE),
++};
++
++void *
++gbm_bo_map(struct gbm_bo *bo,
++ uint32_t x, uint32_t y, uint32_t width, uint32_t height,
++ uint32_t flags, uint32_t *stride, void **map_data);
++
++void
++gbm_bo_unmap(struct gbm_bo *bo, void *map_data);
++
++uint32_t
++gbm_bo_get_width(struct gbm_bo *bo);
++
++uint32_t
++gbm_bo_get_height(struct gbm_bo *bo);
++
++uint32_t
++gbm_bo_get_stride(struct gbm_bo *bo);
++
++uint32_t
++gbm_bo_get_stride_for_plane(struct gbm_bo *bo, int plane);
++
++uint32_t
++gbm_bo_get_format(struct gbm_bo *bo);
++
++uint32_t
++gbm_bo_get_bpp(struct gbm_bo *bo);
++
++uint32_t
++gbm_bo_get_offset(struct gbm_bo *bo, int plane);
++
++struct gbm_device *
++gbm_bo_get_device(struct gbm_bo *bo);
++
++union gbm_bo_handle
++gbm_bo_get_handle(struct gbm_bo *bo);
++
++int
++gbm_bo_get_fd(struct gbm_bo *bo);
++
++uint64_t
++gbm_bo_get_modifier(struct gbm_bo *bo);
++
++int
++gbm_bo_get_plane_count(struct gbm_bo *bo);
++
++union gbm_bo_handle
++gbm_bo_get_handle_for_plane(struct gbm_bo *bo, int plane);
++
++int
++gbm_bo_get_fd_for_plane(struct gbm_bo *bo, int plane);
++
++int
++gbm_bo_write(struct gbm_bo *bo, const void *buf, size_t count);
++
++void
++gbm_bo_set_user_data(struct gbm_bo *bo, void *data,
++ void (*destroy_user_data)(struct gbm_bo *, void *));
++
++void *
++gbm_bo_get_user_data(struct gbm_bo *bo);
++
++void
++gbm_bo_destroy(struct gbm_bo *bo);
++
++struct gbm_surface *
++gbm_surface_create(struct gbm_device *gbm,
++ uint32_t width, uint32_t height,
++ uint32_t format, uint32_t flags);
++
++struct gbm_surface *
++gbm_surface_create_with_modifiers(struct gbm_device *gbm,
++ uint32_t width, uint32_t height,
++ uint32_t format,
++ const uint64_t *modifiers,
++ const unsigned int count);
++
++struct gbm_surface *
++gbm_surface_create_with_modifiers2(struct gbm_device *gbm,
++ uint32_t width, uint32_t height,
++ uint32_t format,
++ const uint64_t *modifiers,
++ const unsigned int count,
++ uint32_t flags);
++
++struct gbm_bo *
++gbm_surface_lock_front_buffer(struct gbm_surface *surface);
++
++void
++gbm_surface_release_buffer(struct gbm_surface *surface, struct gbm_bo *bo);
++
++int
++gbm_surface_has_free_buffers(struct gbm_surface *surface);
++
++void
++gbm_surface_destroy(struct gbm_surface *surface);
++
++char *
++gbm_format_get_name(uint32_t gbm_format, struct gbm_format_name_desc *desc);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/third_party/pipewire/libpipewire/moz.build b/third_party/gbm/libgbm/moz.build
+similarity index 86%
+copy from third_party/pipewire/libpipewire/moz.build
+copy to third_party/gbm/libgbm/moz.build
+index 3102b3cb69b7..0953d2f17a54 100644
+--- a/third_party/pipewire/libpipewire/moz.build
++++ b/third_party/gbm/libgbm/moz.build
+@@ -5,12 +5,12 @@
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+ SOURCES += [
+- 'mozpipewire.cpp',
++ 'mozgbm.cpp',
+ ]
+
+ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
+ CXXFLAGS += CONFIG['MOZ_GTK3_CFLAGS']
+
+-LOCAL_INCLUDES += ['/third_party/pipewire']
++LOCAL_INCLUDES += ['/third_party/gbm']
+
+ FINAL_LIBRARY = 'xul'
+diff --git a/third_party/gbm/libgbm/mozgbm.cpp b/third_party/gbm/libgbm/mozgbm.cpp
+new file mode 100644
+index 000000000000..bc024a11c0b7
+--- /dev/null
++++ b/third_party/gbm/libgbm/mozgbm.cpp
+@@ -0,0 +1,66 @@
++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
++/* vim:expandtab:shiftwidth=4:tabstop=4:
++ */
++/* 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 "mozilla/Types.h"
++#include "prlink.h"
++
++#include <gbm/gbm.h>
++
++#define GET_FUNC(func, lib) \
++ func##_fn = \
++ (decltype(func##_fn))PR_FindFunctionSymbol(lib, #func) \
++
++#define IS_FUNC_LOADED(func) \
++ (func != nullptr) \
++
++static struct gbm_device * (*gbm_create_device_fn)(int fd);
++static void (*gbm_device_destroy_fn)(struct gbm_device* gbm);
++
++bool IsGBMLibraryLoaded() {
++ static bool isLoaded =
++ (IS_FUNC_LOADED(gbm_create_device_fn) &&
++ IS_FUNC_LOADED(gbm_device_destroy_fn));
++
++ return isLoaded;
++}
++
++bool LoadGBMLibrary() {
++ static PRLibrary* gbmLib = nullptr;
++ static bool gbmInitialized = false;
++
++ //TODO Thread safe
++ if (!gbmInitialized) {
++ gbmInitialized = true;
++ gbmLib = PR_LoadLibrary("libgbm.so.1");
++ if (!gbmLib) {
++ return false;
++ }
++
++ GET_FUNC(gbm_create_device, gbmLib);
++ GET_FUNC(gbm_device_destroy, gbmLib);
++ }
++
++ return IsGBMLibraryLoaded();
++}
++
++struct gbm_device *
++gbm_create_device(int fd)
++{
++ if (!LoadGBMLibrary()) {
++ return nullptr;
++ }
++ return gbm_create_device_fn(fd);
++}
++
++void
++gbm_device_destroy(struct gbm_device* gbm)
++{
++ if (!LoadGBMLibrary()) {
++ return;
++ }
++ return gbm_device_destroy_fn(gbm);
++}
+diff --git a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build
+index 8631744ab1bf..366ea67aa9ab 100644
+--- a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build
++++ b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build
+@@ -8,25 +8,28 @@
+ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
+ CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"]
+
+-COMPILE_FLAGS["OS_INCLUDES"] = []
++# FIXME: No idea why it doesn't pick libdrm from /third_party/drm
++COMPILE_FLAGS["OS_INCLUDES"] = [ "-I/usr/include/libdrm" ]
+ AllowCompilerWarnings()
+
+ DEFINES["ABSL_ALLOCATOR_NOTHROW"] = "1"
+ DEFINES["RTC_DAV1D_IN_INTERNAL_DECODER_FACTORY"] = True
+ DEFINES["RTC_ENABLE_VP9"] = True
+ DEFINES["WEBRTC_ENABLE_PROTOBUF"] = "0"
+ DEFINES["WEBRTC_LIBRARY_IMPL"] = True
+ DEFINES["WEBRTC_MOZILLA_BUILD"] = True
+ DEFINES["WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS"] = "0"
+
+ FINAL_LIBRARY = "webrtc"
+
+
+ LOCAL_INCLUDES += [
+ "!/ipc/ipdl/_ipdlheaders",
+ "/ipc/chromium/src",
+ "/media/libyuv/",
+ "/media/libyuv/libyuv/include/",
++ "/third_party/drm/",
++ "/third_party/gbm/",
+ "/third_party/libwebrtc/",
+ "/third_party/libwebrtc/third_party/abseil-cpp/",
+ "/third_party/pipewire/",
+@@ -242,7 +245,16 @@ if CONFIG["CPU_ARCH"] == "arm":
+ DEFINES["_GNU_SOURCE"] = True
+
+ SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/moz_base_capturer_pipewire.cc"
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/mouse_cursor_monitor_pipewire.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/restore_token_manager.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/scoped_glib.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/xdg_desktop_portal_utils.cc"
+ ]
+
+ if CONFIG["CPU_ARCH"] == "ppc64":
+@@ -297,27 +309,53 @@ if CONFIG["CPU_ARCH"] == "aarch64" and CONFIG["OS_TARGET"] == "Linux":
+ DEFINES["_GNU_SOURCE"] = True
+
+ SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/moz_base_capturer_pipewire.cc"
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/mouse_cursor_monitor_pipewire.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/restore_token_manager.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/xdg_desktop_portal_utils.cc"
+ ]
+
+ if CONFIG["CPU_ARCH"] == "x86" and CONFIG["OS_TARGET"] == "Linux":
+
+ DEFINES["WEBRTC_ENABLE_AVX2"] = True
+ DEFINES["WEBRTC_USE_PIPEWIRE"] = True
+ DEFINES["_GNU_SOURCE"] = True
+
+ SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/moz_base_capturer_pipewire.cc"
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/mouse_cursor_monitor_pipewire.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/restore_token_manager.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/scoped_glib.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/xdg_desktop_portal_utils.cc"
+ ]
+
+ if CONFIG["CPU_ARCH"] == "x86_64" and CONFIG["OS_TARGET"] == "Linux":
+
+ DEFINES["WEBRTC_ENABLE_AVX2"] = True
+ DEFINES["WEBRTC_USE_PIPEWIRE"] = True
+ DEFINES["_GNU_SOURCE"] = True
+
+ SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/moz_base_capturer_pipewire.cc"
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/mouse_cursor_monitor_pipewire.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/restore_token_manager.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/scoped_glib.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc",
++ "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/xdg_desktop_portal_utils.cc"
+ ]
+
+ if CONFIG["CPU_ARCH"] == "aarch64" and CONFIG["MOZ_X11"] == "1" and CONFIG["OS_TARGET"] == "Linux":
+diff --git a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc
+index 767dbfefa543..22c59ef4cccd 100644
+--- a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc
++++ b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.cc
+@@ -17,31 +17,31 @@
+ #elif defined(WEBRTC_WIN)
+ #include "modules/desktop_capture/win/full_screen_win_application_handler.h"
+ #endif
+-#if defined(WEBRTC_USE_PIPEWIRE) && !defined(WEBRTC_MOZILLA_BUILD)
++#if defined(WEBRTC_USE_PIPEWIRE)
+ #include "modules/desktop_capture/linux/wayland/shared_screencast_stream.h"
+ #endif
+
+ namespace webrtc {
+
+ DesktopCaptureOptions::DesktopCaptureOptions() {}
+ DesktopCaptureOptions::DesktopCaptureOptions(
+ const DesktopCaptureOptions& options) = default;
+ DesktopCaptureOptions::DesktopCaptureOptions(DesktopCaptureOptions&& options) =
+ default;
+ DesktopCaptureOptions::~DesktopCaptureOptions() {}
+
+ DesktopCaptureOptions& DesktopCaptureOptions::operator=(
+ const DesktopCaptureOptions& options) = default;
+ DesktopCaptureOptions& DesktopCaptureOptions::operator=(
+ DesktopCaptureOptions&& options) = default;
+
+ // static
+ DesktopCaptureOptions DesktopCaptureOptions::CreateDefault() {
+ DesktopCaptureOptions result;
+ #if defined(WEBRTC_USE_X11)
+ result.set_x_display(SharedXDisplay::CreateDefault());
+ #endif
+-#if defined(WEBRTC_USE_PIPEWIRE) && !defined(WEBRTC_MOZILLA_BUILD)
++#if defined(WEBRTC_USE_PIPEWIRE)
+ result.set_screencast_stream(SharedScreenCastStream::CreateDefault());
+ #endif
+ #if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
+diff --git a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h
+index c11efdb615d0..4ee5259bb41a 100644
+--- a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h
++++ b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_options.h
+@@ -17,7 +17,7 @@
+ #include "modules/desktop_capture/linux/x11/shared_x_display.h"
+ #endif
+
+-#if defined(WEBRTC_USE_PIPEWIRE) && !defined(WEBRTC_MOZILLA_BUILD)
++#if defined(WEBRTC_USE_PIPEWIRE)
+ #include "modules/desktop_capture/linux/wayland/shared_screencast_stream.h"
+ #endif
+
+@@ -181,28 +181,26 @@ class RTC_EXPORT DesktopCaptureOptions {
+ bool allow_pipewire() const { return allow_pipewire_; }
+ void set_allow_pipewire(bool allow) { allow_pipewire_ = allow; }
+
+-#if !defined(WEBRTC_MOZILLA_BUILD)
+ const rtc::scoped_refptr<SharedScreenCastStream>& screencast_stream() const {
+ return screencast_stream_;
+ }
+ void set_screencast_stream(
+ rtc::scoped_refptr<SharedScreenCastStream> stream) {
+ screencast_stream_ = stream;
+ }
+
+ void set_width(uint32_t width) { width_ = width; }
+ uint32_t get_width() const { return width_; }
+
+ void set_height(uint32_t height) { height_ = height; }
+ uint32_t get_height() const { return height_; }
+-#endif
+ #endif
+
+ private:
+ #if defined(WEBRTC_USE_X11)
+ rtc::scoped_refptr<SharedXDisplay> x_display_;
+ #endif
+-#if defined(WEBRTC_USE_PIPEWIRE) && !defined(WEBRTC_MOZILLA_BUILD)
++#if defined(WEBRTC_USE_PIPEWIRE)
+ // An instance of shared PipeWire ScreenCast stream we share between
+ // BaseCapturerPipeWire and MouseCursorMonitorPipeWire as cursor information
+ // is sent together with screen content.
+diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
+index e9158bf0cccf..655ec50ce9d7 100644
+--- a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
++++ b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
+@@ -136,7 +136,7 @@ bool BaseCapturerPipeWire::GetSourceList(SourceList* sources) {
+ // is often treated as a null/placeholder id, so we shouldn't use that.
+ // TODO(https://crbug.com/1297671): Reconsider type of ID when plumbing
+ // token that will enable stream re-use.
+- sources->push_back({source_id_});
++ sources->push_back({PIPEWIRE_ID, 0, PIPEWIRE_NAME});
+ return true;
+ }
+
+diff --git a/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc b/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc
+index d9f27951302d..18840cc6d7ef 100644
+--- a/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc
++++ b/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc
+@@ -14,29 +14,21 @@
+ #include "modules/desktop_capture/desktop_capturer.h"
+
+ #if defined(WEBRTC_USE_PIPEWIRE)
+-#if defined(WEBRTC_MOZILLA_BUILD)
+-#include "modules/desktop_capture/linux/wayland/moz_base_capturer_pipewire.h"
+-#else
+ #include "modules/desktop_capture/linux/wayland/base_capturer_pipewire.h"
+-#endif
+ #endif // defined(WEBRTC_USE_PIPEWIRE)
+
+ #if defined(WEBRTC_USE_X11)
+ #include "modules/desktop_capture/linux/x11/screen_capturer_x11.h"
+ #endif // defined(WEBRTC_USE_X11)
+
+ namespace webrtc {
+
+ // static
+ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
+ const DesktopCaptureOptions& options) {
+ #if defined(WEBRTC_USE_PIPEWIRE)
+ if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) {
+-#if defined(WEBRTC_MOZILLA_BUILD)
+- return BaseCapturerPipeWire::CreateRawCapturer(options);
+-#else
+ return std::make_unique<BaseCapturerPipeWire>(options);
+-#endif
+ }
+ #endif // defined(WEBRTC_USE_PIPEWIRE)
+
+diff --git a/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc b/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc
+index b2b1e376ada5..638c42ae3963 100644
+--- a/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc
++++ b/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc
+@@ -14,29 +14,21 @@
+ #include "modules/desktop_capture/desktop_capturer.h"
+
+ #if defined(WEBRTC_USE_PIPEWIRE)
+-#if defined(WEBRTC_MOZILLA_BUILD)
+-#include "modules/desktop_capture/linux/wayland/moz_base_capturer_pipewire.h"
+-#else
+ #include "modules/desktop_capture/linux/wayland/base_capturer_pipewire.h"
+-#endif
+ #endif // defined(WEBRTC_USE_PIPEWIRE)
+
+ #if defined(WEBRTC_USE_X11)
+ #include "modules/desktop_capture/linux/x11/window_capturer_x11.h"
+ #endif // defined(WEBRTC_USE_X11)
+
+ namespace webrtc {
+
+ // static
+ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
+ const DesktopCaptureOptions& options) {
+ #if defined(WEBRTC_USE_PIPEWIRE)
+ if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) {
+-#if defined(WEBRTC_MOZILLA_BUILD)
+- return BaseCapturerPipeWire::CreateRawCapturer(options);
+-#else
+ return std::make_unique<BaseCapturerPipeWire>(options);
+-#endif
+ }
+ #endif // defined(WEBRTC_USE_PIPEWIRE)
+
+diff --git a/third_party/moz.build b/third_party/moz.build
+index 19ee0224b041..fab8f23c624f 100644
+--- a/third_party/moz.build
++++ b/third_party/moz.build
+@@ -61,6 +61,12 @@ with Files("libwebrtc/**"):
+ with Files("pipewire/**"):
+ BUG_COMPONENT = ("Core", "WebRTC")
+
++with Files("drm/**"):
++ BUG_COMPONENT = ("Core", "WebRTC")
++
++with Files("gbm/**"):
++ BUG_COMPONENT = ("Core", "WebRTC")
++
+ with Files('rlbox_wasm2c_sandbox/**'):
+ BUG_COMPONENT = ('Firefox Build System', 'General')
+
+diff --git a/third_party/pipewire/libpipewire/mozpipewire.cpp b/third_party/pipewire/libpipewire/mozpipewire.cpp
+index 1ecfc3196af1..380c5b2c8582 100644
+--- a/third_party/pipewire/libpipewire/mozpipewire.cpp
++++ b/third_party/pipewire/libpipewire/mozpipewire.cpp
+@@ -69,86 +69,99 @@ static int (*pw_stream_connect_fn)(struct pw_stream *stream,
+ enum pw_stream_flags flags,
+ const struct spa_pod **params,
+ uint32_t n_params);
++static int (*pw_stream_disconnect_fn)(struct pw_stream *stream);
+ static struct pw_buffer* (*pw_stream_dequeue_buffer_fn)(struct pw_stream *stream);
+ static void (*pw_stream_destroy_fn)(struct pw_stream *stream);
+ static struct pw_stream* (*pw_stream_new_fn)(struct pw_core *core,
+ const char *name,
+ struct pw_properties *props);
++
+ static int (*pw_stream_queue_buffer_fn)(struct pw_stream *stream,
+ struct pw_buffer *buffer);
+ static int (*pw_stream_update_params_fn)(struct pw_stream *stream,
+ const struct spa_pod **params,
+ uint32_t n_params);
+ static void (*pw_thread_loop_destroy_fn)(struct pw_thread_loop *loop);
+ static struct pw_loop* (*pw_thread_loop_get_loop_fn)(struct pw_thread_loop *loop);
+ static struct pw_thread_loop* (*pw_thread_loop_new_fn)(const char *name,
+ const struct spa_dict *props);
+ static int (*pw_thread_loop_start_fn)(struct pw_thread_loop *loop);
+ static void (*pw_thread_loop_stop_fn)(struct pw_thread_loop *loop);
+ static void (*pw_thread_loop_lock_fn)(struct pw_thread_loop *loop);
+ static void (*pw_thread_loop_unlock_fn)(struct pw_thread_loop *loop);
++static void (*pw_thread_loop_wait_fn)(struct pw_thread_loop *loop);
++static void (*pw_thread_loop_signal_fn)(struct pw_thread_loop *loop, bool wait_for_accept);
+ static struct pw_properties* (*pw_properties_new_string_fn)(const char *str);
++static const char* (*pw_get_library_version_fn)();
+
+ bool IsPwLibraryLoaded() {
+ static bool isLoaded =
+ (IS_FUNC_LOADED(pw_context_connect_fn) &&
+ IS_FUNC_LOADED(pw_context_connect_fd_fn) &&
+ IS_FUNC_LOADED(pw_context_destroy_fn) &&
+ IS_FUNC_LOADED(pw_context_new_fn) &&
+ IS_FUNC_LOADED(pw_core_disconnect_fn) &&
+ IS_FUNC_LOADED(pw_init_fn) &&
+ IS_FUNC_LOADED(pw_stream_add_listener_fn) &&
+ IS_FUNC_LOADED(pw_stream_connect_fn) &&
++ IS_FUNC_LOADED(pw_stream_disconnect_fn) &&
+ IS_FUNC_LOADED(pw_stream_dequeue_buffer_fn) &&
+ IS_FUNC_LOADED(pw_stream_destroy_fn) &&
+ IS_FUNC_LOADED(pw_stream_new_fn) &&
+ IS_FUNC_LOADED(pw_stream_queue_buffer_fn) &&
+ IS_FUNC_LOADED(pw_stream_update_params_fn) &&
+ IS_FUNC_LOADED(pw_thread_loop_destroy_fn) &&
+ IS_FUNC_LOADED(pw_thread_loop_get_loop_fn) &&
+ IS_FUNC_LOADED(pw_thread_loop_new_fn) &&
+ IS_FUNC_LOADED(pw_thread_loop_start_fn) &&
+ IS_FUNC_LOADED(pw_thread_loop_stop_fn) &&
+ IS_FUNC_LOADED(pw_thread_loop_lock_fn) &&
+ IS_FUNC_LOADED(pw_thread_loop_unlock_fn) &&
+- IS_FUNC_LOADED(pw_properties_new_string_fn));
++ IS_FUNC_LOADED(pw_thread_loop_signal_fn) &&
++ IS_FUNC_LOADED(pw_thread_loop_wait_fn) &&
++ IS_FUNC_LOADED(pw_properties_new_string_fn) &&
++ IS_FUNC_LOADED(pw_get_library_version_fn));
+
+ return isLoaded;
+ }
+
+ bool LoadPWLibrary() {
+ static PRLibrary* pwLib = nullptr;
+ static bool pwInitialized = false;
+
+ //TODO Thread safe
+ if (!pwInitialized) {
+ pwInitialized = true;
+ pwLib = PR_LoadLibrary("libpipewire-0.3.so.0");
+ if (!pwLib) {
+ return false;
+ }
+
+ GET_FUNC(pw_context_connect, pwLib);
+ GET_FUNC(pw_context_connect_fd, pwLib);
+ GET_FUNC(pw_context_destroy, pwLib);
+ GET_FUNC(pw_context_new, pwLib);
+ GET_FUNC(pw_core_disconnect, pwLib);
+ GET_FUNC(pw_init, pwLib);
+ GET_FUNC(pw_stream_add_listener, pwLib);
+ GET_FUNC(pw_stream_connect, pwLib);
++ GET_FUNC(pw_stream_disconnect, pwLib);
+ GET_FUNC(pw_stream_dequeue_buffer, pwLib);
+ GET_FUNC(pw_stream_destroy, pwLib);
+ GET_FUNC(pw_stream_new, pwLib);
+ GET_FUNC(pw_stream_queue_buffer, pwLib);
+ GET_FUNC(pw_stream_update_params, pwLib);
+ GET_FUNC(pw_thread_loop_destroy, pwLib);
+ GET_FUNC(pw_thread_loop_get_loop, pwLib);
+ GET_FUNC(pw_thread_loop_new, pwLib);
+ GET_FUNC(pw_thread_loop_start, pwLib);
+ GET_FUNC(pw_thread_loop_stop, pwLib);
+ GET_FUNC(pw_thread_loop_lock, pwLib);
+ GET_FUNC(pw_thread_loop_unlock, pwLib);
++ GET_FUNC(pw_thread_loop_signal, pwLib);
++ GET_FUNC(pw_thread_loop_wait, pwLib);
+ GET_FUNC(pw_properties_new_string, pwLib);
++ GET_FUNC(pw_get_library_version, pwLib);
+ }
+
+ return IsPwLibraryLoaded();
+@@ -242,6 +255,15 @@ pw_stream_connect(struct pw_stream *stream,
+ params, n_params);
+ }
+
++int
++pw_stream_disconnect(struct pw_stream *stream)
++{
++ if (!LoadPWLibrary()) {
++ return 0;
++ }
++ return pw_stream_disconnect_fn(stream);
++}
++
+ struct pw_buffer *
+ pw_stream_dequeue_buffer(struct pw_stream *stream)
+ {
+@@ -356,13 +378,38 @@ pw_thread_loop_unlock(struct pw_thread_loop *loop)
+ return pw_thread_loop_unlock_fn(loop);
+ }
+
++void
++pw_thread_loop_signal(struct pw_thread_loop *loop, bool wait_for_accept)
++{
++ if (!LoadPWLibrary()) {
++ return;
++ }
++ return pw_thread_loop_signal_fn(loop, wait_for_accept);
++}
++
++void
++pw_thread_loop_wait(struct pw_thread_loop *loop)
++{
++ if (!LoadPWLibrary()) {
++ return;
++ }
++ return pw_thread_loop_wait_fn(loop);
++}
+
+ struct pw_properties *
+ pw_properties_new_string(const char *str)
+ {
+ if (!LoadPWLibrary()) {
+ return nullptr;
+ }
+ return pw_properties_new_string_fn(str);
+ }
+
++const char*
++pw_get_library_version()
++{
++ if (!LoadPWLibrary()) {
++ return nullptr;
++ }
++ return pw_get_library_version_fn();
++}
diff --git a/firefox/0002-Bug-1819374-Squashed-ffmpeg-6.0-update.patch b/firefox/0002-Bug-1819374-Squashed-ffmpeg-6.0-update.patch
new file mode 100644
index 000000000..e85ea0d6d
--- /dev/null
+++ b/firefox/0002-Bug-1819374-Squashed-ffmpeg-6.0-update.patch
@@ -0,0 +1,18927 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: "Jan Alexander Steffens (heftig)" <heftig(a)archlinux.org>
+Date: Mon, 6 Mar 2023 21:35:36 -0500
+Subject: [PATCH] Bug 1819374 - Squashed ffmpeg 6.0 update
+
+Contains the following changes:
+
+- Update media/ffvpx/changes.patch so that it applies cleanly to current ffmpeg master. r=alwu
+
+ Differential Revision: https://phabricator.services.mozilla.com/D171244
+
+- Update ffmpeg to current master, revert codec, bsf and parser list to ffvpx's subset, reapply in-tree patch. r=alwu
+
+ This is an rsync of the source tree, and an `hg revert`:
+
+ - `libavcodec/codec_list.c`
+ - `libavcodec/bsf_list.c`
+ - `libavcodec/parser_list.c`
+
+ Differential Revision: https://phabricator.services.mozilla.com/D171245
+
+- Update symbol list file for ffmpeg 6.0. r=alwu
+
+ Differential Revision: https://phabricator.services.mozilla.com/D171246
+
+- Vendor ffmpeg 6.0 headers, adjust the runtime linker bits. r=alwu
+
+ Differential Revision: https://phabricator.services.mozilla.com/D171248
+
+- Improve documentation about ffmpeg vendoring, adding information about header vendoring. r=alwu
+
+ Differential Revision: https://phabricator.services.mozilla.com/D171249
+---
+ .../platforms/ffmpeg/FFmpegLibWrapper.cpp | 80 +-
+ .../platforms/ffmpeg/FFmpegRuntimeLinker.cpp | 5 +
+ .../include/COPYING.LGPLv2.1 | 0
+ .../ffmpeg60/include/libavcodec/avcodec.h | 3230 +++++++++++++++++
+ .../ffmpeg60/include/libavcodec/avdct.h | 85 +
+ .../include/libavcodec/avfft.h | 0
+ .../ffmpeg/ffmpeg60/include/libavcodec/bsf.h | 335 ++
+ .../ffmpeg60/include}/libavcodec/codec.h | 300 +-
+ .../include/libavcodec/codec_desc.h | 0
+ .../ffmpeg60/include/libavcodec/codec_id.h | 669 ++++
+ .../ffmpeg60/include/libavcodec/codec_par.h | 247 ++
+ .../ffmpeg/ffmpeg60/include/libavcodec/defs.h | 203 ++
+ .../ffmpeg60/include/libavcodec/packet.h | 730 ++++
+ .../ffmpeg60/include/libavcodec/vdpau.h | 156 +
+ .../ffmpeg60/include}/libavcodec/version.h | 20 +-
+ .../include}/libavcodec/version_major.h | 29 +-
+ .../ffmpeg60/include/libavutil/attributes.h | 173 +
+ .../include/libavutil/avconfig.h | 0
+ .../ffmpeg60/include/libavutil/avutil.h | 371 ++
+ .../include/libavutil/buffer.h | 0
+ .../include/libavutil/channel_layout.h | 842 +++++
+ .../ffmpeg60/include/libavutil/common.h | 589 +++
+ .../ffmpeg/ffmpeg60/include/libavutil/cpu.h | 150 +
+ .../ffmpeg/ffmpeg60/include/libavutil/dict.h | 259 ++
+ .../include/libavutil/error.h | 0
+ .../ffmpeg/ffmpeg60/include/libavutil/frame.h | 960 +++++
+ .../ffmpeg60/include/libavutil/hwcontext.h | 606 ++++
+ .../include/libavutil/hwcontext_vaapi.h | 0
+ .../include/libavutil/intfloat.h | 0
+ .../ffmpeg/ffmpeg60/include/libavutil/log.h | 388 ++
+ .../include/libavutil/macros.h | 0
+ .../ffmpeg60/include/libavutil/mathematics.h | 249 ++
+ .../ffmpeg/ffmpeg60/include}/libavutil/mem.h | 158 +-
+ .../ffmpeg60/include/libavutil/pixfmt.h | 891 +++++
+ .../ffmpeg60/include/libavutil/rational.h | 222 ++
+ .../ffmpeg60/include/libavutil/samplefmt.h | 274 ++
+ .../ffmpeg60/include}/libavutil/version.h | 46 +-
+ .../ffmpeg/{ffmpeg59 => ffmpeg60}/moz.build | 0
+ dom/media/platforms/ffmpeg/moz.build | 1 +
+ media/ffvpx/README_MOZILLA | 8 +
+ media/ffvpx/changes.patch | 23 -
+ media/ffvpx/libavcodec/allcodecs.c | 16 +
+ media/ffvpx/libavcodec/av1_parser.c | 7 +-
+ media/ffvpx/libavcodec/av1dec.c | 4 +-
+ media/ffvpx/libavcodec/avcodec.c | 22 +-
+ media/ffvpx/libavcodec/avcodec.h | 235 +-
+ media/ffvpx/libavcodec/avcodec.symbols | 1 -
+ media/ffvpx/libavcodec/avpacket.c | 2 +-
+ media/ffvpx/libavcodec/bitstream_filters.c | 1 +
+ .../libavcodec/cbs_av1_syntax_template.c | 7 +-
+ media/ffvpx/libavcodec/codec.h | 26 +-
+ media/ffvpx/libavcodec/codec_desc.c | 47 +
+ media/ffvpx/libavcodec/codec_id.h | 15 +
+ media/ffvpx/libavcodec/codec_internal.h | 8 +
+ media/ffvpx/libavcodec/decode.c | 224 +-
+ media/ffvpx/libavcodec/decode.h | 6 +
+ media/ffvpx/libavcodec/encode.c | 71 +-
+ media/ffvpx/libavcodec/encode.h | 6 +
+ media/ffvpx/libavcodec/flac.c | 4 +-
+ media/ffvpx/libavcodec/flacdec.c | 218 +-
+ media/ffvpx/libavcodec/get_bits.h | 321 +-
+ media/ffvpx/libavcodec/internal.h | 1 -
+ media/ffvpx/libavcodec/libdav1d.c | 115 +-
+ media/ffvpx/libavcodec/mathops.h | 9 +
+ media/ffvpx/libavcodec/motion_est.h | 1 -
+ media/ffvpx/libavcodec/mpegpicture.h | 3 +
+ media/ffvpx/libavcodec/mpegvideo.h | 9 +-
+ media/ffvpx/libavcodec/options.c | 37 +-
+ media/ffvpx/libavcodec/options_table.h | 12 +-
+ media/ffvpx/libavcodec/profiles.c | 1 +
+ media/ffvpx/libavcodec/pthread.c | 3 -
+ media/ffvpx/libavcodec/pthread_frame.c | 258 +-
+ media/ffvpx/libavcodec/put_bits.h | 7 +
+ media/ffvpx/libavcodec/ratecontrol.h | 3 -
+ media/ffvpx/libavcodec/thread.h | 12 -
+ media/ffvpx/libavcodec/utils.c | 16 +-
+ media/ffvpx/libavcodec/vaapi_av1.c | 2 +-
+ media/ffvpx/libavcodec/vaapi_decode.c | 4 +-
+ media/ffvpx/libavcodec/vaapi_hevc.h | 2 +-
+ media/ffvpx/libavcodec/version.h | 4 +-
+ media/ffvpx/libavcodec/version_major.h | 29 +-
+ media/ffvpx/libavcodec/videodsp_template.c | 4 +-
+ media/ffvpx/libavcodec/vp8.c | 14 +-
+ media/ffvpx/libavcodec/x86/fft.asm | 8 +-
+ media/ffvpx/libavcodec/x86/flacdsp.asm | 8 +-
+ media/ffvpx/libavcodec/x86/h264_intrapred.asm | 24 +-
+ .../libavcodec/x86/h264_intrapred_10bit.asm | 16 +-
+ media/ffvpx/libavcodec/x86/videodsp.asm | 2 +-
+ media/ffvpx/libavcodec/x86/vp8dsp.asm | 28 +-
+ media/ffvpx/libavutil/avstring.c | 10 -
+ media/ffvpx/libavutil/avstring.h | 9 -
+ media/ffvpx/libavutil/avutil.symbols | 4 +-
+ media/ffvpx/libavutil/channel_layout.c | 1 +
+ media/ffvpx/libavutil/channel_layout.h | 2 +
+ media/ffvpx/libavutil/dict.c | 41 +-
+ media/ffvpx/libavutil/dict.h | 125 +-
+ media/ffvpx/libavutil/ffversion.h | 2 +-
+ media/ffvpx/libavutil/frame.c | 26 +-
+ media/ffvpx/libavutil/frame.h | 23 +-
+ media/ffvpx/libavutil/hwcontext.c | 6 +-
+ media/ffvpx/libavutil/hwcontext_vaapi.c | 40 +-
+ media/ffvpx/libavutil/mem.c | 10 -
+ media/ffvpx/libavutil/mem.h | 88 -
+ media/ffvpx/libavutil/mem_internal.h | 2 -
+ media/ffvpx/libavutil/opt.c | 14 +-
+ media/ffvpx/libavutil/pixdesc.c | 70 +-
+ media/ffvpx/libavutil/pixfmt.h | 32 +-
+ media/ffvpx/libavutil/version.h | 22 +-
+ media/ffvpx/libavutil/video_enc_params.c | 10 +-
+ media/ffvpx/libavutil/x86/float_dsp.asm | 18 +-
+ media/ffvpx/libavutil/x86/lls.asm | 4 +-
+ tools/rewriting/ThirdPartyPaths.txt | 1 +
+ 112 files changed, 13117 insertions(+), 1615 deletions(-)
+ copy dom/media/platforms/ffmpeg/{ffmpeg57 => ffmpeg60}/include/COPYING.LGPLv2.1 (100%)
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/avcodec.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/avdct.h
+ copy dom/media/platforms/ffmpeg/{ffmpeg59 => ffmpeg60}/include/libavcodec/avfft.h (100%)
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/bsf.h
+ copy {media/ffvpx => dom/media/platforms/ffmpeg/ffmpeg60/include}/libavcodec/codec.h (51%)
+ copy dom/media/platforms/ffmpeg/{ffmpeg59 => ffmpeg60}/include/libavcodec/codec_desc.h (100%)
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec_id.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec_par.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/defs.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/packet.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/vdpau.h
+ copy {media/ffvpx => dom/media/platforms/ffmpeg/ffmpeg60/include}/libavcodec/version.h (60%)
+ copy {media/ffvpx => dom/media/platforms/ffmpeg/ffmpeg60/include}/libavcodec/version_major.h (55%)
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/attributes.h
+ copy dom/media/platforms/ffmpeg/{ffmpeg58 => ffmpeg60}/include/libavutil/avconfig.h (100%)
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/avutil.h
+ copy dom/media/platforms/ffmpeg/{ffmpeg59 => ffmpeg60}/include/libavutil/buffer.h (100%)
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/channel_layout.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/common.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/cpu.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/dict.h
+ copy dom/media/platforms/ffmpeg/{ffmpeg59 => ffmpeg60}/include/libavutil/error.h (100%)
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/frame.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/hwcontext.h
+ copy dom/media/platforms/ffmpeg/{ffmpeg59 => ffmpeg60}/include/libavutil/hwcontext_vaapi.h (100%)
+ copy dom/media/platforms/ffmpeg/{ffmpeg59 => ffmpeg60}/include/libavutil/intfloat.h (100%)
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/log.h
+ copy dom/media/platforms/ffmpeg/{ffmpeg59 => ffmpeg60}/include/libavutil/macros.h (100%)
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/mathematics.h
+ copy {media/ffvpx => dom/media/platforms/ffmpeg/ffmpeg60/include}/libavutil/mem.h (79%)
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/pixfmt.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/rational.h
+ create mode 100644 dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/samplefmt.h
+ copy {media/ffvpx => dom/media/platforms/ffmpeg/ffmpeg60/include}/libavutil/version.h (66%)
+ copy dom/media/platforms/ffmpeg/{ffmpeg59 => ffmpeg60}/moz.build (100%)
+
+diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
+index 4dac27ce41df..cd7a7dc2412b 100644
+--- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
++++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
+@@ -66,42 +66,47 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() {
+ AV_FUNC_57 = 1 << 4,
+ AV_FUNC_58 = 1 << 5,
+ AV_FUNC_59 = 1 << 6,
++ AV_FUNC_60 = 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_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_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60,
+ AV_FUNC_AVUTIL_ALL = AV_FUNC_AVCODEC_ALL | AV_FUNC_AVUTIL_MASK
+ };
+
+ switch (macro) {
+ case 53:
+ version = AV_FUNC_53;
+ break;
+ case 54:
+ version = AV_FUNC_54;
+ break;
+ case 55:
+ version = AV_FUNC_55;
+ break;
+ case 56:
+ version = AV_FUNC_56;
+ break;
+ case 57:
+ version = AV_FUNC_57;
+ break;
+ case 58:
+ version = AV_FUNC_58;
+ break;
+ case 59:
+ version = AV_FUNC_59;
+ break;
++ case 60:
++ version = AV_FUNC_60;
++ break;
+ default:
+- FFMPEG_LOG("Unknown avcodec version");
++ FFMPEG_LOG("Unknown avcodec version: %d", macro);
+ Unlink();
+ return isFFMpeg ? ((macro > 57) ? LinkResult::UnknownFutureFFMpegVersion
+ : LinkResult::UnknownOlderFFMpegVersion)
+@@ -155,61 +160,74 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() {
+ 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(avcodec_receive_frame, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC(avcodec_default_get_buffer2,
+- (AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59))
++ AV_FUNC(avcodec_send_packet, 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_OPTION(av_rdft_init, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC_OPTION(av_rdft_calc, AV_FUNC_AVCODEC_ALL)
+ AV_FUNC_OPTION(av_rdft_end, 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_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
+ 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_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
+ 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_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
+ 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_buffer_get_opaque, (AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 |
+- AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59))
++ 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_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60))
+ 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(av_strerror,
++ AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60)
+
+ #ifdef MOZ_WAYLAND
+- AV_FUNC_OPTION_SILENT(avcodec_get_hw_config, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_codec_iterate, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_codec_is_decoder, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_init, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_alloc, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_hwdevice_hwconfig_alloc, AV_FUNC_58 | AV_FUNC_59)
++ 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_OPTION_SILENT(av_codec_is_decoder,
++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
++ AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_init,
++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
++ AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_alloc,
++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
++ AV_FUNC_OPTION_SILENT(av_hwdevice_hwconfig_alloc,
++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
+ AV_FUNC_OPTION_SILENT(av_hwdevice_get_hwframe_constraints,
+- AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_hwframe_constraints_free, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_buffer_ref, AV_FUNC_AVUTIL_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_buffer_unref, AV_FUNC_AVUTIL_58 | AV_FUNC_59)
++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
++ 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_OPTION_SILENT(av_hwframe_transfer_get_formats,
+- AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_create_derived, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_hwframe_ctx_alloc, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_dict_set, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_dict_free, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(avcodec_get_name, AV_FUNC_58 | AV_FUNC_59)
+- AV_FUNC_OPTION_SILENT(av_get_pix_fmt_string,
+- AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59)
++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
++ AV_FUNC_OPTION_SILENT(av_hwdevice_ctx_create_derived,
++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
++ AV_FUNC_OPTION_SILENT(av_hwframe_ctx_alloc,
++ AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
++ AV_FUNC_OPTION_SILENT(av_dict_set, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
++ AV_FUNC_OPTION_SILENT(av_dict_free, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60)
++ AV_FUNC_OPTION_SILENT(avcodec_get_name, 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)
+ #endif
+ #undef AV_FUNC
+ #undef AV_FUNC_OPTION
+diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
+index 91bf38df8354..7716162e0707 100644
+--- a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
++++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
+@@ -27,17 +27,19 @@ static FFmpegLibWrapper sLibAV;
+ static const char* sLibs[] = {
+ // clang-format off
+ #if defined(XP_DARWIN)
++ "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.60",
+ "libavcodec.so.59",
+ "libavcodec.so.58",
+ "libavcodec-ffmpeg.so.58",
+@@ -160,6 +162,9 @@ already_AddRefed<PlatformDecoderModule> FFmpegRuntimeLinker::Create() {
+ case 59:
+ module = FFmpegDecoderModule<59>::Create(&sLibAV);
+ break;
++ case 60:
++ module = FFmpegDecoderModule<60>::Create(&sLibAV);
++ break;
+ default:
+ module = nullptr;
+ }
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg57/include/COPYING.LGPLv2.1 b/dom/media/platforms/ffmpeg/ffmpeg60/include/COPYING.LGPLv2.1
+similarity index 100%
+copy from dom/media/platforms/ffmpeg/ffmpeg57/include/COPYING.LGPLv2.1
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/COPYING.LGPLv2.1
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/avcodec.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/avcodec.h
+new file mode 100644
+index 000000000000..c7e6b609d540
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/avcodec.h
+@@ -0,0 +1,3230 @@
++/*
++ * 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/dict.h"
++#include "libavutil/frame.h"
++#include "libavutil/log.h"
++#include "libavutil/pixfmt.h"
++#include "libavutil/rational.h"
++
++#include "codec.h"
++#include "codec_desc.h"
++#include "codec_par.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"
++#endif
++
++/**
++ * @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.
++ * @{
++ */
++
++/**
++ * @ingroup lavc_encoding
++ * minimum encoding buffer size
++ * Used to avoid some checks during header writing.
++ */
++#define AV_INPUT_BUFFER_MIN_SIZE 16384
++
++/**
++ * @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)
++/**
++ * Don't output frames whose parameters differ from first
++ * decoded frame in stream.
++ */
++#define AV_CODEC_FLAG_DROPCHANGED (1 << 5)
++/**
++ * 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.
++ */
++#define AV_CODEC_FLAG_RECON_FRAME (1 << 6)
++/**
++ * @par decoding
++ * Request the decoder to propagate each packets 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)
++
++struct AVCodecInternal;
++
++/**
++ * 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;
++
++ /**
++ * 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_*
++ * - 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;
++
++ /**
++ * 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.
++ */
++ int ticks_per_frame;
++
++ /**
++ * 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;
++
++ /**
++ * the number of pictures in a group of pictures, or 0 for intra_only
++ * - encoding: Set by user.
++ * - decoding: unused
++ */
++ int gop_size;
++
++ /**
++ * 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;
++
++ /**
++ * 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;
++
++ /**
++ * 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;
++
++ /**
++ * 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;
++
++ /**
++ * slice count
++ * - encoding: Set by libavcodec.
++ * - decoding: Set by user (or 0).
++ */
++ int slice_count;
++
++ /**
++ * slice offsets in the frame in bytes
++ * - encoding: Set/allocated by libavcodec.
++ * - decoding: Set/allocated by user (or NULL).
++ */
++ int* slice_offset;
++
++ /**
++ * 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;
++
++ /**
++ * 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;
++
++ /**
++ * 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
++
++ /**
++ * 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;
++
++ /**
++ * 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
++ * - 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;
++
++ /**
++ * number of reference frames
++ * - encoding: Set by user.
++ * - decoding: Set by lavc.
++ */
++ int refs;
++
++ /**
++ * 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
++ * - decoding: Set by libavcodec
++ */
++ 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
++
++ /* 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;
++
++ /**
++ * 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 */
++ 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: unused
++ */
++ 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;
++
++#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;
++
++ /**
++ * 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;
++
++ /**
++ * 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
++#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;
++
++ /**
++ * 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;
++
++ /**
++ * 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);
++
++ /**
++ * 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.
++ */
++ int profile;
++#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_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
++
++ /**
++ * level
++ * - encoding: Set by user.
++ * - decoding: Set by libavcodec.
++ */
++ int level;
++#define FF_LEVEL_UNKNOWN -99
++
++ /**
++ * 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;
++
++ /**
++ * 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())
++ */
++ uint8_t* subtitle_header;
++ int subtitle_header_size;
++
++ /**
++ * 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;
++
++ /**
++ * - 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;
++
++ /**
++ * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
++ * - encoding: unused.
++ * - decoding: Set by libavcodec before calling get_format()
++ */
++ enum AVPixelFormat sw_pix_fmt;
++
++ /**
++ * Timebase in which pkt_dts/pts and AVPacket.dts/pts are.
++ * - encoding unused.
++ * - decoding set by user.
++ */
++ AVRational pkt_timebase;
++
++ /**
++ * AVCodecDescriptor
++ * - encoding: unused.
++ * - decoding: set by libavcodec.
++ */
++ const 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
++ * 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
++
++ /**
++ * 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 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;
++
++ /**
++ * 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;
++
++ /**
++ * 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: unused
++ * - 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.
++ *
++ * - 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;
++
++ /**
++ * 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;
++
++ /**
++ * 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
++ * 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;
++
++ /*
++ * 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;
++
++ /**
++ * 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.
++ *
++ * 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);
++
++ /**
++ * 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;
++} 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;
++
++ /*****************************************************************
++ * No fields below this line are part of the public API. They
++ * may not be used outside of libavcodec and can be changed and
++ * removed at will.
++ * New public fields should be added right above.
++ *****************************************************************
++ */
++
++ /**
++ * Allocate a custom buffer
++ */
++ int (*alloc_frame)(AVCodecContext* avctx, AVFrame* frame);
++
++ /**
++ * Called at the beginning of each frame or field picture.
++ *
++ * Meaningful frame information (codec specific) is guaranteed to
++ * be parsed at this point. This function is mandatory.
++ *
++ * Note that buf can be NULL along with buf_size set to 0.
++ * Otherwise, this means the whole frame is available at this point.
++ *
++ * @param avctx the codec context
++ * @param buf the frame data buffer base
++ * @param buf_size the size of the frame in bytes
++ * @return zero if successful, a negative value otherwise
++ */
++ int (*start_frame)(AVCodecContext* avctx, const uint8_t* buf,
++ uint32_t buf_size);
++
++ /**
++ * Callback for parameter data (SPS/PPS/VPS etc).
++ *
++ * Useful for hardware decoders which keep persistent state about the
++ * video parameters, and need to receive any changes to update that state.
++ *
++ * @param avctx the codec context
++ * @param type the nal unit type
++ * @param buf the nal unit data buffer
++ * @param buf_size the size of the nal unit in bytes
++ * @return zero if successful, a negative value otherwise
++ */
++ int (*decode_params)(AVCodecContext* avctx, int type, const uint8_t* buf,
++ uint32_t buf_size);
++
++ /**
++ * Callback for each slice.
++ *
++ * Meaningful slice information (codec specific) is guaranteed to
++ * be parsed at this point. This function is mandatory.
++ *
++ * @param avctx the codec context
++ * @param buf the slice data buffer base
++ * @param buf_size the size of the slice in bytes
++ * @return zero if successful, a negative value otherwise
++ */
++ int (*decode_slice)(AVCodecContext* avctx, const uint8_t* buf,
++ uint32_t buf_size);
++
++ /**
++ * Called at the end of each frame or field picture.
++ *
++ * The whole picture is parsed at this point and can now be sent
++ * to the hardware accelerator. This function is mandatory.
++ *
++ * @param avctx the codec context
++ * @return zero if successful, a negative value otherwise
++ */
++ int (*end_frame)(AVCodecContext* avctx);
++
++ /**
++ * Size of per-frame hardware accelerator private data.
++ *
++ * Private data is allocated with av_mallocz() before
++ * AVCodecContext.get_buffer() and deallocated after
++ * AVCodecContext.release_buffer().
++ */
++ int frame_priv_data_size;
++
++ /**
++ * Initialize the hwaccel private data.
++ *
++ * This will be called from ff_get_format(), after hwaccel and
++ * 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
++ * and hwaccel_context are already uninitialized.
++ */
++ int (*uninit)(AVCodecContext* avctx);
++
++ /**
++ * Size of the private data to allocate in
++ * AVCodecInternal.hwaccel_priv_data.
++ */
++ int priv_data_size;
++
++ /**
++ * Internal hwaccel capabilities.
++ */
++ int caps_internal;
++
++ /**
++ * Fill the given hw_frames context with current codec parameters. Called
++ * from get_format. Refer to avcodec_get_hw_frames_parameters() for
++ * details.
++ *
++ * This CAN be called before AVHWAccel.init is called, and you must assume
++ * that avctx->hwaccel_priv_data is invalid.
++ */
++ int (*frame_params)(AVCodecContext* avctx, AVBufferRef* hw_frames_ctx);
++} 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];
++
++ 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;
++ 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(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 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.
++ *
++ * @note Always call this function before using decoding routines (such as
++ * @ref avcodec_receive_frame()).
++ *
++ * @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
++ *
++ * @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. On return this object will be filled with options that were not
++ * found.
++ *
++ * @return zero on success, a negative value on error
++ * @see avcodec_alloc_context3(), avcodec_find_decoder(),
++ * avcodec_find_encoder(), av_dict_set(), av_opt_find().
++ */
++int avcodec_open2(AVCodecContext* avctx, const AVCodec* codec,
++ AVDictionary** options);
++
++/**
++ * 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
++ * codec context (either open or closed). Opening and closing a codec context
++ * multiple times is not supported anymore -- use multiple codec contexts
++ * instead.
++ */
++int avcodec_close(AVCodecContext* avctx);
++
++/**
++ * 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]);
++
++#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 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
++ * 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
++ * AV_CODEC_FLAG_RECON_FRAME flag enabled
++ * @retval AVERROR_INPUT_CHANGED current decoded frame has changed parameters
++ * with respect to first decoded frame. Applicable when flag
++ * AV_CODEC_FLAG_DROPCHANGED is set.
++ * @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/ffmpeg60/include/libavcodec/avdct.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/avdct.h
+new file mode 100644
+index 000000000000..9edf4c187e81
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/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/ffmpeg59/include/libavcodec/avfft.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/avfft.h
+similarity index 100%
+copy from dom/media/platforms/ffmpeg/ffmpeg59/include/libavcodec/avfft.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/avfft.h
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/bsf.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/bsf.h
+new file mode 100644
+index 000000000000..044a0597bf33
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/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/media/ffvpx/libavcodec/codec.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec.h
+similarity index 51%
+copy from media/ffvpx/libavcodec/codec.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec.h
+index 77a1a3f5a296..4340d8503f29 100644
+--- a/media/ffvpx/libavcodec/codec.h
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec.h
+@@ -41,352 +41,344 @@
+ /**
+ * Decoder can use draw_horiz_band callback.
+ */
+-#define AV_CODEC_CAP_DRAW_HORIZ_BAND (1 << 0)
++#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)
+-#if FF_API_FLAG_TRUNCATED
+-/**
+- * @deprecated Use parsers to always send proper frames.
+- */
+-#define AV_CODEC_CAP_TRUNCATED (1 << 3)
+-#endif
++#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)
++#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)
++#define AV_CODEC_CAP_SMALL_LAST_FRAME (1 << 6)
+
+ /**
+ * 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)
++#define AV_CODEC_CAP_SUBFRAMES (1 << 8)
+ /**
+ * Codec is experimental and is thus avoided in favor of non experimental
+ * encoders
+ */
+-#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9)
++#define AV_CODEC_CAP_EXPERIMENTAL (1 << 9)
+ /**
+- * Codec should fill in channel configuration and samplerate instead of container
++ * Codec should fill in channel configuration and samplerate instead of
++ * container
+ */
+-#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10)
++#define AV_CODEC_CAP_CHANNEL_CONF (1 << 10)
+ /**
+ * Codec supports frame-level multithreading.
+ */
+-#define AV_CODEC_CAP_FRAME_THREADS (1 << 12)
++#define AV_CODEC_CAP_FRAME_THREADS (1 << 12)
+ /**
+ * Codec supports slice-based (or partition-based) multithreading.
+ */
+-#define AV_CODEC_CAP_SLICE_THREADS (1 << 13)
++#define AV_CODEC_CAP_SLICE_THREADS (1 << 13)
+ /**
+ * Codec supports changed parameters at any point.
+ */
+-#define AV_CODEC_CAP_PARAM_CHANGE (1 << 14)
++#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)
+-#if FF_API_AUTO_THREADS
+-#define AV_CODEC_CAP_AUTO_THREADS AV_CODEC_CAP_OTHER_THREADS
+-#endif
++#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)
+-
+-#if FF_API_UNUSED_CODEC_CAPS
+-/**
+- * Deprecated and unused. Use AVCodecDescriptor.props instead
+- */
+-#define AV_CODEC_CAP_INTRA_ONLY 0x40000000
+-/**
+- * Deprecated and unused. Use AVCodecDescriptor.props instead
+- */
+-#define AV_CODEC_CAP_LOSSLESS 0x80000000
+-#endif
++#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)
++#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)
++#define AV_CODEC_CAP_HYBRID (1 << 19)
+
+ /**
+- * This codec takes the reordered_opaque field from input AVFrames
+- * and returns it in the corresponding field in AVCodecContext after
+- * encoding.
++ * 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)
++#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
++ 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
++ /**
++ * 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
+ #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
++ /**
++ * @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 {FF_PROFILE_UNKNOWN}
++ const AVClass* priv_class; ///< AVClass for the private context
++ const AVProfile*
++ profiles; ///< array of recognized profiles, or NULL if unknown, array is
++ ///< terminated by {FF_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;
++ /**
++ * 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;
++ /**
++ * 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);
++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);
++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);
++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);
++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);
++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);
++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);
++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);
++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,
++ /**
++ * 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;
++ /**
++ * 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);
++const AVCodecHWConfig* avcodec_get_hw_config(const AVCodec* codec, int index);
+
+ /**
+ * @}
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg59/include/libavcodec/codec_desc.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec_desc.h
+similarity index 100%
+copy from dom/media/platforms/ffmpeg/ffmpeg59/include/libavcodec/codec_desc.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec_desc.h
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec_id.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec_id.h
+new file mode 100644
+index 000000000000..b3dd07ea6e09
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec_id.h
+@@ -0,0 +1,669 @@
++/*
++ * 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,
++#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,
++ 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,
++
++ /* 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,
++
++ /* 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_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/ffmpeg60/include/libavcodec/codec_par.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec_par.h
+new file mode 100644
+index 000000000000..dd9e40d0d6bc
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/codec_par.h
+@@ -0,0 +1,247 @@
++/*
++ * 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"
++
++/**
++ * @addtogroup lavc_core
++ * @{
++ */
++
++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
++};
++
++/**
++ * 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;
++
++ /**
++ * - 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. 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;
++
++#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
++ */
++ attribute_deprecated uint64_t channel_layout;
++ /**
++ * Audio only. The number of audio channels.
++ * @deprecated use ch_layout.nb_channels
++ */
++ attribute_deprecated int channels;
++#endif
++ /**
++ * 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;
++
++ /**
++ * Audio only. The channel layout and number of channels.
++ */
++ AVChannelLayout ch_layout;
++} 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/ffmpeg60/include/libavcodec/defs.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/defs.h
+new file mode 100644
+index 000000000000..9a4632cee453
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/defs.h
+@@ -0,0 +1,203 @@
++/*
++ *
++ * 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.
++
++/**
++ * @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/ffmpeg60/include/libavcodec/packet.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/packet.h
+new file mode 100644
+index 000000000000..d85cf6a84b75
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/packet.h
+@@ -0,0 +1,730 @@
++/*
++ * 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 AVPacket
++ *
++ * Types and functions for working with AVPacket.
++ * @{
++ */
++enum AVPacketSideDataType {
++ /**
++ * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE
++ * bytes worth of palette. This side data signals that a new palette is
++ * present.
++ */
++ AV_PKT_DATA_PALETTE,
++
++ /**
++ * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format
++ * that the extradata buffer was changed and the receiving side should
++ * act upon it appropriately. The new extradata is embedded in the side
++ * data buffer and should be immediately used for processing the current
++ * frame or packet.
++ */
++ AV_PKT_DATA_NEW_EXTRADATA,
++
++ /**
++ * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
++ * @code
++ * u32le param_flags
++ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT)
++ * s32le channel_count
++ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)
++ * u64le channel_layout
++ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)
++ * s32le sample_rate
++ * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)
++ * s32le width
++ * s32le height
++ * @endcode
++ */
++ AV_PKT_DATA_PARAM_CHANGE,
++
++ /**
++ * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of
++ * structures with info about macroblocks relevant to splitting the
++ * packet into smaller packets on macroblock edges (e.g. as for RFC 2190).
++ * That is, it does not necessarily contain info about all macroblocks,
++ * as long as the distance between macroblocks in the info is smaller
++ * than the target payload size.
++ * Each MB info structure is 12 bytes, and is laid out as follows:
++ * @code
++ * u32le bit offset from the start of the packet
++ * u8 current quantizer at the start of the macroblock
++ * u8 GOB number
++ * u16le macroblock address within the GOB
++ * u8 horizontal MV predictor
++ * u8 vertical MV predictor
++ * u8 horizontal MV predictor for block number 3
++ * u8 vertical MV predictor for block number 3
++ * @endcode
++ */
++ AV_PKT_DATA_H263_MB_INFO,
++
++ /**
++ * This side data should be associated with an audio stream and contains
++ * ReplayGain information in form of the AVReplayGain struct.
++ */
++ AV_PKT_DATA_REPLAYGAIN,
++
++ /**
++ * This side data contains a 3x3 transformation matrix describing an affine
++ * transformation that needs to be applied to the decoded video frames for
++ * correct presentation.
++ *
++ * See libavutil/display.h for a detailed description of the data.
++ */
++ AV_PKT_DATA_DISPLAYMATRIX,
++
++ /**
++ * This side data should be associated with a video stream and contains
++ * Stereoscopic 3D information in form of the AVStereo3D struct.
++ */
++ AV_PKT_DATA_STEREO3D,
++
++ /**
++ * This side data should be associated with an audio stream and corresponds
++ * to enum AVAudioServiceType.
++ */
++ AV_PKT_DATA_AUDIO_SERVICE_TYPE,
++
++ /**
++ * This side data contains quality related information from the encoder.
++ * @code
++ * u32le quality factor of the compressed frame. Allowed range is between 1
++ * (good) and FF_LAMBDA_MAX (bad). u8 picture type u8 error count u16
++ * reserved u64le[error count] sum of squared differences between encoder in
++ * and output
++ * @endcode
++ */
++ AV_PKT_DATA_QUALITY_STATS,
++
++ /**
++ * This side data contains an integer value representing the stream index
++ * of a "fallback" track. A fallback track indicates an alternate
++ * track to use when the current track can not be decoded for some reason.
++ * e.g. no decoder available for codec.
++ */
++ AV_PKT_DATA_FALLBACK_TRACK,
++
++ /**
++ * This side data corresponds to the AVCPBProperties struct.
++ */
++ AV_PKT_DATA_CPB_PROPERTIES,
++
++ /**
++ * Recommmends skipping the specified number of samples
++ * @code
++ * u32le number of samples to skip from start of this packet
++ * u32le number of samples to skip from end of this packet
++ * u8 reason for start skip
++ * u8 reason for end skip (0=padding silence, 1=convergence)
++ * @endcode
++ */
++ AV_PKT_DATA_SKIP_SAMPLES,
++
++ /**
++ * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that
++ * the packet may contain "dual mono" audio specific to Japanese DTV
++ * and if it is true, recommends only the selected channel to be used.
++ * @code
++ * u8 selected channels (0=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,
++
++ /**
++ * The number of side data types.
++ * This is not part of the public API/ABI in the sense that it may
++ * change when new side data types are added.
++ * This must stay the last enum value.
++ * If its value becomes huge, some code using it
++ * needs to be updated as it assumes it to be smaller than other limits.
++ */
++ AV_PKT_DATA_NB
++};
++
++#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS // DEPRECATED
++
++typedef struct AVPacketSideData {
++ uint8_t* data;
++ size_t size;
++ enum AVPacketSideDataType type;
++} AVPacketSideData;
++
++/**
++ * This structure stores compressed data. It is typically exported by demuxers
++ * and then passed as input to decoders, or received as output from encoders and
++ * then passed to muxers.
++ *
++ * For video, it should typically contain one compressed frame. For audio it may
++ * contain several compressed frames. Encoders are allowed to output empty
++ * packets, with no compressed data, containing only side data
++ * (e.g. to update some stream parameters at the end of encoding).
++ *
++ * 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 {
++#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().
++ *
++ * @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);
++
++const char* av_packet_side_data_name(enum AVPacketSideDataType type);
++
++/**
++ * Pack a dictionary for use in side_data.
++ *
++ * @param dict The dictionary to pack.
++ * @param size pointer to store the size of the returned data
++ * @return pointer to data if successful, NULL otherwise
++ */
++uint8_t* av_packet_pack_dictionary(AVDictionary* dict, 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/ffmpeg60/include/libavcodec/vdpau.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/vdpau.h
+new file mode 100644
+index 000000000000..0b91baec821c
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/vdpau.h
+@@ -0,0 +1,156 @@
++/*
++ * 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.
++ * The user shall allocate the structure via the av_alloc_vdpau_hwaccel
++ * function and make it available as
++ * AVCodecContext.hwaccel_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. Use av_vdpau_alloc_context() to allocate an
++ * AVVDPAUContext.
++ */
++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;
++
++/**
++ * @brief allocation function for AVVDPAUContext
++ *
++ * Allows extending the struct without breaking API/ABI
++ */
++AVVDPAUContext* av_alloc_vdpaucontext(void);
++
++AVVDPAU_Render2 av_vdpau_hwaccel_get_render2(const AVVDPAUContext*);
++void av_vdpau_hwaccel_set_render2(AVVDPAUContext*, AVVDPAU_Render2);
++
++/**
++ * 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);
++
++/**
++ * Allocate an AVVDPAUContext.
++ *
++ * @return Newly-allocated AVVDPAUContext or NULL on failure.
++ */
++AVVDPAUContext* av_vdpau_alloc_context(void);
++
++/** @} */
++
++#endif /* AVCODEC_VDPAU_H */
+diff --git a/media/ffvpx/libavcodec/version.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/version.h
+similarity index 60%
+copy from media/ffvpx/libavcodec/version.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/version.h
+index 43d0d9a9fcb1..d3f6020c86d6 100644
+--- a/media/ffvpx/libavcodec/version.h
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/version.h
+@@ -29,17 +29,17 @@
+
+ #include "version_major.h"
+
+-#define LIBAVCODEC_VERSION_MINOR 51
+-#define LIBAVCODEC_VERSION_MICRO 101
++#define LIBAVCODEC_VERSION_MINOR 5
++#define LIBAVCODEC_VERSION_MICRO 100
+
+-#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_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)
++#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
+
+ #endif /* AVCODEC_VERSION_H */
+diff --git a/media/ffvpx/libavcodec/version_major.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/version_major.h
+similarity index 55%
+copy from media/ffvpx/libavcodec/version_major.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/version_major.h
+index 12f863deb79d..e9cd92cb3a60 100644
+--- a/media/ffvpx/libavcodec/version_major.h
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavcodec/version_major.h
+@@ -25,33 +25,28 @@
+ * Libavcodec version macros.
+ */
+
+-#define LIBAVCODEC_VERSION_MAJOR 59
++#define LIBAVCODEC_VERSION_MAJOR 60
+
+ /**
+ * 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_OPENH264_SLICE_MODE (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_OPENH264_CABAC (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_UNUSED_CODEC_CAPS (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_THREAD_SAFE_CALLBACKS (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_GET_FRAME_CLASS (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_AUTO_THREADS (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_INIT_PACKET (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_FLAG_TRUNCATED (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_SUB_TEXT_FORMAT (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_IDCT_NONE (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_SVTAV1_OPTS (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_AYUV_CODECID (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_VT_OUTPUT_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_AVCODEC_CHROMA_POS (LIBAVCODEC_VERSION_MAJOR < 60)
++#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)
++
++// reminder to remove CrystalHD decoders on next major bump
++#define FF_CODEC_CRYSTAL_HD (LIBAVCODEC_VERSION_MAJOR < 61)
+
+ #endif /* AVCODEC_VERSION_MAJOR_H */
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/attributes.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/attributes.h
+new file mode 100644
+index 000000000000..774d1fe91616
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/attributes.h
+@@ -0,0 +1,173 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni(a)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/ffmpeg58/include/libavutil/avconfig.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/avconfig.h
+similarity index 100%
+copy from dom/media/platforms/ffmpeg/ffmpeg58/include/libavutil/avconfig.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/avconfig.h
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/avutil.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/avutil.h
+new file mode 100644
+index 000000000000..8f8343bd043f
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/avutil.h
+@@ -0,0 +1,371 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni(a)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
++ */
++
++#define AV_TIME_BASE_Q \
++ (AVRational) { 1, AV_TIME_BASE }
++
++/**
++ * @}
++ * @}
++ * @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 "error.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)
++
++#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)
++
++/**
++ * 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/ffmpeg59/include/libavutil/buffer.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/buffer.h
+similarity index 100%
+copy from dom/media/platforms/ffmpeg/ffmpeg59/include/libavutil/buffer.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/buffer.h
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/channel_layout.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/channel_layout.h
+new file mode 100644
+index 000000000000..1ce5bb32d125
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/channel_layout.h
+@@ -0,0 +1,842 @@
++/*
++ * Copyright (c) 2006 Michael Niedermayer <michaelni(a)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_SILENCE)
++ * 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,
++};
++
++/**
++ * @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)
++
++#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)
++#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_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_7POINT1_TOP_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_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_5POINT1_BACK | AV_CH_FRONT_LEFT_OF_CENTER | \
++ AV_CH_FRONT_RIGHT_OF_CENTER | AV_CH_BACK_CENTER | AV_CH_LOW_FREQUENCY_2 | \
++ AV_CH_SIDE_LEFT | AV_CH_SIDE_RIGHT | AV_CH_TOP_FRONT_LEFT | \
++ AV_CH_TOP_FRONT_RIGHT | AV_CH_TOP_FRONT_CENTER | AV_CH_TOP_CENTER | \
++ AV_CH_TOP_BACK_LEFT | AV_CH_TOP_BACK_RIGHT | 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)
++
++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;
++
++#define AV_CHANNEL_LAYOUT_MASK(nb, m) \
++ { \
++ .order = AV_CHANNEL_ORDER_NATIVE, .nb_channels = (nb), .u = {.mask = (m) } \
++ }
++
++/**
++ * @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_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_7POINT1_TOP_BACK \
++ AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_TOP_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_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_AMBISONIC_FIRST_ORDER \
++ { \
++ .order = AV_CHANNEL_ORDER_AMBISONIC, .nb_channels = 4, .u = {.mask = 0 } \
++ }
++/** @} */
++
++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 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 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")
++ *
++ * @param channel_layout input channel layout
++ * @param str string describing the channel layout
++ * @return 0 channel layout was detected, AVERROR_INVALIDATATA otherwise
++ */
++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);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_CHANNEL_LAYOUT_H */
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/common.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/common.h
+new file mode 100644
+index 000000000000..6c09e40bc05a
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/common.h
+@@ -0,0 +1,589 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni(a)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 "macros.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 */
++
++#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
++#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 \
++ } \
++ }
++
++#include "mem.h"
++
++#ifdef HAVE_AV_CONFIG_H
++# include "internal.h"
++#endif /* HAVE_AV_CONFIG_H */
++
++#endif /* AVUTIL_COMMON_H */
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/cpu.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/cpu.h
+new file mode 100644
+index 000000000000..8a48d944ebd9
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/cpu.h
+@@ -0,0 +1,150 @@
++/*
++ * 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_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
++
++/**
++ * 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/ffmpeg60/include/libavutil/dict.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/dict.h
+new file mode 100644
+index 000000000000..967a1c8041f0
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/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/ffmpeg59/include/libavutil/error.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/error.h
+similarity index 100%
+copy from dom/media/platforms/ffmpeg/ffmpeg59/include/libavutil/error.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/error.h
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/frame.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/frame.h
+new file mode 100644
+index 000000000000..3b4f1e84bccd
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/frame.h
+@@ -0,0 +1,960 @@
++/*
++ * 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.
++ */
++ 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,
++};
++
++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;
++
++/**
++ * 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;
++
++ /**
++ * 1 -> keyframe, 0-> not
++ */
++ int key_frame;
++
++ /**
++ * 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;
++
++#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;
++
++ /**
++ * for some private data of the user
++ */
++ void* opaque;
++
++ /**
++ * When decoding, this signals how much the picture must be delayed.
++ * extra_delay = repeat_pict / (2*fps)
++ */
++ int repeat_pict;
++
++ /**
++ * The content of the picture is interlaced.
++ */
++ int interlaced_frame;
++
++ /**
++ * If the content is interlaced, is top field displayed first.
++ */
++ int top_field_first;
++
++ /**
++ * Tell user application that palette has changed from previous frame.
++ */
++ int palette_has_changed;
++
++#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
++ * 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 the frames which need to be decoded, but shouldn't be output.
++ */
++#define AV_FRAME_FLAG_DISCARD (1 << 2)
++ /**
++ * @}
++ */
++
++ /**
++ * 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;
++
++ /**
++ * reordered pos from the last AVPacket that has been input into the decoder
++ * - encoding: unused
++ * - decoding: Read by user.
++ */
++ int64_t pkt_pos;
++
++#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;
++
++ /**
++ * 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_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
++
++ /**
++ * 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.
++ */
++ int pkt_size;
++
++ /**
++ * For hwaccel-format frames, this should be a reference to the
++ * AVHWFramesContext describing the frame.
++ */
++ AVBufferRef* hw_frames_ctx;
++
++ /**
++ * 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 frame is unreferenced. av_frame_copy_props() calls create a new
++ * reference with av_buffer_ref() for the target frame's opaque_ref field.
++ *
++ * This is unrelated to the opaque field, although it serves a similar
++ * purpose.
++ */
++ 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);
++
++/**
++ * 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(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);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_FRAME_H */
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/hwcontext.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/hwcontext.h
+new file mode 100644
+index 000000000000..fb376ce4994b
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/hwcontext.h
+@@ -0,0 +1,606 @@
++/*
++ * 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,
++};
++
++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.
++ *
++ * 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;
++
++ /**
++ * 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;
++
++ /**
++ * 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;
++
++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
++ * struct.
++ */
++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
++ * 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.
++ *
++ * 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().
++ *
++ * 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/ffmpeg59/include/libavutil/hwcontext_vaapi.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/hwcontext_vaapi.h
+similarity index 100%
+copy from dom/media/platforms/ffmpeg/ffmpeg59/include/libavutil/hwcontext_vaapi.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/hwcontext_vaapi.h
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg59/include/libavutil/intfloat.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/intfloat.h
+similarity index 100%
+copy from dom/media/platforms/ffmpeg/ffmpeg59/include/libavutil/intfloat.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/intfloat.h
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/log.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/log.h
+new file mode 100644
+index 000000000000..e1f2af7b18aa
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/log.h
+@@ -0,0 +1,388 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni(a)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/ffmpeg59/include/libavutil/macros.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/macros.h
+similarity index 100%
+copy from dom/media/platforms/ffmpeg/ffmpeg59/include/libavutil/macros.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/macros.h
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/mathematics.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/mathematics.h
+new file mode 100644
+index 000000000000..5ebf81e64fe6
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/mathematics.h
+@@ -0,0 +1,249 @@
++/*
++ * copyright (c) 2005-2012 Michael Niedermayer <michaelni(a)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_LN2
++# define M_LN2 0.69314718055994530942 /* log_e 2 */
++#endif
++#ifndef M_LN10
++# define M_LN10 2.30258509299404568402 /* log_e 10 */
++#endif
++#ifndef M_LOG2_10
++# define M_LOG2_10 3.32192809488736234787 /* log_2 10 */
++#endif
++#ifndef M_PHI
++# define M_PHI 1.61803398874989484820 /* phi / golden ratio */
++#endif
++#ifndef M_PI
++# define M_PI 3.14159265358979323846 /* pi */
++#endif
++#ifndef M_PI_2
++# define M_PI_2 1.57079632679489661923 /* pi/2 */
++#endif
++#ifndef M_SQRT1_2
++# define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
++#endif
++#ifndef M_SQRT2
++# define M_SQRT2 1.41421356237309504880 /* 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);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_MATHEMATICS_H */
+diff --git a/media/ffvpx/libavutil/mem.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/mem.h
+similarity index 79%
+copy from media/ffvpx/libavutil/mem.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/mem.h
+index c9c4fcf1ff02..8f5d8c756ee3 100644
+--- a/media/ffvpx/libavutil/mem.h
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/mem.h
+@@ -51,300 +51,216 @@
+ * @{
+ */
+
+-#if FF_API_DECLARE_ALIGNED
+-/**
+- *
+- * @defgroup lavu_mem_macros Alignment Macros
+- * Helper macros for declaring aligned variables.
+- * @{
+- */
+-
+-/**
+- * @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];
+- *
+- * // The default-alignment equivalent would be
+- * uint16_t aligned_int = 42;
+- * uint8_t aligned_array[128];
+- * @endcode
+- *
+- * @param n Minimum alignment in bytes
+- * @param t Type of the variable (or array element)
+- * @param v Name of the variable
+- */
+-
+-/**
+- * @def DECLARE_ASM_ALIGNED(n,t,v)
+- * Declare an aligned variable appropriate for use in inline assembly code.
+- *
+- * @code{.c}
+- * DECLARE_ASM_ALIGNED(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008);
+- * @endcode
+- *
+- * @param n Minimum alignment in bytes
+- * @param t Type of the variable (or array element)
+- * @param v Name of the variable
+- */
+-
+-/**
+- * @def DECLARE_ASM_CONST(n,t,v)
+- * Declare a static constant aligned variable appropriate for use in inline
+- * assembly code.
+- *
+- * @code{.c}
+- * DECLARE_ASM_CONST(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008);
+- * @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_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_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_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_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_ASM_ALIGNED(n,t,v) t v
+- #define DECLARE_ASM_CONST(n,t,v) static const t v
+-#endif
+-
+-/**
+- * @}
+- */
+-#endif
+-
+ /**
+ * @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_…">Function attribute `malloc` in GCC's documentation</a>
++ * @see <a
++ * href="https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-g_…">Function
++ * attribute `malloc` in GCC's documentation</a>
+ */
+
+-#if AV_GCC_VERSION_AT_LEAST(3,1)
+- #define av_malloc_attrib __attribute__((__malloc__))
++#if AV_GCC_VERSION_AT_LEAST(3, 1)
++# define av_malloc_attrib __attribute__((__malloc__))
+ #else
+- #define av_malloc_attrib
++# 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_…">Function attribute `alloc_size` in GCC's documentation</a>
++ * @see <a
++ * href="https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-g_…">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__)))
++#if AV_GCC_VERSION_AT_LEAST(4, 3)
++# define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
+ #else
+- #define av_alloc_size(...)
++# 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);
++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);
++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);
++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);
+-
+-#if FF_API_AV_MALLOCZ_ARRAY
+-/**
+- * @deprecated use av_calloc()
+- */
+-attribute_deprecated
+-void *av_mallocz_array(size_t nmemb, size_t size) av_malloc_attrib av_alloc_size(1, 2);
+-#endif
++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);
++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);
++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);
++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);
++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);
++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.
+@@ -378,7 +294,7 @@ int av_reallocp_array(void *ptr, size_t nmemb, size_t size);
+ * @see av_realloc()
+ * @see av_fast_malloc()
+ */
+-void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size);
++void* av_fast_realloc(void* ptr, unsigned int* size, size_t min_size);
+
+ /**
+ * Allocate a buffer, reusing the given one if large enough.
+@@ -409,107 +325,107 @@ void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size);
+ * @see av_realloc()
+ * @see av_fast_mallocz()
+ */
+-void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size);
++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);
++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);
++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);
++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;
++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;
++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);
++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);
++void av_memcpy_backptr(uint8_t* dst, int back, int cnt);
+
+ /**
+ * @}
+@@ -611,68 +527,68 @@ void av_memcpy_backptr(uint8_t *dst, int back, int cnt);
+ * @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);
++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);
++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);
++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);
++int av_size_mult(size_t a, size_t b, size_t* r);
+
+ /**
+ * Set the maximum size that may be allocated in one block.
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/pixfmt.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/pixfmt.h
+new file mode 100644
+index 000000000000..b7516d9e3b58
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/pixfmt.h
+@@ -0,0 +1,891 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni(a)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
++
++/**
++ * 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)2R 3G 3B(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
++
++#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
++
++ 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_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_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_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_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/ffmpeg60/include/libavutil/rational.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/rational.h
+new file mode 100644
+index 000000000000..1ce38d09688c
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/rational.h
+@@ -0,0 +1,222 @@
++/*
++ * rational numbers
++ * Copyright (c) 2003 Michael Niedermayer <michaelni(a)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(a)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.
++ *
++ * @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/ffmpeg60/include/libavutil/samplefmt.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/samplefmt.h
+new file mode 100644
+index 000000000000..31cbca765978
+--- /dev/null
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/samplefmt.h
+@@ -0,0 +1,274 @@
++/*
++ * 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** 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** audio_data, int offset, int nb_samples,
++ int nb_channels, enum AVSampleFormat sample_fmt);
++
++/**
++ * @}
++ * @}
++ */
++#endif /* AVUTIL_SAMPLEFMT_H */
+diff --git a/media/ffvpx/libavutil/version.h b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/version.h
+similarity index 66%
+copy from media/ffvpx/libavutil/version.h
+copy to dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/version.h
+index 2df788e529ab..ae72840c0a06 100644
+--- a/media/ffvpx/libavutil/version.h
++++ b/dom/media/platforms/ffmpeg/ffmpeg60/include/libavutil/version.h
+@@ -53,68 +53,66 @@
+ * @{
+ */
+
+-#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_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)
++#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 57
+-#define LIBAVUTIL_VERSION_MINOR 40
++#define LIBAVUTIL_VERSION_MAJOR 58
++#define LIBAVUTIL_VERSION_MINOR 3
+ #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_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)
++#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_D2STR (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_DECLARE_ALIGNED (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_COLORSPACE_NAME (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_AV_MALLOCZ_ARRAY (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_FIFO_PEEK2 (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_FIFO_OLD_API (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_OLD_CHANNEL_LAYOUT (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_AV_FOPEN_UTF8 (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_PKT_DURATION (LIBAVUTIL_VERSION_MAJOR < 58)
++#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)
+
+ /**
+ * @}
+diff --git a/dom/media/platforms/ffmpeg/ffmpeg59/moz.build b/dom/media/platforms/ffmpeg/ffmpeg60/moz.build
+similarity index 100%
+copy from dom/media/platforms/ffmpeg/ffmpeg59/moz.build
+copy to dom/media/platforms/ffmpeg/ffmpeg60/moz.build
+diff --git a/dom/media/platforms/ffmpeg/moz.build b/dom/media/platforms/ffmpeg/moz.build
+index aa3b505dabb8..f87dd00623ce 100644
+--- a/dom/media/platforms/ffmpeg/moz.build
++++ b/dom/media/platforms/ffmpeg/moz.build
+@@ -15,6 +15,7 @@ DIRS += [
+ "ffmpeg57",
+ "ffmpeg58",
+ "ffmpeg59",
++ "ffmpeg60",
+ ]
+
+ UNIFIED_SOURCES += [
+diff --git a/media/ffvpx/README_MOZILLA b/media/ffvpx/README_MOZILLA
+index b90d6020b50a..fdd0bc3531aa 100644
+--- a/media/ffvpx/README_MOZILLA
++++ b/media/ffvpx/README_MOZILLA
+@@ -32,6 +32,14 @@ Then, make sure the files:
+ include conditional compilation directives, by probably reverting them (or
+ reverting and adjusting them if new codecs are added).
+
++## 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.
++
+ ## `config.h` generation
+
+ Configuration files are generated as follow using the configure script (here
+diff --git a/media/ffvpx/changes.patch b/media/ffvpx/changes.patch
+index da7561f25489..af2aa2084940 100644
+--- a/media/ffvpx/changes.patch
++++ b/media/ffvpx/changes.patch
+@@ -46,29 +46,6 @@ index 9fb8d0a..97ad3b9 100644
+ rgba_color[0] = rgba >> 24;
+ rgba_color[1] = rgba >> 16;
+ rgba_color[2] = rgba >> 8;
+-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
+-@@ -39,17 +39,19 @@
+- # include <unistd.h>
+- #endif
+-
+-
+- #include "avassert.h"
+- #include "buffer.h"
+- #include "common.h"
+- #include "hwcontext.h"
+-+#if CONFIG_LIBDRM
+- #include "hwcontext_drm.h"
+-+#endif
+- #include "hwcontext_internal.h"
+- #include "hwcontext_vaapi.h"
+- #include "mem.h"
+- #include "pixdesc.h"
+- #include "pixfmt.h"
+-
+-
+- typedef struct VAAPIDevicePriv {
+ 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
+diff --git a/media/ffvpx/libavcodec/allcodecs.c b/media/ffvpx/libavcodec/allcodecs.c
+index 4f1d66cb0c76..e593ad19afc1 100644
+--- a/media/ffvpx/libavcodec/allcodecs.c
++++ b/media/ffvpx/libavcodec/allcodecs.c
+@@ -154,6 +154,7 @@ 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;
+@@ -286,6 +287,7 @@ extern const FFCodec ff_r210_decoder;
+ extern const FFCodec ff_rasc_decoder;
+ extern const FFCodec ff_rawvideo_encoder;
+ extern const FFCodec ff_rawvideo_decoder;
++extern const FFCodec ff_rka_decoder;
+ extern const FFCodec ff_rl2_decoder;
+ extern const FFCodec ff_roq_encoder;
+ extern const FFCodec ff_roq_decoder;
+@@ -537,6 +539,7 @@ extern const FFCodec ff_twinvq_decoder;
+ extern const FFCodec ff_vmdaudio_decoder;
+ extern const FFCodec ff_vorbis_encoder;
+ extern const FFCodec ff_vorbis_decoder;
++extern const FFCodec ff_wavarc_decoder;
+ extern const FFCodec ff_wavpack_encoder;
+ extern const FFCodec ff_wavpack_decoder;
+ extern const FFCodec ff_wmalossless_decoder;
+@@ -619,14 +622,16 @@ extern const FFCodec ff_pcm_vidc_encoder;
+ extern const FFCodec ff_pcm_vidc_decoder;
+
+ /* DPCM codecs */
++extern const FFCodec ff_cbd2_dpcm_decoder;
+ extern const FFCodec ff_derf_dpcm_decoder;
+ extern const FFCodec ff_gremlin_dpcm_decoder;
+ extern const FFCodec ff_interplay_dpcm_decoder;
+ extern const FFCodec ff_roq_dpcm_encoder;
+ extern const FFCodec ff_roq_dpcm_decoder;
+ extern const FFCodec ff_sdx2_dpcm_decoder;
+ extern const FFCodec ff_sol_dpcm_decoder;
+ extern const FFCodec ff_xan_dpcm_decoder;
++extern const FFCodec ff_wady_dpcm_decoder;
+
+ /* ADPCM codecs */
+ extern const FFCodec ff_adpcm_4xm_decoder;
+@@ -692,6 +697,7 @@ extern const FFCodec ff_adpcm_thp_decoder;
+ extern const FFCodec ff_adpcm_thp_le_decoder;
+ extern const FFCodec ff_adpcm_vima_decoder;
+ extern const FFCodec ff_adpcm_xa_decoder;
++extern const FFCodec ff_adpcm_xmd_decoder;
+ extern const FFCodec ff_adpcm_yamaha_encoder;
+ extern const FFCodec ff_adpcm_yamaha_decoder;
+ extern const FFCodec ff_adpcm_zork_decoder;
+@@ -827,22 +833,26 @@ extern const FFCodec ff_libaom_av1_decoder;
+ /* hwaccel hooks only, so prefer external decoders */
+ extern const FFCodec ff_av1_decoder;
+ extern const FFCodec ff_av1_cuvid_decoder;
++extern const FFCodec ff_av1_mediacodec_decoder;
++extern const FFCodec ff_av1_nvenc_encoder;
+ extern const FFCodec ff_av1_qsv_decoder;
+ extern const FFCodec ff_av1_qsv_encoder;
++extern const FFCodec ff_av1_amf_encoder;
+ extern const FFCodec ff_libopenh264_encoder;
+ extern const FFCodec ff_libopenh264_decoder;
+ extern const FFCodec ff_h264_amf_encoder;
+ extern const FFCodec ff_h264_cuvid_decoder;
+ extern const FFCodec ff_h264_mf_encoder;
+ extern const FFCodec ff_h264_nvenc_encoder;
+ extern const FFCodec ff_h264_omx_encoder;
+ extern const FFCodec ff_h264_qsv_encoder;
+ extern const FFCodec ff_h264_v4l2m2m_encoder;
+ extern const FFCodec ff_h264_vaapi_encoder;
+ extern const FFCodec ff_h264_videotoolbox_encoder;
+ extern const FFCodec ff_hevc_amf_encoder;
+ extern const FFCodec ff_hevc_cuvid_decoder;
+ extern const FFCodec ff_hevc_mediacodec_decoder;
++extern const FFCodec ff_hevc_mediacodec_encoder;
+ extern const FFCodec ff_hevc_mf_encoder;
+ extern const FFCodec ff_hevc_nvenc_encoder;
+ extern const FFCodec ff_hevc_qsv_encoder;
+@@ -876,6 +886,12 @@ extern const FFCodec ff_vp9_qsv_decoder;
+ extern const FFCodec ff_vp9_vaapi_encoder;
+ extern const FFCodec ff_vp9_qsv_encoder;
+
++// null codecs
++extern const FFCodec ff_vnull_decoder;
++extern const FFCodec ff_vnull_encoder;
++extern const FFCodec ff_anull_decoder;
++extern const FFCodec ff_anull_encoder;
++
+ // The iterate API is not usable with ossfuzz due to the excessive size of binaries created
+ #if CONFIG_OSSFUZZ
+ const FFCodec * codec_list[] = {
+diff --git a/media/ffvpx/libavcodec/av1_parser.c b/media/ffvpx/libavcodec/av1_parser.c
+index 4cbd7408a026..14dae92fe9f7 100644
+--- a/media/ffvpx/libavcodec/av1_parser.c
++++ b/media/ffvpx/libavcodec/av1_parser.c
+@@ -162,8 +162,11 @@ static int av1_parser_parse(AVCodecParserContext *ctx,
+ avctx->color_trc = (enum AVColorTransferCharacteristic) color->transfer_characteristics;
+ avctx->color_range = color->color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
+
+- if (avctx->framerate.num)
+- avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1}));
++ if (seq->timing_info_present_flag) {
++ const AV1RawTimingInfo *timing = &seq->timing_info;
++ av_reduce(&avctx->framerate.den, &avctx->framerate.num,
++ timing->num_units_in_display_tick, timing->time_scale, INT_MAX);
++ }
+
+ end:
+ ff_cbs_fragment_reset(td);
+diff --git a/media/ffvpx/libavcodec/av1dec.c b/media/ffvpx/libavcodec/av1dec.c
+index 0c24eac842c1..d83c902f1f82 100644
+--- a/media/ffvpx/libavcodec/av1dec.c
++++ b/media/ffvpx/libavcodec/av1dec.c
+@@ -194,7 +194,7 @@ static uint8_t get_shear_params_valid(AV1DecContext *s, int idx)
+ }
+
+ /**
+-* update gm type/params, since cbs already implemented part of this funcation,
++* update gm type/params, since cbs already implemented part of this function,
+ * so we don't need to full implement spec.
+ */
+ static void global_motion_params(AV1DecContext *s)
+@@ -567,7 +567,7 @@ static int get_pixel_format(AVCodecContext *avctx)
+ * implemented in the future, need remove this check.
+ */
+ if (!avctx->hwaccel) {
+- av_log(avctx, AV_LOG_ERROR, "Your platform doesn't suppport"
++ av_log(avctx, AV_LOG_ERROR, "Your platform doesn't support"
+ " hardware accelerated AV1 decoding.\n");
+ return AVERROR(ENOSYS);
+ }
+diff --git a/media/ffvpx/libavcodec/avcodec.c b/media/ffvpx/libavcodec/avcodec.c
+index a85d3c230932..fb1362290f5c 100644
+--- a/media/ffvpx/libavcodec/avcodec.c
++++ b/media/ffvpx/libavcodec/avcodec.c
+@@ -266,7 +266,12 @@ FF_ENABLE_DEPRECATION_WARNINGS
+ goto free_and_end;
+ }
+
+- avctx->frame_number = 0;
++ 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) &&
+@@ -349,11 +354,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
+ ret = AVERROR(EINVAL);
+ goto free_and_end;
+ }
+-
+-#if FF_API_AVCTX_TIMEBASE
+- if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
+- avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1}));
+-#endif
+ }
+ if (codec->priv_class)
+ av_assert0(*(const AVClass **)avctx->priv_data == codec->priv_class);
+@@ -386,9 +386,6 @@ void avcodec_flush_buffers(AVCodecContext *avctx)
+ av_frame_unref(avci->recon_frame);
+ } else {
+ av_packet_unref(avci->last_pkt_props);
+- while (av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1) >= 0)
+- av_packet_unref(avci->last_pkt_props);
+-
+ av_packet_unref(avci->in_pkt);
+
+ avctx->pts_correction_last_pts =
+@@ -453,13 +450,6 @@ av_cold int avcodec_close(AVCodecContext *avctx)
+ av_freep(&avci->byte_buffer);
+ av_frame_free(&avci->buffer_frame);
+ av_packet_free(&avci->buffer_pkt);
+- if (avci->pkt_props) {
+- while (av_fifo_can_read(avci->pkt_props)) {
+- av_packet_unref(avci->last_pkt_props);
+- av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
+- }
+- av_fifo_freep2(&avci->pkt_props);
+- }
+ av_packet_free(&avci->last_pkt_props);
+
+ av_packet_free(&avci->in_pkt);
+diff --git a/media/ffvpx/libavcodec/avcodec.h b/media/ffvpx/libavcodec/avcodec.h
+index 3edd8e263650..9a0fe97cad10 100644
+--- a/media/ffvpx/libavcodec/avcodec.h
++++ b/media/ffvpx/libavcodec/avcodec.h
+@@ -232,44 +232,77 @@ typedef struct RcOverride{
+ */
+ #define AV_CODEC_FLAG_DROPCHANGED (1 << 5)
+ /**
+- * 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
++ * 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
+- * AV_CODEC_CAP_ENCODER_RECON_FRAME capability.
++ * @ref AV_CODEC_CAP_ENCODER_RECON_FRAME capability.
+ */
+ #define AV_CODEC_FLAG_RECON_FRAME (1 << 6)
++/**
++ * @par decoding
++ * Request the decoder to propagate each packets 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)
+-#if FF_API_FLAG_TRUNCATED
+-/**
+- * Input bitstream might be truncated at a random location
+- * instead of only at frame boundaries.
+- *
+- * @deprecated use codec parsers for packetizing input
+- */
+-#define AV_CODEC_FLAG_TRUNCATED (1 << 16)
+-#endif
+ /**
+ * Use interlaced DCT.
+ */
+@@ -310,11 +343,6 @@ typedef struct RcOverride{
+ */
+ #define AV_CODEC_FLAG2_LOCAL_HEADER (1 << 3)
+
+-/**
+- * timecode is in drop frame format. DEPRECATED!!!!
+- */
+-#define AV_CODEC_FLAG2_DROP_FRAME_TIMECODE (1 << 13)
+-
+ /**
+ * Input bitstream might be truncated at a packet boundaries
+ * instead of only at frame boundaries.
+@@ -515,8 +543,7 @@ typedef struct AVCodecContext {
+ * (fixed_vop_rate == 0 implies that it is different from the framerate)
+ *
+ * - encoding: MUST be set by user.
+- * - decoding: the use of this field for decoding is deprecated.
+- * Use framerate instead.
++ * - decoding: unused.
+ */
+ AVRational time_base;
+
+@@ -1034,16 +1061,20 @@ typedef struct AVCodecContext {
+ */
+ 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
+@@ -1350,16 +1381,21 @@ typedef struct AVCodecContext {
+ */
+ 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
+@@ -1484,27 +1520,6 @@ typedef struct AVCodecContext {
+ */
+ int active_thread_type;
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+- /**
+- * Set by the client if its custom get_buffer() callback can be called
+- * synchronously from another thread, which allows faster multithreaded decoding.
+- * draw_horiz_band() will be called from other threads regardless of this setting.
+- * Ignored if the default get_buffer() is used.
+- * - encoding: Set by user.
+- * - decoding: Set by user.
+- *
+- * @deprecated the custom get_buffer2() callback should always be
+- * thread-safe. Thread-unsafe get_buffer2() implementations will be
+- * invalid starting with LIBAVCODEC_VERSION_MAJOR=60; in other words,
+- * libavcodec will behave as if this field was always set to 1.
+- * Callers that want to be forward compatible with future libavcodec
+- * versions should wrap access to this field in
+- * `#if LIBAVCODEC_VERSION_MAJOR < 60`
+- */
+- attribute_deprecated
+- int thread_safe_callbacks;
+-#endif
+-
+ /**
+ * The codec may call this to execute several independent things.
+ * It will return only after finishing all tasks.
+@@ -1639,6 +1654,7 @@ typedef struct AVCodecContext {
+ #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
+@@ -1805,17 +1821,6 @@ typedef struct AVCodecContext {
+ */
+ int seek_preroll;
+
+-#if FF_API_DEBUG_MV
+- /**
+- * @deprecated unused
+- */
+- attribute_deprecated
+- int debug_mv;
+-#define FF_DEBUG_VIS_MV_P_FOR 0x00000001 //visualize forward predicted MVs of P frames
+-#define FF_DEBUG_VIS_MV_B_FOR 0x00000002 //visualize forward predicted MVs of B frames
+-#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames
+-#endif
+-
+ /**
+ * custom intra quantization matrix
+ * - encoding: Set by user, can be NULL.
+@@ -1882,15 +1887,6 @@ typedef struct AVCodecContext {
+ */
+ AVBufferRef *hw_frames_ctx;
+
+-#if FF_API_SUB_TEXT_FORMAT
+- /**
+- * @deprecated unused
+- */
+- attribute_deprecated
+- int sub_text_format;
+-#define FF_SUB_TEXT_FMT_ASS 0
+-#endif
+-
+ /**
+ * 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
+@@ -2057,6 +2053,17 @@ typedef struct AVCodecContext {
+ * 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;
+ } AVCodecContext;
+
+ /**
+@@ -2253,6 +2260,22 @@ typedef struct AVHWAccel {
+ */
+ #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)
++
+ /**
+ * @}
+ */
+@@ -2358,14 +2381,6 @@ void avcodec_free_context(AVCodecContext **avctx);
+ */
+ const AVClass *avcodec_get_class(void);
+
+-#if FF_API_GET_FRAME_CLASS
+-/**
+- * @deprecated This function should not be used.
+- */
+-attribute_deprecated
+-const AVClass *avcodec_get_frame_class(void);
+-#endif
+-
+ /**
+ * Get the AVClass for AVSubtitleRect. It can be used in combination with
+ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
+@@ -2552,8 +2567,7 @@ enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos);
+ * @param[in] avpkt The input AVPacket containing the input buffer.
+ */
+ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
+- int *got_sub_ptr,
+- AVPacket *avpkt);
++ int *got_sub_ptr, const AVPacket *avpkt);
+
+ /**
+ * Supply raw packet data as input to a decoder.
+@@ -2589,95 +2603,94 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
+ * still has frames buffered, it will return them after sending
+ * a flush packet.
+ *
+- * @return 0 on success, otherwise negative error code:
+- * 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).
+- * 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)
+- * AVERROR(EINVAL): codec not opened, it is an encoder, or requires flush
+- * AVERROR(ENOMEM): failed to add packet to internal queue, or similar
+- * other errors: legitimate decoding errors
++ * @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
+ * 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.
+ *
+- * @return
+- * 0: success, a frame was returned
+- * AVERROR(EAGAIN): output is not available in this state - user must try
+- * to send new input
+- * AVERROR_EOF: the codec has been fully flushed, and there will be
+- * no more output frames
+- * AVERROR(EINVAL): codec not opened, or it is an encoder without
+- * the AV_CODEC_FLAG_RECON_FRAME flag enabled
+- * AVERROR_INPUT_CHANGED: current decoded frame has changed parameters
+- * with respect to first decoded frame. Applicable
+- * when flag AV_CODEC_FLAG_DROPCHANGED is set.
+- * other negative values: legitimate decoding errors
++ * @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
++ * AV_CODEC_FLAG_RECON_FRAME flag enabled
++ * @retval AVERROR_INPUT_CHANGED current decoded frame has changed parameters with
++ * respect to first decoded frame. Applicable when flag
++ * AV_CODEC_FLAG_DROPCHANGED is set.
++ * @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.
+- * @return 0 on success, otherwise negative error code:
+- * 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).
+- * AVERROR_EOF: the encoder has been flushed, and no new frames can
+- * be sent to it
+- * AVERROR(EINVAL): codec not opened, it is a decoder, or requires flush
+- * AVERROR(ENOMEM): failed to add packet to internal queue, or similar
+- * other errors: legitimate encoding errors
++ * @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.
+- * @return 0 on success, otherwise negative error code:
+- * AVERROR(EAGAIN): output is not available in the current state - user
+- * must try to send input
+- * AVERROR_EOF: the encoder has been fully flushed, and there will be
+- * no more output packets
+- * AVERROR(EINVAL): codec not opened, or it is a decoder
+- * other errors: legitimate encoding errors
++ * @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);
+
+diff --git a/media/ffvpx/libavcodec/avcodec.symbols b/media/ffvpx/libavcodec/avcodec.symbols
+index 491ce320c215..b15862fa506a 100644
+--- a/media/ffvpx/libavcodec/avcodec.symbols
++++ b/media/ffvpx/libavcodec/avcodec.symbols
+@@ -63,7 +63,6 @@ avcodec_find_encoder_by_name
+ avcodec_flush_buffers
+ avcodec_free_context
+ avcodec_get_class
+-avcodec_get_frame_class
+ avcodec_get_hw_config
+ avcodec_get_name
+ avcodec_get_subtitle_rect_class
+diff --git a/media/ffvpx/libavcodec/avpacket.c b/media/ffvpx/libavcodec/avpacket.c
+index bcbc4166cb40..5fef65e97aef 100644
+--- a/media/ffvpx/libavcodec/avpacket.c
++++ b/media/ffvpx/libavcodec/avpacket.c
+@@ -316,7 +316,7 @@ uint8_t *av_packet_pack_dictionary(AVDictionary *dict, size_t *size)
+ const AVDictionaryEntry *t = NULL;
+ size_t total_length = 0;
+
+- while ((t = av_dict_get(dict, "", t, AV_DICT_IGNORE_SUFFIX))) {
++ while ((t = av_dict_iterate(dict, t))) {
+ for (int i = 0; i < 2; i++) {
+ const char *str = i ? t->value : t->key;
+ const size_t len = strlen(str) + 1;
+diff --git a/media/ffvpx/libavcodec/bitstream_filters.c b/media/ffvpx/libavcodec/bitstream_filters.c
+index a3bebefe5f95..e8216819caec 100644
+--- a/media/ffvpx/libavcodec/bitstream_filters.c
++++ b/media/ffvpx/libavcodec/bitstream_filters.c
+@@ -43,6 +43,7 @@ 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;
+diff --git a/media/ffvpx/libavcodec/cbs_av1_syntax_template.c b/media/ffvpx/libavcodec/cbs_av1_syntax_template.c
+index d98d3d42dea3..e95925a493e1 100644
+--- a/media/ffvpx/libavcodec/cbs_av1_syntax_template.c
++++ b/media/ffvpx/libavcodec/cbs_av1_syntax_template.c
+@@ -1862,11 +1862,8 @@ static int FUNC(metadata_hdr_mdcv)(CodedBitstreamContext *ctx, RWContext *rw,
+ fb(16, white_point_chromaticity_x);
+ fb(16, white_point_chromaticity_y);
+
+- fc(32, luminance_max, 1, MAX_UINT_BITS(32));
+- // luminance_min must be lower than luminance_max. Convert luminance_max from
+- // 24.8 fixed point to 18.14 fixed point in order to compare them.
+- fc(32, luminance_min, 0, FFMIN(((uint64_t)current->luminance_max << 6) - 1,
+- MAX_UINT_BITS(32)));
++ fb(32, luminance_max);
++ fb(32, luminance_min);
+
+ return 0;
+ }
+diff --git a/media/ffvpx/libavcodec/codec.h b/media/ffvpx/libavcodec/codec.h
+index 77a1a3f5a296..3b1995bcfefa 100644
+--- a/media/ffvpx/libavcodec/codec.h
++++ b/media/ffvpx/libavcodec/codec.h
+@@ -50,12 +50,6 @@
+ * avcodec_default_get_buffer2 or avcodec_default_get_encode_buffer.
+ */
+ #define AV_CODEC_CAP_DR1 (1 << 1)
+-#if FF_API_FLAG_TRUNCATED
+-/**
+- * @deprecated Use parsers to always send proper frames.
+- */
+-#define AV_CODEC_CAP_TRUNCATED (1 << 3)
+-#endif
+ /**
+ * Encoder or decoder requires flushing with NULL input at the end in order to
+ * give the complete and correct output.
+@@ -125,53 +119,39 @@
+ * multithreading-capable external libraries.
+ */
+ #define AV_CODEC_CAP_OTHER_THREADS (1 << 15)
+-#if FF_API_AUTO_THREADS
+-#define AV_CODEC_CAP_AUTO_THREADS AV_CODEC_CAP_OTHER_THREADS
+-#endif
+ /**
+ * 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)
+
+-#if FF_API_UNUSED_CODEC_CAPS
+-/**
+- * Deprecated and unused. Use AVCodecDescriptor.props instead
+- */
+-#define AV_CODEC_CAP_INTRA_ONLY 0x40000000
+-/**
+- * Deprecated and unused. Use AVCodecDescriptor.props instead
+- */
+-#define AV_CODEC_CAP_LOSSLESS 0x80000000
+-#endif
+-
+ /**
+ * 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 codec takes the reordered_opaque field from input AVFrames
+- * and returns it in the corresponding field in AVCodecContext after
+- * encoding.
++ * 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)
+
+diff --git a/media/ffvpx/libavcodec/codec_desc.c b/media/ffvpx/libavcodec/codec_desc.c
+index 24a0433dbac9..199f62df15b1 100644
+--- a/media/ffvpx/libavcodec/codec_desc.c
++++ b/media/ffvpx/libavcodec/codec_desc.c
+@@ -2536,6 +2536,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Acorn Replay"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
++ {
++ .id = AV_CODEC_ID_ADPCM_XMD,
++ .type = AVMEDIA_TYPE_AUDIO,
++ .name = "adpcm_xmd",
++ .long_name = NULL_IF_CONFIG_SMALL("ADPCM Konami XMD"),
++ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
++ },
+
+ /* AMR */
+ {
+@@ -2619,6 +2626,20 @@ static const AVCodecDescriptor codec_descriptors[] = {
+ .long_name = NULL_IF_CONFIG_SMALL("DPCM Xilam DERF"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
++ {
++ .id = AV_CODEC_ID_WADY_DPCM,
++ .type = AVMEDIA_TYPE_AUDIO,
++ .name = "wady_dpcm",
++ .long_name = NULL_IF_CONFIG_SMALL("DPCM Marble WADY"),
++ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
++ },
++ {
++ .id = AV_CODEC_ID_CBD2_DPCM,
++ .type = AVMEDIA_TYPE_AUDIO,
++ .name = "cbd2_dpcm",
++ .long_name = NULL_IF_CONFIG_SMALL("DPCM Cuberoot-Delta-Exact"),
++ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
++ },
+
+ /* audio codecs */
+ {
+@@ -3332,6 +3353,20 @@ static const AVCodecDescriptor codec_descriptors[] = {
+ .long_name = NULL_IF_CONFIG_SMALL("FTR Voice"),
+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+ },
++ {
++ .id = AV_CODEC_ID_WAVARC,
++ .type = AVMEDIA_TYPE_AUDIO,
++ .name = "wavarc",
++ .long_name = NULL_IF_CONFIG_SMALL("Waveform Archiver"),
++ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
++ },
++ {
++ .id = AV_CODEC_ID_RKA,
++ .type = AVMEDIA_TYPE_AUDIO,
++ .name = "rka",
++ .long_name = NULL_IF_CONFIG_SMALL("RKA (RK Audio)"),
++ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY | AV_CODEC_PROP_LOSSLESS,
++ },
+
+ /* subtitle codecs */
+ {
+@@ -3604,6 +3639,18 @@ static const AVCodecDescriptor codec_descriptors[] = {
+ .long_name = NULL_IF_CONFIG_SMALL("AVFrame to AVPacket passthrough"),
+ .props = AV_CODEC_PROP_LOSSLESS,
+ },
++ {
++ .id = AV_CODEC_ID_VNULL,
++ .type = AVMEDIA_TYPE_VIDEO,
++ .name = "vnull",
++ .long_name = NULL_IF_CONFIG_SMALL("Null video codec"),
++ },
++ {
++ .id = AV_CODEC_ID_ANULL,
++ .type = AVMEDIA_TYPE_AUDIO,
++ .name = "anull",
++ .long_name = NULL_IF_CONFIG_SMALL("Null audio codec"),
++ },
+ };
+
+ static int descriptor_compare(const void *key, const void *member)
+diff --git a/media/ffvpx/libavcodec/codec_id.h b/media/ffvpx/libavcodec/codec_id.h
+index f436a2b624f4..89a4a0cb893a 100644
+--- a/media/ffvpx/libavcodec/codec_id.h
++++ b/media/ffvpx/libavcodec/codec_id.h
+@@ -413,23 +413,26 @@ enum AVCodecID {
+ 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,
+@@ -533,6 +536,8 @@ enum AVCodecID {
+ AV_CODEC_ID_MISC4,
+ AV_CODEC_ID_APAC,
+ AV_CODEC_ID_FTR,
++ AV_CODEC_ID_WAVARC,
++ AV_CODEC_ID_RKA,
+
+ /* subtitle codecs */
+ AV_CODEC_ID_FIRST_SUBTITLE = 0x17000, ///< A dummy ID pointing at the start of subtitle codecs.
+@@ -587,6 +592,16 @@ enum AVCodecID {
+ * 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,
+ };
+
+ /**
+diff --git a/media/ffvpx/libavcodec/codec_internal.h b/media/ffvpx/libavcodec/codec_internal.h
+index e3b77e6deaf2..130a7dc3cd77 100644
+--- a/media/ffvpx/libavcodec/codec_internal.h
++++ b/media/ffvpx/libavcodec/codec_internal.h
+@@ -80,6 +80,14 @@
+ * Codec supports embedded ICC profiles (AV_FRAME_DATA_ICC_PROFILE).
+ */
+ #define FF_CODEC_CAP_ICC_PROFILES (1 << 9)
++/**
++ * The encoder has AV_CODEC_CAP_DELAY set, but does not actually have delay - it
++ * only wants to be flushed at the end to update some context variables (e.g.
++ * 2pass stats) or produce a trailing packet. Besides that it immediately
++ * produces exactly one output packet per each input frame, just as no-delay
++ * encoders do.
++ */
++#define FF_CODEC_CAP_EOF_FLUSH (1 << 10)
+
+ /**
+ * FFCodec.codec_tags termination value
+diff --git a/media/ffvpx/libavcodec/decode.c b/media/ffvpx/libavcodec/decode.c
+index 6be2d3d6edfe..be2be81089fc 100644
+--- a/media/ffvpx/libavcodec/decode.c
++++ b/media/ffvpx/libavcodec/decode.c
+@@ -132,38 +132,16 @@ fail2:
+ return 0;
+ }
+
+-#define IS_EMPTY(pkt) (!(pkt)->data)
+-
+-static int copy_packet_props(AVPacket *dst, const AVPacket *src)
+-{
+- int ret = av_packet_copy_props(dst, src);
+- if (ret < 0)
+- return ret;
+-
+- dst->size = src->size; // HACK: Needed for ff_decode_frame_props().
+- dst->data = (void*)1; // HACK: Needed for IS_EMPTY().
+-
+- return 0;
+-}
+-
+ static int extract_packet_props(AVCodecInternal *avci, const AVPacket *pkt)
+ {
+- AVPacket tmp = { 0 };
+ int ret = 0;
+
+- if (IS_EMPTY(avci->last_pkt_props)) {
+- if (av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1) < 0)
+- return copy_packet_props(avci->last_pkt_props, pkt);
++ av_packet_unref(avci->last_pkt_props);
++ if (pkt) {
++ ret = av_packet_copy_props(avci->last_pkt_props, pkt);
++ if (!ret)
++ avci->last_pkt_props->opaque = (void *)(intptr_t)pkt->size; // Needed for ff_decode_frame_props().
+ }
+-
+- ret = copy_packet_props(&tmp, pkt);
+- if (ret < 0)
+- return ret;
+-
+- ret = av_fifo_write(avci->pkt_props, &tmp, 1);
+- if (ret < 0)
+- av_packet_unref(&tmp);
+-
+ return ret;
+ }
+
+@@ -449,50 +427,41 @@ FF_ENABLE_DEPRECATION_WARNINGS
+ if (!got_frame)
+ av_frame_unref(frame);
+
+-#if FF_API_FLAG_TRUNCATED
+- if (ret >= 0 && avctx->codec->type == AVMEDIA_TYPE_VIDEO && !(avctx->flags & AV_CODEC_FLAG_TRUNCATED))
+-#else
+ if (ret >= 0 && avctx->codec->type == AVMEDIA_TYPE_VIDEO)
+-#endif
+ ret = pkt->size;
+
+-#if FF_API_AVCTX_TIMEBASE
+- if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
+- avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1}));
+-#endif
+-
+ /* do not stop draining when actual_got_frame != 0 or ret < 0 */
+ /* got_frame == 0 but actual_got_frame != 0 when frame is discarded */
+ if (avci->draining && !actual_got_frame) {
+ if (ret < 0) {
+ /* prevent infinite loop if a decoder wrongly always return error on draining */
+ /* reasonable nb_errors_max = maximum b frames + thread count */
+ int nb_errors_max = 20 + (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME ?
+ avctx->thread_count : 1);
+
+ if (avci->nb_draining_errors++ >= nb_errors_max) {
+ av_log(avctx, AV_LOG_ERROR, "Too many errors when draining, this is a bug. "
+ "Stop draining and force EOF.\n");
+ avci->draining_done = 1;
+ ret = AVERROR_BUG;
+ }
+ } else {
+ avci->draining_done = 1;
+ }
+ }
+
+ if (ret >= pkt->size || ret < 0) {
+ av_packet_unref(pkt);
+- av_packet_unref(avci->last_pkt_props);
+ } else {
+ int consumed = ret;
+
+ pkt->data += consumed;
+ pkt->size -= consumed;
+ pkt->pts = AV_NOPTS_VALUE;
+ pkt->dts = AV_NOPTS_VALUE;
+ if (!(codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
+- avci->last_pkt_props->size -= consumed; // See extract_packet_props() comment.
++ // See extract_packet_props() comment.
++ avci->last_pkt_props->opaque = (void *)((intptr_t)avci->last_pkt_props->opaque - consumed);
+ avci->last_pkt_props->pts = AV_NOPTS_VALUE;
+ avci->last_pkt_props->dts = AV_NOPTS_VALUE;
+ }
+@@ -578,27 +547,19 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
+
+ if (codec->cb_type == FF_CODEC_CB_TYPE_RECEIVE_FRAME) {
+ ret = codec->cb.receive_frame(avctx, frame);
+- if (ret != AVERROR(EAGAIN))
+- av_packet_unref(avci->last_pkt_props);
+ } else
+ ret = decode_simple_receive_frame(avctx, frame);
+
+ if (ret == AVERROR_EOF)
+ avci->draining_done = 1;
+
+ /* preserve ret */
+ ok = detect_colorspace(avctx, frame);
+ if (ok < 0) {
+ av_frame_unref(frame);
+ return ok;
+ }
+
+- if (!(codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS) &&
+- IS_EMPTY(avci->last_pkt_props)) {
+- // May fail if the FIFO is empty.
+- av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
+- }
+-
+ if (!ret) {
+ frame->best_effort_timestamp = guess_correct_pts(avctx,
+ frame->pts,
+@@ -697,91 +658,126 @@ static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
+ AV_FRAME_CROP_UNALIGNED : 0);
+ }
+
++// make sure frames returned to the caller are valid
++static int frame_validate(AVCodecContext *avctx, AVFrame *frame)
++{
++ if (!frame->buf[0] || frame->format < 0)
++ goto fail;
++
++ switch (avctx->codec_type) {
++ case AVMEDIA_TYPE_VIDEO:
++ if (frame->width <= 0 || frame->height <= 0)
++ goto fail;
++ break;
++ case AVMEDIA_TYPE_AUDIO:
++ if (!av_channel_layout_check(&frame->ch_layout) ||
++ frame->sample_rate <= 0)
++ goto fail;
++
++ break;
++ default: av_assert0(0);
++ }
++
++ return 0;
++fail:
++ av_log(avctx, AV_LOG_ERROR, "An invalid frame was output by a decoder. "
++ "This is a bug, please report it.\n");
++ return AVERROR_BUG;
++}
++
+ int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame)
+ {
+ AVCodecInternal *avci = avctx->internal;
+ int ret, changed;
+
+ if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))
+ return AVERROR(EINVAL);
+
+ if (avci->buffer_frame->buf[0]) {
+ av_frame_move_ref(frame, avci->buffer_frame);
+ } else {
+ ret = decode_receive_frame_internal(avctx, frame);
+ if (ret < 0)
+ return ret;
+ }
+
++ ret = frame_validate(avctx, frame);
++ if (ret < 0)
++ goto fail;
++
+ if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+ ret = apply_cropping(avctx, frame);
+- if (ret < 0) {
+- av_frame_unref(frame);
+- return ret;
+- }
++ if (ret < 0)
++ goto fail;
+ }
+
+- avctx->frame_number++;
++ 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 (avctx->flags & AV_CODEC_FLAG_DROPCHANGED) {
+
+- if (avctx->frame_number == 1) {
++ if (avctx->frame_num == 1) {
+ avci->initial_format = frame->format;
+ switch(avctx->codec_type) {
+ case AVMEDIA_TYPE_VIDEO:
+ avci->initial_width = frame->width;
+ avci->initial_height = frame->height;
+ break;
+ case AVMEDIA_TYPE_AUDIO:
+ avci->initial_sample_rate = frame->sample_rate ? frame->sample_rate :
+ avctx->sample_rate;
+ ret = av_channel_layout_copy(&avci->initial_ch_layout, &frame->ch_layout);
+- if (ret < 0) {
+- av_frame_unref(frame);
+- return ret;
+- }
++ if (ret < 0)
++ goto fail;
+ break;
+ }
+ }
+
+- if (avctx->frame_number > 1) {
++ if (avctx->frame_num > 1) {
+ changed = avci->initial_format != frame->format;
+
+ switch(avctx->codec_type) {
+ case AVMEDIA_TYPE_VIDEO:
+ changed |= avci->initial_width != frame->width ||
+ avci->initial_height != frame->height;
+ break;
+ case AVMEDIA_TYPE_AUDIO:
+ changed |= avci->initial_sample_rate != frame->sample_rate ||
+ avci->initial_sample_rate != avctx->sample_rate ||
+ av_channel_layout_compare(&avci->initial_ch_layout, &frame->ch_layout);
+ break;
+ }
+
+ if (changed) {
+ avci->changed_frames_dropped++;
+- av_log(avctx, AV_LOG_INFO, "dropped changed frame #%d pts %"PRId64
++ av_log(avctx, AV_LOG_INFO, "dropped changed frame #%"PRId64" pts %"PRId64
+ " drop count: %d \n",
+- avctx->frame_number, frame->pts,
++ avctx->frame_num, frame->pts,
+ avci->changed_frames_dropped);
+- av_frame_unref(frame);
+- return AVERROR_INPUT_CHANGED;
++ ret = AVERROR_INPUT_CHANGED;
++ goto fail;
+ }
+ }
+ }
+ return 0;
++fail:
++ av_frame_unref(frame);
++ return ret;
+ }
+
+ static void get_subtitle_defaults(AVSubtitle *sub)
+ {
+ memset(sub, 0, sizeof(*sub));
+ sub->pts = AV_NOPTS_VALUE;
+ }
+
+ #define UTF8_MAX_BYTES 4 /* 5 and 6 bytes sequences should not be used */
+-static int recode_subtitle(AVCodecContext *avctx, AVPacket **outpkt,
+- AVPacket *inpkt, AVPacket *buf_pkt)
++static int recode_subtitle(AVCodecContext *avctx, const AVPacket **outpkt,
++ const AVPacket *inpkt, AVPacket *buf_pkt)
+ {
+ #if CONFIG_ICONV
+ iconv_t cd = (iconv_t)-1;
+@@ -861,28 +857,27 @@ static int utf8_check(const uint8_t *str)
+ }
+
+ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
+- int *got_sub_ptr,
+- AVPacket *avpkt)
++ int *got_sub_ptr, const AVPacket *avpkt)
+ {
+ 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");
+ 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;
+- AVPacket *pkt;
++ const AVPacket *pkt;
+
+ ret = recode_subtitle(avctx, &pkt, avpkt, avci->buffer_pkt);
+ if (ret < 0)
+@@ -926,7 +921,12 @@ int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
+ }
+
+ if (*got_sub_ptr)
+- avctx->frame_number++;
++ 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;
+@@ -1291,54 +1291,77 @@ static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
+ return av_packet_unpack_dictionary(side_metadata, size, frame_md);
+ }
+
+-int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
++int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx,
++ AVFrame *frame, const AVPacket *pkt)
+ {
+- AVPacket *pkt = avctx->internal->last_pkt_props;
+ static const struct {
+ enum AVPacketSideDataType packet;
+ enum AVFrameSideDataType frame;
+ } sd[] = {
+ { 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_A53_CC, AV_FRAME_DATA_A53_CC },
+ { AV_PKT_DATA_ICC_PROFILE, AV_FRAME_DATA_ICC_PROFILE },
+ { AV_PKT_DATA_S12M_TIMECODE, AV_FRAME_DATA_S12M_TIMECODE },
+ { AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS },
+ };
+
+- if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
+- frame->pts = pkt->pts;
+- frame->pkt_pos = pkt->pos;
+- frame->duration = pkt->duration;
+- frame->pkt_size = pkt->size;
++ frame->pts = pkt->pts;
++ frame->pkt_pos = pkt->pos;
++ frame->duration = pkt->duration;
++ frame->pkt_size = pkt->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);
+- if (packet_sd) {
+- AVFrameSideData *frame_sd = av_frame_new_side_data(frame,
+- sd[i].frame,
+- size);
+- if (!frame_sd)
+- return AVERROR(ENOMEM);
++ 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);
++ if (packet_sd) {
++ AVFrameSideData *frame_sd = av_frame_new_side_data(frame,
++ sd[i].frame,
++ size);
++ if (!frame_sd)
++ return AVERROR(ENOMEM);
+
+- memcpy(frame_sd->data, packet_sd, size);
+- }
+- }
+- add_metadata_from_side_data(pkt, frame);
+-
+- if (pkt->flags & AV_PKT_FLAG_DISCARD) {
+- frame->flags |= AV_FRAME_FLAG_DISCARD;
+- } else {
+- frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD);
++ memcpy(frame_sd->data, packet_sd, size);
+ }
+ }
++ add_metadata_from_side_data(pkt, frame);
++
++ if (pkt->flags & AV_PKT_FLAG_DISCARD) {
++ frame->flags |= AV_FRAME_FLAG_DISCARD;
++ } else {
++ frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD);
++ }
++
++ if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
++ int ret = av_buffer_replace(&frame->opaque_ref, pkt->opaque_ref);
++ if (ret < 0)
++ return ret;
++ frame->opaque = pkt->opaque;
++ }
++
++ return 0;
++}
++
++int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
++{
++ const AVPacket *pkt = avctx->internal->last_pkt_props;
++
++ if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
++ int ret = ff_decode_frame_props_from_pkt(avctx, frame, pkt);
++ if (ret < 0)
++ return ret;
++ frame->pkt_size = (int)(intptr_t)pkt->opaque;
++ }
++#if FF_API_REORDERED_OPAQUE
++FF_DISABLE_DEPRECATION_WARNINGS
+ frame->reordered_opaque = avctx->reordered_opaque;
++FF_ENABLE_DEPRECATION_WARNINGS
++#endif
+
+ if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED)
+ frame->color_primaries = avctx->color_primaries;
+@@ -1582,19 +1605,6 @@ int ff_decode_preinit(AVCodecContext *avctx)
+ * free the already allocated subtitle_header before overwriting it */
+ av_freep(&avctx->subtitle_header);
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+-FF_DISABLE_DEPRECATION_WARNINGS
+- if ((avctx->thread_type & FF_THREAD_FRAME) &&
+- avctx->get_buffer2 != avcodec_default_get_buffer2 &&
+- !avctx->thread_safe_callbacks) {
+- av_log(avctx, AV_LOG_WARNING, "Requested frame threading with a "
+- "custom get_buffer2() implementation which is not marked as "
+- "thread safe. This is not supported anymore, make your "
+- "callback thread-safe.\n");
+- }
+-FF_ENABLE_DEPRECATION_WARNINGS
+-#endif
+-
+ 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",
+ avctx->codec->max_lowres);
+@@ -1651,9 +1661,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
+
+ avci->in_pkt = av_packet_alloc();
+ avci->last_pkt_props = av_packet_alloc();
+- avci->pkt_props = av_fifo_alloc2(1, sizeof(*avci->last_pkt_props),
+- AV_FIFO_FLAG_AUTO_GROW);
+- if (!avci->in_pkt || !avci->last_pkt_props || !avci->pkt_props)
++ if (!avci->in_pkt || !avci->last_pkt_props)
+ return AVERROR(ENOMEM);
+
+ ret = decode_bsfs_init(avctx);
+diff --git a/media/ffvpx/libavcodec/decode.h b/media/ffvpx/libavcodec/decode.h
+index 5d95369b5e80..8430ffbd6648 100644
+--- a/media/ffvpx/libavcodec/decode.h
++++ b/media/ffvpx/libavcodec/decode.h
+@@ -69,6 +69,12 @@ int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame);
+ */
+ int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt);
+
++/**
++ * Set various frame properties from the provided packet.
++ */
++int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx,
++ AVFrame *frame, const AVPacket *pkt);
++
+ /**
+ * Set various frame properties from the codec context / packet data.
+ */
+diff --git a/media/ffvpx/libavcodec/encode.c b/media/ffvpx/libavcodec/encode.c
+index fbe2c97cd627..041fc7670e5d 100644
+--- a/media/ffvpx/libavcodec/encode.c
++++ b/media/ffvpx/libavcodec/encode.c
+@@ -171,70 +171,102 @@ int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
+ }
+
+ ret = ffcodec(avctx->codec)->cb.encode_sub(avctx, buf, buf_size, sub);
+- avctx->frame_number++;
++ 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)
+ return AVERROR_EOF;
+
+ if (!avci->buffer_frame->buf[0])
+ return AVERROR(EAGAIN);
+
+ av_frame_move_ref(frame, avci->buffer_frame);
+
+ 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;
++}
++
+ int ff_encode_encode_cb(AVCodecContext *avctx, AVPacket *avpkt,
+ AVFrame *frame, int *got_packet)
+ {
+ const FFCodec *const codec = ffcodec(avctx->codec);
+ int ret;
+
+ ret = codec->cb.encode(avctx, avpkt, frame, got_packet);
+ emms_c();
+ av_assert0(ret <= 0);
+
+ if (!ret && *got_packet) {
+ if (avpkt->data) {
+ ret = encode_make_refcounted(avctx, avpkt);
+ if (ret < 0)
+ goto unref;
+ // Date returned by encoders must always be ref-counted
+ av_assert0(avpkt->buf);
+ }
+
+ // set the timestamps for the simple no-delay case
+ // encoders with delay have to set the timestamps themselves
+- if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) {
++ if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) ||
++ (frame && (codec->caps_internal & FF_CODEC_CAP_EOF_FLUSH))) {
+ if (avpkt->pts == AV_NOPTS_VALUE)
+ avpkt->pts = frame->pts;
+
+- if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
+- if (!avpkt->duration)
++ if (!avpkt->duration) {
++ if (frame->duration)
++ avpkt->duration = frame->duration;
++ else if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
+ avpkt->duration = ff_samples_to_time_base(avctx,
+ frame->nb_samples);
++ }
+ }
++
++ ret = ff_encode_reordered_opaque(avctx, avpkt, frame);
++ if (ret < 0)
++ goto unref;
+ }
+
+ // dts equals pts unless there is reordering
+ // there can be no reordering if there is no encoder delay
+ if (!(avctx->codec_descriptor->props & AV_CODEC_PROP_REORDER) ||
+- !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY))
++ !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) ||
++ (codec->caps_internal & FF_CODEC_CAP_EOF_FLUSH))
+ avpkt->dts = avpkt->pts;
+ } else {
+ unref:
+ av_packet_unref(avpkt);
+ }
+-#if !FF_API_THREAD_SAFE_CALLBACKS
++
+ if (frame)
+ av_frame_unref(frame);
+-#endif
+
+ return ret;
+ }
+@@ -275,10 +307,6 @@ static int encode_simple_internal(AVCodecContext *avctx, AVPacket *avpkt)
+ ret = ff_thread_video_encode_frame(avctx, avpkt, frame, &got_packet);
+ else {
+ ret = ff_encode_encode_cb(avctx, avpkt, frame, &got_packet);
+-#if FF_API_THREAD_SAFE_CALLBACKS
+- if (frame)
+- av_frame_unref(frame);
+-#endif
+ }
+
+ if (avci->draining && !got_packet)
+@@ -442,6 +470,13 @@ FF_ENABLE_DEPRECATION_WARNINGS
+ return ret;
+ }
+
++ // unset frame duration unless AV_CODEC_FLAG_FRAME_DURATION is set,
++ // since otherwise we cannot be sure that whatever value it has is in the
++ // right timebase, so we would produce an incorrect value, which is worse
++ // than none at all
++ if (!(avctx->flags & AV_CODEC_FLAG_FRAME_DURATION))
++ dst->duration = 0;
++
+ return 0;
+ }
+
+@@ -473,7 +508,12 @@ int attribute_align_arg avcodec_send_frame(AVCodecContext *avctx, const AVFrame
+ return ret;
+ }
+
+- avctx->frame_number++;
++ 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;
+ }
+@@ -634,6 +674,13 @@ int ff_encode_preinit(AVCodecContext *avctx)
+ return AVERROR(EINVAL);
+ }
+
++ if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE &&
++ !(avctx->codec->capabilities & AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE)) {
++ av_log(avctx, AV_LOG_ERROR, "The copy_opaque flag is set, but the "
++ "encoder does not support it.\n");
++ return AVERROR(EINVAL);
++ }
++
+ switch (avctx->codec_type) {
+ case AVMEDIA_TYPE_VIDEO: ret = encode_preinit_video(avctx); break;
+ case AVMEDIA_TYPE_AUDIO: ret = encode_preinit_audio(avctx); break;
+diff --git a/media/ffvpx/libavcodec/encode.h b/media/ffvpx/libavcodec/encode.h
+index 81d18d6eadf6..26a3304045bd 100644
+--- a/media/ffvpx/libavcodec/encode.h
++++ b/media/ffvpx/libavcodec/encode.h
+@@ -69,6 +69,12 @@ int ff_encode_alloc_frame(AVCodecContext *avctx, AVFrame *frame);
+ */
+ int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size);
+
++/**
++ * Propagate user opaque values from the frame to avctx/pkt as needed.
++ */
++int ff_encode_reordered_opaque(AVCodecContext *avctx,
++ AVPacket *pkt, const AVFrame *frame);
++
+ /*
+ * Perform encoder initialization and validation.
+ * Called when opening the encoder, before the FFCodec.init() call.
+diff --git a/media/ffvpx/libavcodec/flac.c b/media/ffvpx/libavcodec/flac.c
+index 352d663c67d8..174b4801beab 100644
+--- a/media/ffvpx/libavcodec/flac.c
++++ b/media/ffvpx/libavcodec/flac.c
+@@ -28,7 +28,7 @@
+ #include "flacdata.h"
+ #include "flac_parse.h"
+
+-static const int8_t sample_size_table[] = { 0, 8, 12, 0, 16, 20, 24, 0 };
++static const int8_t sample_size_table[] = { 0, 8, 12, 0, 16, 20, 24, 32 };
+
+ static const AVChannelLayout flac_channel_layouts[8] = {
+ AV_CHANNEL_LAYOUT_MONO,
+@@ -82,7 +82,7 @@ int ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb,
+
+ /* bits per sample */
+ bps_code = get_bits(gb, 3);
+- if (bps_code == 3 || bps_code == 7) {
++ if (bps_code == 3) {
+ av_log(avctx, AV_LOG_ERROR + log_level_offset,
+ "invalid sample size code (%d)\n",
+ bps_code);
+diff --git a/media/ffvpx/libavcodec/flacdec.c b/media/ffvpx/libavcodec/flacdec.c
+index 5b8547a98f51..cc778a8dff19 100644
+--- a/media/ffvpx/libavcodec/flacdec.c
++++ b/media/ffvpx/libavcodec/flacdec.c
+@@ -64,6 +64,9 @@ typedef struct FLACContext {
+ int32_t *decoded[FLAC_MAX_CHANNELS]; ///< decoded samples
+ uint8_t *decoded_buffer;
+ unsigned int decoded_buffer_size;
++ int64_t *decoded_33bps; ///< decoded samples for a 33 bps subframe
++ uint8_t *decoded_buffer_33bps;
++ unsigned int decoded_buffer_size_33bps;
+ int buggy_lpc; ///< use workaround for old lavc encoded files
+
+ FLACDSPContext dsp;
+@@ -154,6 +157,24 @@ static int allocate_buffers(FLACContext *s)
+ s->stream_info.channels,
+ s->stream_info.max_blocksize,
+ AV_SAMPLE_FMT_S32P, 0);
++ if (ret >= 0 && s->stream_info.bps == 32 && s->stream_info.channels == 2) {
++ buf_size = av_samples_get_buffer_size(NULL, 1,
++ s->stream_info.max_blocksize,
++ AV_SAMPLE_FMT_S64P, 0);
++ if (buf_size < 0)
++ return buf_size;
++
++ av_fast_malloc(&s->decoded_buffer_33bps, &s->decoded_buffer_size_33bps, buf_size);
++ if (!s->decoded_buffer_33bps)
++ return AVERROR(ENOMEM);
++
++ ret = av_samples_fill_arrays((uint8_t **)&s->decoded_33bps, NULL,
++ s->decoded_buffer_33bps,
++ 1,
++ s->stream_info.max_blocksize,
++ AV_SAMPLE_FMT_S64P, 0);
++
++ }
+ return ret < 0 ? ret : 0;
+ }
+
+@@ -331,6 +352,62 @@ static int decode_subframe_fixed(FLACContext *s, int32_t *decoded,
+ return 0;
+ }
+
++#define DECODER_SUBFRAME_FIXED_WIDE(residual) { \
++ const int blocksize = s->blocksize; \
++ int ret; \
++ \
++ if ((ret = decode_residuals(s, residual, pred_order)) < 0) \
++ return ret; \
++ \
++ switch (pred_order) { \
++ case 0: \
++ for (int i = pred_order; i < blocksize; i++) \
++ decoded[i] = residual[i]; \
++ break; \
++ case 1: \
++ for (int i = pred_order; i < blocksize; i++) \
++ decoded[i] = (int64_t)residual[i] + (int64_t)decoded[i-1];\
++ break; \
++ case 2: \
++ for (int i = pred_order; i < blocksize; i++) \
++ decoded[i] = (int64_t)residual[i] + 2*(int64_t)decoded[i-1] - (int64_t)decoded[i-2]; \
++ break; \
++ case 3: \
++ for (int i = pred_order; i < blocksize; i++) \
++ decoded[i] = (int64_t)residual[i] + 3*(int64_t)decoded[i-1] - 3*(int64_t)decoded[i-2] + (int64_t)decoded[i-3]; \
++ break; \
++ case 4: \
++ for (int i = pred_order; i < blocksize; i++) \
++ decoded[i] = (int64_t)residual[i] + 4*(int64_t)decoded[i-1] - 6*(int64_t)decoded[i-2] + 4*(int64_t)decoded[i-3] - (int64_t)decoded[i-4]; \
++ break; \
++ default: \
++ av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order); \
++ return AVERROR_INVALIDDATA; \
++ } \
++ return 0; \
++}
++
++static int decode_subframe_fixed_wide(FLACContext *s, int32_t *decoded,
++ int pred_order, int bps)
++{
++ /* warm up samples */
++ for (int i = 0; i < pred_order; i++) {
++ decoded[i] = get_sbits_long(&s->gb, bps);
++ }
++ DECODER_SUBFRAME_FIXED_WIDE(decoded);
++}
++
++
++static int decode_subframe_fixed_33bps(FLACContext *s, int64_t *decoded,
++ int32_t *residual, int pred_order)
++{
++ /* warm up samples */ \
++ for (int i = 0; i < pred_order; i++) { \
++ decoded[i] = get_sbits64(&s->gb, 33); \
++ } \
++ DECODER_SUBFRAME_FIXED_WIDE(residual);
++}
++
+ static void lpc_analyze_remodulate(SUINT32 *decoded, const int coeffs[32],
+ int order, int qlevel, int len, int bps)
+ {
+@@ -402,68 +479,138 @@ static int decode_subframe_lpc(FLACContext *s, int32_t *decoded, int pred_order,
+ return 0;
+ }
+
++static int decode_subframe_lpc_33bps(FLACContext *s, int64_t *decoded,
++ int32_t *residual, int pred_order)
++{
++ int i, j, ret;
++ int coeff_prec, qlevel;
++ int coeffs[32];
++
++ /* warm up samples */
++ for (i = 0; i < pred_order; i++) {
++ decoded[i] = get_sbits64(&s->gb, 33);
++ }
++
++ coeff_prec = get_bits(&s->gb, 4) + 1;
++ if (coeff_prec == 16) {
++ av_log(s->avctx, AV_LOG_ERROR, "invalid coeff precision\n");
++ return AVERROR_INVALIDDATA;
++ }
++ qlevel = get_sbits(&s->gb, 5);
++ if (qlevel < 0) {
++ av_log(s->avctx, AV_LOG_ERROR, "qlevel %d not supported, maybe buggy stream\n",
++ qlevel);
++ return AVERROR_INVALIDDATA;
++ }
++
++ for (i = 0; i < pred_order; i++) {
++ coeffs[pred_order - i - 1] = get_sbits(&s->gb, coeff_prec);
++ }
++
++ if ((ret = decode_residuals(s, residual, pred_order)) < 0)
++ return ret;
++
++ for (i = pred_order; i < s->blocksize; i++, decoded++) {
++ int64_t sum = 0;
++ for (j = 0; j < pred_order; j++)
++ sum += (int64_t)coeffs[j] * decoded[j];
++ decoded[j] = residual[i] + (sum >> qlevel);
++ }
++
++ return 0;
++}
++
+ static inline int decode_subframe(FLACContext *s, int channel)
+ {
+ int32_t *decoded = s->decoded[channel];
+ int type, wasted = 0;
+ int bps = s->stream_info.bps;
+- int i, tmp, ret;
++ int i, ret;
+
+ if (channel == 0) {
+ if (s->ch_mode == FLAC_CHMODE_RIGHT_SIDE)
+ bps++;
+ } else {
+ if (s->ch_mode == FLAC_CHMODE_LEFT_SIDE || s->ch_mode == FLAC_CHMODE_MID_SIDE)
+ bps++;
+ }
+
+ if (get_bits1(&s->gb)) {
+ av_log(s->avctx, AV_LOG_ERROR, "invalid subframe padding\n");
+ return AVERROR_INVALIDDATA;
+ }
+ type = get_bits(&s->gb, 6);
+
+ if (get_bits1(&s->gb)) {
+ int left = get_bits_left(&s->gb);
+ if ( left <= 0 ||
+ (left < bps && !show_bits_long(&s->gb, left)) ||
+- !show_bits_long(&s->gb, bps)) {
++ !show_bits_long(&s->gb, bps-1)) {
+ av_log(s->avctx, AV_LOG_ERROR,
+ "Invalid number of wasted bits > available bits (%d) - left=%d\n",
+ bps, left);
+ return AVERROR_INVALIDDATA;
+ }
+ wasted = 1 + get_unary(&s->gb, 1, get_bits_left(&s->gb));
+ bps -= wasted;
+ }
+- if (bps > 32) {
+- avpriv_report_missing_feature(s->avctx, "Decorrelated bit depth > 32");
+- return AVERROR_PATCHWELCOME;
+- }
+
+ //FIXME use av_log2 for types
+ if (type == 0) {
+- tmp = get_sbits_long(&s->gb, bps);
+- for (i = 0; i < s->blocksize; i++)
+- decoded[i] = tmp;
++ if (bps < 33) {
++ int32_t tmp = get_sbits_long(&s->gb, bps);
++ for (i = 0; i < s->blocksize; i++)
++ decoded[i] = tmp;
++ } else {
++ int64_t tmp = get_sbits64(&s->gb, 33);
++ for (i = 0; i < s->blocksize; i++)
++ s->decoded_33bps[i] = tmp;
++ }
+ } else if (type == 1) {
+- for (i = 0; i < s->blocksize; i++)
+- decoded[i] = get_sbits_long(&s->gb, bps);
++ if (bps < 33) {
++ for (i = 0; i < s->blocksize; i++)
++ decoded[i] = get_sbits_long(&s->gb, bps);
++ } else {
++ for (i = 0; i < s->blocksize; i++)
++ s->decoded_33bps[i] = get_sbits64(&s->gb, 33);
++ }
+ } else if ((type >= 8) && (type <= 12)) {
+- if ((ret = decode_subframe_fixed(s, decoded, type & ~0x8, bps)) < 0)
+- return ret;
++ int order = type & ~0x8;
++ if (bps < 33) {
++ if (bps + order <= 32) {
++ if ((ret = decode_subframe_fixed(s, decoded, order, bps)) < 0)
++ return ret;
++ } else {
++ if ((ret = decode_subframe_fixed_wide(s, decoded, order, bps)) < 0)
++ return ret;
++ }
++ } else {
++ if ((ret = decode_subframe_fixed_33bps(s, s->decoded_33bps, decoded, order)) < 0)
++ return ret;
++ }
+ } else if (type >= 32) {
+- if ((ret = decode_subframe_lpc(s, decoded, (type & ~0x20)+1, bps)) < 0)
+- return ret;
++ if (bps < 33) {
++ if ((ret = decode_subframe_lpc(s, decoded, (type & ~0x20)+1, bps)) < 0)
++ return ret;
++ } else {
++ if ((ret = decode_subframe_lpc_33bps(s, s->decoded_33bps, decoded, (type & ~0x20)+1)) < 0)
++ return ret;
++ }
+ } else {
+ av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n");
+ return AVERROR_INVALIDDATA;
+ }
+
+- if (wasted && wasted < 32) {
+- int i;
+- for (i = 0; i < s->blocksize; i++)
+- decoded[i] = (unsigned)decoded[i] << wasted;
++ if (wasted) {
++ if (wasted+bps == 33) {
++ int i;
++ for (i = 0; i < s->blocksize; i++)
++ s->decoded_33bps[i] = (uint64_t)decoded[i] << wasted;
++ } else if (wasted < 32) {
++ int i;
++ for (i = 0; i < s->blocksize; i++)
++ decoded[i] = (unsigned)decoded[i] << wasted;
++ }
+ }
+
+ return 0;
+@@ -554,6 +701,26 @@ static int decode_frame(FLACContext *s)
+ return 0;
+ }
+
++static void decorrelate_33bps(int ch_mode, int32_t **decoded, int64_t *decoded_33bps, int len)
++{
++ int i;
++ if (ch_mode == FLAC_CHMODE_LEFT_SIDE ) {
++ for (i = 0; i < len; i++)
++ decoded[1][i] = decoded[0][i] - decoded_33bps[i];
++ } else if (ch_mode == FLAC_CHMODE_RIGHT_SIDE ) {
++ for (i = 0; i < len; i++)
++ decoded[0][i] = decoded[1][i] + decoded_33bps[i];
++ } else if (ch_mode == FLAC_CHMODE_MID_SIDE ) {
++ for (i = 0; i < len; i++) {
++ uint64_t a = decoded[0][i];
++ int64_t b = decoded_33bps[i];
++ a -= b >> 1;
++ decoded[0][i] = (a + b);
++ decoded[1][i] = a;
++ }
++ }
++}
++
+ static int flac_decode_frame(AVCodecContext *avctx, AVFrame *frame,
+ int *got_frame_ptr, AVPacket *avpkt)
+ {
+@@ -612,29 +779,36 @@ static int flac_decode_frame(AVCodecContext *avctx, AVFrame *frame,
+ if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0)
+ return ret;
+
+- s->dsp.decorrelate[s->ch_mode](frame->data, s->decoded,
+- s->stream_info.channels,
+- s->blocksize, s->sample_shift);
++ if (s->stream_info.bps == 32 && s->ch_mode > 0) {
++ decorrelate_33bps(s->ch_mode, s->decoded, s->decoded_33bps, s->blocksize);
++ s->dsp.decorrelate[0](frame->data, s->decoded, s->stream_info.channels,
++ s->blocksize, s->sample_shift);
++ } else {
++ s->dsp.decorrelate[s->ch_mode](frame->data, s->decoded,
++ s->stream_info.channels,
++ s->blocksize, s->sample_shift);
++ }
+
+ if (bytes_read > buf_size) {
+ av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", bytes_read - buf_size);
+ return AVERROR_INVALIDDATA;
+ }
+ if (bytes_read < buf_size) {
+ av_log(s->avctx, AV_LOG_DEBUG, "underread: %d orig size: %d\n",
+ buf_size - bytes_read, buf_size);
+ }
+
+ *got_frame_ptr = 1;
+
+ return bytes_read;
+ }
+
+ static av_cold int flac_decode_close(AVCodecContext *avctx)
+ {
+ FLACContext *s = avctx->priv_data;
+
+ av_freep(&s->decoded_buffer);
++ av_freep(&s->decoded_buffer_33bps);
+
+ return 0;
+ }
+diff --git a/media/ffvpx/libavcodec/get_bits.h b/media/ffvpx/libavcodec/get_bits.h
+index 992765dc92c9..65dc080ddb3e 100644
+--- a/media/ffvpx/libavcodec/get_bits.h
++++ b/media/ffvpx/libavcodec/get_bits.h
+@@ -1,6 +1,5 @@
+ /*
+ * Copyright (c) 2004 Michael Niedermayer <michaelni(a)gmx.at>
+- * Copyright (c) 2016 Alexandra Hájková
+ *
+ * This file is part of FFmpeg.
+ *
+@@ -58,12 +57,55 @@
+ #define CACHED_BITSTREAM_READER 0
+ #endif
+
++#if CACHED_BITSTREAM_READER
++
++// we always want the LE implementation, to provide get_bits_le()
++#define BITSTREAM_LE
++
++#ifndef BITSTREAM_READER_LE
++# define BITSTREAM_BE
++# define BITSTREAM_DEFAULT_BE
++#endif
++
++#include "bitstream.h"
++
++#undef BITSTREAM_LE
++#undef BITSTREAM_BE
++#undef BITSTREAM_DEFAULT_BE
++
++typedef BitstreamContext GetBitContext;
++
++#define get_bits_count bits_tell
++#define get_bits_left bits_left
++#define skip_bits_long bits_skip
++#define skip_bits bits_skip
++#define get_bits bits_read_nz
++#define get_bitsz bits_read
++#define get_bits_long bits_read
++#define get_bits1 bits_read_bit
++#define get_bits64 bits_read_64
++#define get_xbits bits_read_xbits
++#define get_sbits bits_read_signed_nz
++#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 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
++
++#else // CACHED_BITSTREAM_READER
++
+ typedef struct GetBitContext {
+ const uint8_t *buffer, *buffer_end;
+-#if CACHED_BITSTREAM_READER
+- uint64_t cache;
+- unsigned bits_left;
+-#endif
+ int index;
+ int size_in_bits;
+ int size_in_bits_plus8;
+@@ -120,16 +162,12 @@ static inline unsigned int show_bits(GetBitContext *s, int n);
+ * For examples see get_bits, show_bits, skip_bits, get_vlc.
+ */
+
+-#if CACHED_BITSTREAM_READER
+-# define MIN_CACHE_BITS 64
+-#elif defined LONG_BITSTREAM_READER
++#if defined LONG_BITSTREAM_READER
+ # define MIN_CACHE_BITS 32
+ #else
+ # define MIN_CACHE_BITS 25
+ #endif
+
+-#if !CACHED_BITSTREAM_READER
+-
+ #define OPEN_READER_NOSIZE(name, gb) \
+ unsigned int name ## _index = (gb)->index; \
+ unsigned int av_unused name ## _cache
+@@ -214,356 +252,178 @@ static inline unsigned int show_bits(GetBitContext *s, int n);
+
+ #define GET_CACHE(name, gb) ((uint32_t) name ## _cache)
+
+-#endif
+
+ static inline int get_bits_count(const GetBitContext *s)
+ {
+-#if CACHED_BITSTREAM_READER
+- return s->index - s->bits_left;
+-#else
+ return s->index;
+-#endif
+ }
+
+-#if CACHED_BITSTREAM_READER
+-static inline void refill_32(GetBitContext *s, int is_le)
+-{
+-#if !UNCHECKED_BITSTREAM_READER
+- if (s->index >> 3 >= s->buffer_end - s->buffer)
+- return;
+-#endif
+-
+- if (is_le)
+- s->cache = (uint64_t)AV_RL32(s->buffer + (s->index >> 3)) << s->bits_left | s->cache;
+- else
+- s->cache = s->cache | (uint64_t)AV_RB32(s->buffer + (s->index >> 3)) << (32 - s->bits_left);
+- s->index += 32;
+- s->bits_left += 32;
+-}
+-
+-static inline void refill_64(GetBitContext *s, int is_le)
+-{
+-#if !UNCHECKED_BITSTREAM_READER
+- if (s->index >> 3 >= s->buffer_end - s->buffer)
+- return;
+-#endif
+-
+- if (is_le)
+- s->cache = AV_RL64(s->buffer + (s->index >> 3));
+- else
+- s->cache = AV_RB64(s->buffer + (s->index >> 3));
+- s->index += 64;
+- s->bits_left = 64;
+-}
+-
+-static inline uint64_t get_val(GetBitContext *s, unsigned n, int is_le)
+-{
+- uint64_t ret;
+- av_assert2(n>0 && n<=63);
+- if (is_le) {
+- ret = s->cache & ((UINT64_C(1) << n) - 1);
+- s->cache >>= n;
+- } else {
+- ret = s->cache >> (64 - n);
+- s->cache <<= n;
+- }
+- s->bits_left -= n;
+- return ret;
+-}
+-
+-static inline unsigned show_val(const GetBitContext *s, unsigned n)
+-{
+-#ifdef BITSTREAM_READER_LE
+- return s->cache & ((UINT64_C(1) << n) - 1);
+-#else
+- return s->cache >> (64 - n);
+-#endif
+-}
+-#endif
+-
+ /**
+ * Skips the specified number of bits.
+ * @param n the number of bits to skip,
+ * For the UNCHECKED_BITSTREAM_READER this must not cause the distance
+ * from the start to overflow int32_t. Staying within the bitstream + padding
+ * is sufficient, too.
+ */
+ static inline void skip_bits_long(GetBitContext *s, int n)
+ {
+-#if CACHED_BITSTREAM_READER
+- skip_bits(s, n);
+-#else
+ #if UNCHECKED_BITSTREAM_READER
+ s->index += n;
+ #else
+ s->index += av_clip(n, -s->index, s->size_in_bits_plus8 - s->index);
+ #endif
+-#endif
+ }
+
+-#if CACHED_BITSTREAM_READER
+-static inline void skip_remaining(GetBitContext *s, unsigned n)
+-{
+-#ifdef BITSTREAM_READER_LE
+- s->cache >>= n;
+-#else
+- s->cache <<= n;
+-#endif
+- s->bits_left -= n;
+-}
+-#endif
+-
+ /**
+ * Read MPEG-1 dc-style VLC (sign bit + mantissa with no MSB).
+ * if MSB not set it is negative
+ * @param n length in bits
+ */
+ static inline int get_xbits(GetBitContext *s, int n)
+ {
+-#if CACHED_BITSTREAM_READER
+- int32_t cache = show_bits(s, 32);
+- int sign = ~cache >> 31;
+- skip_remaining(s, n);
+-
+- return ((((uint32_t)(sign ^ cache)) >> (32 - n)) ^ sign) - sign;
+-#else
+ register int sign;
+ register int32_t cache;
+ OPEN_READER(re, s);
+ av_assert2(n>0 && n<=25);
+ UPDATE_CACHE(re, s);
+ cache = GET_CACHE(re, s);
+ sign = ~cache >> 31;
+ LAST_SKIP_BITS(re, s, n);
+ CLOSE_READER(re, s);
+ return (NEG_USR32(sign ^ cache, n) ^ sign) - sign;
+-#endif
+ }
+
+-#if !CACHED_BITSTREAM_READER
+ static inline int get_xbits_le(GetBitContext *s, int n)
+ {
+ register int sign;
+ register int32_t cache;
+ OPEN_READER(re, s);
+ av_assert2(n>0 && n<=25);
+ UPDATE_CACHE_LE(re, s);
+ cache = GET_CACHE(re, s);
+ sign = sign_extend(~cache, n) >> 31;
+ LAST_SKIP_BITS(re, s, n);
+ CLOSE_READER(re, s);
+ return (zero_extend(sign ^ cache, n) ^ sign) - sign;
+ }
+-#endif
+
+ static inline int get_sbits(GetBitContext *s, int n)
+ {
+ register int tmp;
+-#if CACHED_BITSTREAM_READER
+- av_assert2(n>0 && n<=25);
+- tmp = sign_extend(get_bits(s, n), n);
+-#else
+ OPEN_READER(re, s);
+ av_assert2(n>0 && n<=25);
+ UPDATE_CACHE(re, s);
+ tmp = SHOW_SBITS(re, s, n);
+ LAST_SKIP_BITS(re, s, n);
+ CLOSE_READER(re, s);
+-#endif
+ return tmp;
+ }
+
+ /**
+ * Read 1-25 bits.
+ */
+ static inline unsigned int get_bits(GetBitContext *s, int n)
+ {
+ register unsigned int tmp;
+-#if CACHED_BITSTREAM_READER
+-
+- av_assert2(n>0 && n<=32);
+- if (n > s->bits_left) {
+-#ifdef BITSTREAM_READER_LE
+- refill_32(s, 1);
+-#else
+- refill_32(s, 0);
+-#endif
+- if (s->bits_left < 32)
+- s->bits_left = n;
+- }
+-
+-#ifdef BITSTREAM_READER_LE
+- tmp = get_val(s, n, 1);
+-#else
+- tmp = get_val(s, n, 0);
+-#endif
+-#else
+ OPEN_READER(re, s);
+ av_assert2(n>0 && n<=25);
+ UPDATE_CACHE(re, s);
+ tmp = SHOW_UBITS(re, s, n);
+ LAST_SKIP_BITS(re, s, n);
+ CLOSE_READER(re, s);
+-#endif
+ av_assert2(tmp < UINT64_C(1) << n);
+ return tmp;
+ }
+
+ /**
+ * Read 0-25 bits.
+ */
+ static av_always_inline int get_bitsz(GetBitContext *s, int n)
+ {
+ return n ? get_bits(s, n) : 0;
+ }
+
+ static inline unsigned int get_bits_le(GetBitContext *s, int n)
+ {
+-#if CACHED_BITSTREAM_READER
+- av_assert2(n>0 && n<=32);
+- if (n > s->bits_left) {
+- refill_32(s, 1);
+- if (s->bits_left < 32)
+- s->bits_left = n;
+- }
+-
+- return get_val(s, n, 1);
+-#else
+ register int tmp;
+ OPEN_READER(re, s);
+ av_assert2(n>0 && n<=25);
+ UPDATE_CACHE_LE(re, s);
+ tmp = SHOW_UBITS_LE(re, s, n);
+ LAST_SKIP_BITS(re, s, n);
+ CLOSE_READER(re, s);
+ return tmp;
+-#endif
+ }
+
+ /**
+ * Show 1-25 bits.
+ */
+ static inline unsigned int show_bits(GetBitContext *s, int n)
+ {
+ register unsigned int tmp;
+-#if CACHED_BITSTREAM_READER
+- if (n > s->bits_left)
+-#ifdef BITSTREAM_READER_LE
+- refill_32(s, 1);
+-#else
+- refill_32(s, 0);
+-#endif
+-
+- tmp = show_val(s, n);
+-#else
+ OPEN_READER_NOSIZE(re, s);
+ av_assert2(n>0 && n<=25);
+ UPDATE_CACHE(re, s);
+ tmp = SHOW_UBITS(re, s, n);
+-#endif
+ return tmp;
+ }
+
+ static inline void skip_bits(GetBitContext *s, int n)
+ {
+-#if CACHED_BITSTREAM_READER
+- if (n < s->bits_left)
+- skip_remaining(s, n);
+- else {
+- n -= s->bits_left;
+- s->cache = 0;
+- s->bits_left = 0;
+-
+- if (n >= 64) {
+- unsigned skip = (n / 8) * 8;
+-
+- n -= skip;
+- s->index += skip;
+- }
+-#ifdef BITSTREAM_READER_LE
+- refill_64(s, 1);
+-#else
+- refill_64(s, 0);
+-#endif
+- if (n)
+- skip_remaining(s, n);
+- }
+-#else
+ OPEN_READER(re, s);
+ LAST_SKIP_BITS(re, s, n);
+ CLOSE_READER(re, s);
+-#endif
+ }
+
+ static inline unsigned int get_bits1(GetBitContext *s)
+ {
+-#if CACHED_BITSTREAM_READER
+- if (!s->bits_left)
+-#ifdef BITSTREAM_READER_LE
+- refill_64(s, 1);
+-#else
+- refill_64(s, 0);
+-#endif
+-
+-#ifdef BITSTREAM_READER_LE
+- return get_val(s, 1, 1);
+-#else
+- return get_val(s, 1, 0);
+-#endif
+-#else
+ unsigned int index = s->index;
+ uint8_t result = s->buffer[index >> 3];
+ #ifdef BITSTREAM_READER_LE
+ result >>= index & 7;
+ result &= 1;
+ #else
+ result <<= index & 7;
+ result >>= 8 - 1;
+ #endif
+ #if !UNCHECKED_BITSTREAM_READER
+ if (s->index < s->size_in_bits_plus8)
+ #endif
+ index++;
+ s->index = index;
+
+ return result;
+-#endif
+ }
+
+ static inline unsigned int show_bits1(GetBitContext *s)
+ {
+ return show_bits(s, 1);
+ }
+
+ static inline void skip_bits1(GetBitContext *s)
+ {
+ skip_bits(s, 1);
+ }
+
+ /**
+ * Read 0-32 bits.
+ */
+ static inline unsigned int get_bits_long(GetBitContext *s, int n)
+ {
+ av_assert2(n>=0 && n<=32);
+ if (!n) {
+ return 0;
+-#if CACHED_BITSTREAM_READER
+- }
+- return get_bits(s, n);
+-#else
+ } else if (n <= MIN_CACHE_BITS) {
+ return get_bits(s, n);
+ } else {
+ #ifdef BITSTREAM_READER_LE
+ unsigned ret = get_bits(s, 16);
+ return ret | (get_bits(s, n - 16) << 16);
+ #else
+ unsigned ret = get_bits(s, 16) << (n - 16);
+ return ret | get_bits(s, n - 16);
+ #endif
+ }
+-#endif
+ }
+
+ /**
+@@ -596,88 +456,85 @@ static inline int get_sbits_long(GetBitContext *s, int n)
+ return sign_extend(get_bits_long(s, n), n);
+ }
+
++/**
++ * Read 0-64 bits as a signed integer.
++ */
++static inline int64_t get_sbits64(GetBitContext *s, int n)
++{
++ // sign_extend(x, 0) is undefined
++ if (!n)
++ return 0;
++
++ return sign_extend64(get_bits64(s, n), n);
++}
++
+ /**
+ * Show 0-32 bits.
+ */
+ static inline unsigned int show_bits_long(GetBitContext *s, int n)
+ {
+ if (n <= MIN_CACHE_BITS) {
+ return show_bits(s, n);
+ } else {
+ GetBitContext gb = *s;
+ return get_bits_long(&gb, n);
+ }
+ }
+
+-static inline int init_get_bits_xe(GetBitContext *s, const uint8_t *buffer,
+- int bit_size, int is_le)
++
++/**
++ * Initialize GetBitContext.
++ * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
++ * larger than the actual read bits because some optimized bitstream
++ * readers read 32 or 64 bit at once and could read over the end
++ * @param bit_size the size of the buffer in bits
++ * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
++ */
++static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
++ int bit_size)
+ {
+ int buffer_size;
+ int ret = 0;
+
+ if (bit_size >= INT_MAX - FFMAX(7, AV_INPUT_BUFFER_PADDING_SIZE*8) || bit_size < 0 || !buffer) {
+ bit_size = 0;
+ buffer = NULL;
+ ret = AVERROR_INVALIDDATA;
+ }
+
+ buffer_size = (bit_size + 7) >> 3;
+
+ s->buffer = buffer;
+ s->size_in_bits = bit_size;
+ s->size_in_bits_plus8 = bit_size + 8;
+ s->buffer_end = buffer + buffer_size;
+ s->index = 0;
+
+-#if CACHED_BITSTREAM_READER
+- s->cache = 0;
+- s->bits_left = 0;
+- refill_64(s, is_le);
+-#endif
+-
+ return ret;
+ }
+
+-/**
+- * Initialize GetBitContext.
+- * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
+- * larger than the actual read bits because some optimized bitstream
+- * readers read 32 or 64 bit at once and could read over the end
+- * @param bit_size the size of the buffer in bits
+- * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
+- */
+-static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
+- int bit_size)
+-{
+-#ifdef BITSTREAM_READER_LE
+- return init_get_bits_xe(s, buffer, bit_size, 1);
+-#else
+- return init_get_bits_xe(s, buffer, bit_size, 0);
+-#endif
+-}
+-
+ /**
+ * Initialize GetBitContext.
+ * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
+ * larger than the actual read bits because some optimized bitstream
+ * readers read 32 or 64 bit at once and could read over the end
+ * @param byte_size the size of the buffer in bytes
+ * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
+ */
+ static inline int init_get_bits8(GetBitContext *s, const uint8_t *buffer,
+ int byte_size)
+ {
+ if (byte_size > INT_MAX / 8 || byte_size < 0)
+ byte_size = -1;
+ return init_get_bits(s, buffer, byte_size * 8);
+ }
+
+ static inline int init_get_bits8_le(GetBitContext *s, const uint8_t *buffer,
+ int byte_size)
+ {
+ if (byte_size > INT_MAX / 8 || byte_size < 0)
+ byte_size = -1;
+- return init_get_bits_xe(s, buffer, byte_size * 8, 1);
++ return init_get_bits(s, buffer, byte_size * 8);
+ }
+
+ static inline const uint8_t *align_get_bits(GetBitContext *s)
+@@ -762,60 +619,28 @@ static inline const uint8_t *align_get_bits(GetBitContext *s)
+ SKIP_BITS(name, gb, n); \
+ } while (0)
+
+-/* Return the LUT element for the given bitstream configuration. */
+-static inline int set_idx(GetBitContext *s, int code, int *n, int *nb_bits,
+- const VLCElem *table)
+-{
+- unsigned idx;
+-
+- *nb_bits = -*n;
+- idx = show_bits(s, *nb_bits) + code;
+- *n = table[idx].len;
+-
+- return table[idx].sym;
+-}
+-
+ /**
+ * Parse a vlc code.
+ * @param bits is the number of bits which will be read at once, must be
+ * identical to nb_bits in init_vlc()
+ * @param max_depth is the number of times bits bits must be read to completely
+ * read the longest vlc code
+ * = (max_vlc_length + bits - 1) / bits
+ * @returns the code parsed or -1 if no vlc matches
+ */
+ static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table,
+ int bits, int max_depth)
+ {
+-#if CACHED_BITSTREAM_READER
+- int nb_bits;
+- unsigned idx = show_bits(s, bits);
+- int code = table[idx].sym;
+- int n = table[idx].len;
+-
+- if (max_depth > 1 && n < 0) {
+- skip_remaining(s, bits);
+- code = set_idx(s, code, &n, &nb_bits, table);
+- if (max_depth > 2 && n < 0) {
+- skip_remaining(s, nb_bits);
+- code = set_idx(s, code, &n, &nb_bits, table);
+- }
+- }
+- skip_remaining(s, n);
+-
+- return code;
+-#else
+ int code;
+
+ OPEN_READER(re, s);
+ UPDATE_CACHE(re, s);
+
+ GET_VLC(code, re, s, table, bits, max_depth);
+
+ CLOSE_READER(re, s);
+
+ return code;
+-#endif
+ }
+
+ static inline int decode012(GetBitContext *gb)
+@@ -855,4 +680,6 @@ static inline int skip_1stop_8data_bits(GetBitContext *gb)
+ return 0;
+ }
+
++#endif // CACHED_BITSTREAM_READER
++
+ #endif /* AVCODEC_GET_BITS_H */
+diff --git a/media/ffvpx/libavcodec/internal.h b/media/ffvpx/libavcodec/internal.h
+index 76a6ea6bc646..a283c52e0122 100644
+--- a/media/ffvpx/libavcodec/internal.h
++++ b/media/ffvpx/libavcodec/internal.h
+@@ -88,7 +88,6 @@ typedef struct AVCodecInternal {
+ * for decoding.
+ */
+ AVPacket *last_pkt_props;
+- struct AVFifo *pkt_props;
+
+ /**
+ * temporary buffer used for encoders to store their bitstream
+diff --git a/media/ffvpx/libavcodec/libdav1d.c b/media/ffvpx/libavcodec/libdav1d.c
+index 028929404e1c..2488a709c722 100644
+--- a/media/ffvpx/libavcodec/libdav1d.c
++++ b/media/ffvpx/libavcodec/libdav1d.c
+@@ -41,9 +41,6 @@
+ typedef struct Libdav1dContext {
+ AVClass *class;
+ Dav1dContext *c;
+- /* This packet coincides with AVCodecInternal.in_pkt
+- * and is not owned by us. */
+- AVPacket *pkt;
+ AVBufferPool *pool;
+ int pool_size;
+
+@@ -219,8 +216,6 @@ static av_cold int libdav1d_init(AVCodecContext *c)
+ #endif
+ int res;
+
+- dav1d->pkt = c->internal->in_pkt;
+-
+ av_log(c, AV_LOG_INFO, "libdav1d %s\n", dav1d_version());
+
+ dav1d_default_settings(&s);
+@@ -265,87 +260,121 @@ static av_cold int libdav1d_init(AVCodecContext *c)
+ s.n_frame_threads, s.n_tile_threads);
+ #endif
+
++#if FF_DAV1D_VERSION_AT_LEAST(6,8)
++ if (c->skip_frame >= AVDISCARD_NONKEY)
++ s.decode_frame_type = DAV1D_DECODEFRAMETYPE_KEY;
++ else if (c->skip_frame >= AVDISCARD_NONINTRA)
++ s.decode_frame_type = DAV1D_DECODEFRAMETYPE_INTRA;
++ else if (c->skip_frame >= AVDISCARD_NONREF)
++ s.decode_frame_type = DAV1D_DECODEFRAMETYPE_REFERENCE;
++#endif
++
+ res = libdav1d_parse_extradata(c);
+ if (res < 0)
+ return res;
+
+ res = dav1d_open(&dav1d->c, &s);
+ if (res < 0)
+ return AVERROR(ENOMEM);
+
+ return 0;
+ }
+
+ static void libdav1d_flush(AVCodecContext *c)
+ {
+ Libdav1dContext *dav1d = c->priv_data;
+
+ dav1d_data_unref(&dav1d->data);
+ dav1d_flush(dav1d->c);
+ }
+
++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(opaque);
++ av_free(pkt->opaque);
++ av_packet_free(&pkt);
+ }
+
+ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
+ {
+ Libdav1dContext *dav1d = c->priv_data;
+ Dav1dData *data = &dav1d->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;
+
+ if (!data->sz) {
+- AVPacket *const pkt = dav1d->pkt;
++ pkt = av_packet_alloc();
++
++ if (!pkt)
++ return AVERROR(ENOMEM);
+
+ res = ff_decode_get_packet(c, pkt);
+- if (res < 0 && res != AVERROR_EOF)
++ if (res < 0 && res != AVERROR_EOF) {
++ av_packet_free(&pkt);
+ return res;
++ }
+
+ if (pkt->size) {
+ res = dav1d_data_wrap(data, pkt->data, pkt->size,
+ libdav1d_data_free, pkt->buf);
+ if (res < 0) {
+- av_packet_unref(pkt);
++ av_packet_free(&pkt);
+ return res;
+ }
+
+- data->m.timestamp = pkt->pts;
+- data->m.offset = pkt->pos;
+- data->m.duration = pkt->duration;
+-
+ pkt->buf = NULL;
+- av_packet_unref(pkt);
+
+- if (c->reordered_opaque != AV_NOPTS_VALUE) {
+- uint8_t *reordered_opaque = av_memdup(&c->reordered_opaque,
+- sizeof(c->reordered_opaque));
+- if (!reordered_opaque) {
++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);
+ }
+-
+- res = dav1d_data_wrap_user_data(data, reordered_opaque,
+- libdav1d_user_data_free, reordered_opaque);
+- if (res < 0) {
+- av_free(reordered_opaque);
+- dav1d_data_unref(data);
+- return res;
+- }
++ od->pkt_orig_opaque = pkt->opaque;
++#if FF_API_REORDERED_OPAQUE
++ od->reordered_opaque = c->reordered_opaque;
++#endif
++FF_ENABLE_DEPRECATION_WARNINGS
+ }
+- } else if (res >= 0) {
+- av_packet_unref(pkt);
+- return AVERROR(EAGAIN);
++ 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)
++ return AVERROR(EAGAIN);
+ }
+ }
+
+@@ -410,17 +439,29 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
+ INT_MAX);
+ ff_set_sar(c, frame->sample_aspect_ratio);
+
+- if (p->m.user_data.data)
+- memcpy(&frame->reordered_opaque, p->m.user_data.data, sizeof(frame->reordered_opaque));
++ 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
+- frame->pts = p->m.timestamp;
+- frame->pkt_dts = p->m.timestamp;
+- frame->pkt_pos = p->m.offset;
+- frame->pkt_size = p->m.size;
+- frame->duration = p->m.duration;
++ res = ff_decode_frame_props_from_pkt(c, frame, pkt);
++ pkt->opaque = NULL;
++ if (res < 0)
++ goto fail;
++
++ frame->pkt_dts = pkt->pts;
+ frame->key_frame = p->frame_hdr->frame_type == DAV1D_FRAME_TYPE_KEY;
+
+ switch (p->frame_hdr->frame_type) {
+@@ -594,7 +635,7 @@ const FFCodec ff_libdav1d_decoder = {
+ .flush = libdav1d_flush,
+ FF_CODEC_RECEIVE_FRAME_CB(libdav1d_receive_frame),
+ .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_OTHER_THREADS,
+- .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS |
++ .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_SETS_FRAME_PROPS |
+ FF_CODEC_CAP_AUTO_THREADS,
+ .p.priv_class = &libdav1d_class,
+ .p.wrapper_name = "libdav1d",
+diff --git a/media/ffvpx/libavcodec/mathops.h b/media/ffvpx/libavcodec/mathops.h
+index c89054d6edf5..a1dc323304b4 100644
+--- a/media/ffvpx/libavcodec/mathops.h
++++ b/media/ffvpx/libavcodec/mathops.h
+@@ -138,6 +138,15 @@ static inline av_const int sign_extend(int val, unsigned bits)
+ }
+ #endif
+
++#ifndef sign_extend64
++static inline av_const int64_t sign_extend64(int64_t val, unsigned bits)
++{
++ unsigned shift = 8 * sizeof(int64_t) - bits;
++ union { uint64_t u; int64_t s; } v = { (uint64_t) val << shift };
++ return v.s >> shift;
++}
++#endif
++
+ #ifndef zero_extend
+ static inline av_const unsigned zero_extend(unsigned val, unsigned bits)
+ {
+diff --git a/media/ffvpx/libavcodec/motion_est.h b/media/ffvpx/libavcodec/motion_est.h
+index b20cdabbbb82..f6a563b08c7b 100644
+--- a/media/ffvpx/libavcodec/motion_est.h
++++ b/media/ffvpx/libavcodec/motion_est.h
+@@ -52,7 +52,6 @@ typedef struct MotionEstContext {
+ uint8_t *scratchpad; /**< data area for the ME algo, so that
+ * the ME does not need to malloc/free. */
+ uint8_t *temp;
+- int best_bits;
+ uint32_t *map; ///< map to avoid duplicate evaluations
+ uint32_t *score_map; ///< map to store the scores
+ unsigned map_generation;
+diff --git a/media/ffvpx/libavcodec/mpegpicture.h b/media/ffvpx/libavcodec/mpegpicture.h
+index a1455ee13c2c..7919aa402ca5 100644
+--- a/media/ffvpx/libavcodec/mpegpicture.h
++++ b/media/ffvpx/libavcodec/mpegpicture.h
+@@ -76,6 +76,9 @@ typedef struct Picture {
+
+ int reference;
+ int shared;
++
++ int display_picture_number;
++ int coded_picture_number;
+ } Picture;
+
+ /**
+diff --git a/media/ffvpx/libavcodec/mpegvideo.h b/media/ffvpx/libavcodec/mpegvideo.h
+index ccec0dd75f2e..55828e610271 100644
+--- a/media/ffvpx/libavcodec/mpegvideo.h
++++ b/media/ffvpx/libavcodec/mpegvideo.h
+@@ -44,9 +44,6 @@
+ #include "pixblockdsp.h"
+ #include "put_bits.h"
+ #include "ratecontrol.h"
+-#if FF_API_FLAG_TRUNCATED
+-#include "parser.h"
+-#endif
+ #include "mpegutils.h"
+ #include "qpeldsp.h"
+ #include "videodsp.h"
+@@ -117,6 +114,7 @@ typedef struct MpegEncContext {
+ int input_picture_number; ///< used to set pic->display_picture_number, should not be used for/by anything else
+ int coded_picture_number; ///< used to set pic->coded_picture_number, should not be used for/by anything else
+ int picture_number; //FIXME remove, unclear definition
++ int extradata_parsed;
+ int picture_in_gop_number; ///< 0-> first pic in gop, ...
+ int mb_width, mb_height; ///< number of MBs horizontally & vertically
+ int mb_stride; ///< mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11
+@@ -174,6 +172,7 @@ typedef struct MpegEncContext {
+ Picture *last_picture_ptr; ///< pointer to the previous picture.
+ Picture *next_picture_ptr; ///< pointer to the next picture (for bidir pred)
+ Picture *current_picture_ptr; ///< pointer to the current picture
++ int skipped_last_frame;
+ int last_dc[3]; ///< last DC values for MPEG-1
+ int16_t *dc_val_base;
+ int16_t *dc_val[3]; ///< used for MPEG-4 DC prediction, all 3 arrays must be continuous
+@@ -351,10 +350,6 @@ typedef struct MpegEncContext {
+ GetBitContext last_resync_gb; ///< used to search for the next resync marker
+ int mb_num_left; ///< number of MBs left in this video packet (for partitioned Slices only)
+
+-#if FF_API_FLAG_TRUNCATED
+- ParseContext parse_context;
+-#endif
+-
+ /* H.263 specific */
+ int gob_index;
+ int obmc; ///< overlapped block motion compensation
+diff --git a/media/ffvpx/libavcodec/options.c b/media/ffvpx/libavcodec/options.c
+index 2e05d29e1ee6..a9b35ee1c345 100644
+--- a/media/ffvpx/libavcodec/options.c
++++ b/media/ffvpx/libavcodec/options.c
+@@ -124,7 +124,11 @@ static int init_context_defaults(AVCodecContext *s, const AVCodec *codec)
+ 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)
+@@ -185,39 +189,6 @@ const AVClass *avcodec_get_class(void)
+ return &av_codec_context_class;
+ }
+
+-#if FF_API_GET_FRAME_CLASS
+-FF_DISABLE_DEPRECATION_WARNINGS
+-#define FOFFSET(x) offsetof(AVFrame,x)
+-
+-static const AVOption frame_options[]={
+-{"best_effort_timestamp", "", FOFFSET(best_effort_timestamp), AV_OPT_TYPE_INT64, {.i64 = AV_NOPTS_VALUE }, INT64_MIN, INT64_MAX, 0},
+-{"pkt_pos", "", FOFFSET(pkt_pos), AV_OPT_TYPE_INT64, {.i64 = -1 }, INT64_MIN, INT64_MAX, 0},
+-{"pkt_size", "", FOFFSET(pkt_size), AV_OPT_TYPE_INT64, {.i64 = -1 }, INT64_MIN, INT64_MAX, 0},
+-{"sample_aspect_ratio", "", FOFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, 0, INT_MAX, 0},
+-{"width", "", FOFFSET(width), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
+-{"height", "", FOFFSET(height), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
+-{"format", "", FOFFSET(format), AV_OPT_TYPE_INT, {.i64 = -1 }, 0, INT_MAX, 0},
+-#if FF_API_OLD_CHANNEL_LAYOUT
+-{"channel_layout", "", FOFFSET(channel_layout), AV_OPT_TYPE_INT64, {.i64 = 0 }, 0, INT64_MAX, 0},
+-#endif
+-{"sample_rate", "", FOFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
+-{NULL},
+-};
+-
+-static const AVClass av_frame_class = {
+- .class_name = "AVFrame",
+- .item_name = NULL,
+- .option = frame_options,
+- .version = LIBAVUTIL_VERSION_INT,
+-};
+-
+-const AVClass *avcodec_get_frame_class(void)
+-{
+- return &av_frame_class;
+-}
+-FF_ENABLE_DEPRECATION_WARNINGS
+-#endif
+-
+ #define SROFFSET(x) offsetof(AVSubtitleRect,x)
+
+ static const AVOption subtitle_rect_options[]={
+diff --git a/media/ffvpx/libavcodec/options_table.h b/media/ffvpx/libavcodec/options_table.h
+index cd02f5096f18..4fea57673ad0 100644
+--- a/media/ffvpx/libavcodec/options_table.h
++++ b/media/ffvpx/libavcodec/options_table.h
+@@ -58,13 +58,12 @@ static const AVOption avcodec_options[] = {
+ {"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"},
+ {"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"},
+-#if FF_API_FLAG_TRUNCATED
+-{"truncated", "(Deprecated, use parsers instead.) Input bitstream might be randomly truncated", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_TRUNCATED }, INT_MIN, INT_MAX, V|D | AV_OPT_FLAG_DEPRECATED, "flags"},
+-#endif
+ {"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"},
+@@ -98,7 +97,7 @@ static const AVOption avcodec_options[] = {
+ #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_number), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX},
++{"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",
+@@ -377,28 +376,25 @@ static const AVOption avcodec_options[] = {
+ {"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"},
+-#if FF_API_SUB_TEXT_FORMAT
+-{"sub_text_format", "Deprecated, does nothing", OFFSET(sub_text_format), AV_OPT_TYPE_INT, {.i64 = FF_SUB_TEXT_FMT_ASS}, 0, 1, S|D | AV_OPT_FLAG_DEPRECATED, "sub_text_format"},
+-{"ass", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_TEXT_FMT_ASS}, INT_MIN, INT_MAX, S|D, "sub_text_format"},
+-#endif
+ {"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" },
+ {"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"},
+ {"extra_hw_frames", "Number of extra hardware frames to allocate for the user", OFFSET(extra_hw_frames), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, V|D },
+ {"discard_damaged_percentage", "Percentage of damaged samples to discard a frame", OFFSET(discard_damaged_percentage), AV_OPT_TYPE_INT, {.i64 = 95 }, 0, 100, V|D },
+ {NULL},
+diff --git a/media/ffvpx/libavcodec/profiles.c b/media/ffvpx/libavcodec/profiles.c
+index 7af7fbeb1302..2230fc5415d0 100644
+--- a/media/ffvpx/libavcodec/profiles.c
++++ b/media/ffvpx/libavcodec/profiles.c
+@@ -85,6 +85,7 @@ const AVProfile ff_hevc_profiles[] = {
+ { FF_PROFILE_HEVC_MAIN_10, "Main 10" },
+ { FF_PROFILE_HEVC_MAIN_STILL_PICTURE, "Main Still Picture" },
+ { FF_PROFILE_HEVC_REXT, "Rext" },
++ { FF_PROFILE_HEVC_SCC, "Scc" },
+ { FF_PROFILE_UNKNOWN },
+ };
+
+diff --git a/media/ffvpx/libavcodec/pthread.c b/media/ffvpx/libavcodec/pthread.c
+index 60ba87dac484..ca84b81391da 100644
+--- a/media/ffvpx/libavcodec/pthread.c
++++ b/media/ffvpx/libavcodec/pthread.c
+@@ -48,9 +48,6 @@
+ static void validate_thread_parameters(AVCodecContext *avctx)
+ {
+ int frame_threading_supported = (avctx->codec->capabilities & AV_CODEC_CAP_FRAME_THREADS)
+-#if FF_API_FLAG_TRUNCATED
+- && !(avctx->flags & AV_CODEC_FLAG_TRUNCATED)
+-#endif
+ && !(avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
+ && !(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS);
+ if (avctx->thread_count == 1) {
+diff --git a/media/ffvpx/libavcodec/pthread_frame.c b/media/ffvpx/libavcodec/pthread_frame.c
+index df82a4125f29..d9d5afaa82d8 100644
+--- a/media/ffvpx/libavcodec/pthread_frame.c
++++ b/media/ffvpx/libavcodec/pthread_frame.c
+@@ -99,22 +99,6 @@ typedef struct PerThreadContext {
+
+ atomic_int state;
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+- /**
+- * Array of frames passed to ff_thread_release_buffer().
+- * Frames are released after all threads referencing them are finished.
+- */
+- AVFrame **released_buffers;
+- int num_released_buffers;
+- int released_buffers_allocated;
+-
+- AVFrame *requested_frame; ///< AVFrame the codec passed to get_buffer()
+- int requested_flags; ///< flags passed to get_buffer() for requested_frame
+-
+- const enum AVPixelFormat *available_formats; ///< Format array for get_format()
+- enum AVPixelFormat result_format; ///< get_format() result
+-#endif
+-
+ int die; ///< Set when the thread should exit.
+
+ int hwaccel_serializing;
+@@ -156,11 +140,6 @@ typedef struct FrameThreadContext {
+ void *stash_hwaccel_priv;
+ } FrameThreadContext;
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+-#define THREAD_SAFE_CALLBACKS(avctx) \
+-((avctx)->thread_safe_callbacks || (avctx)->get_buffer2 == avcodec_default_get_buffer2)
+-#endif
+-
+ static void async_lock(FrameThreadContext *fctx)
+ {
+ pthread_mutex_lock(&fctx->async_mutex);
+@@ -212,14 +191,8 @@ static attribute_align_arg void *frame_worker_thread(void *arg)
+
+ if (p->die) break;
+
+-FF_DISABLE_DEPRECATION_WARNINGS
+- if (!codec->update_thread_context
+-#if FF_API_THREAD_SAFE_CALLBACKS
+- && THREAD_SAFE_CALLBACKS(avctx)
+-#endif
+- )
++ if (!codec->update_thread_context)
+ ff_thread_finish_setup(avctx);
+-FF_ENABLE_DEPRECATION_WARNINGS
+
+ /* If a decoder supports hwaccel, then it must call ff_get_format().
+ * Since that call must happen before ff_thread_finish_setup(), the
+@@ -371,93 +344,78 @@ FF_ENABLE_DEPRECATION_WARNINGS
+ */
+ static int update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
+ {
++ int err;
++
+ dst->flags = src->flags;
+
+ dst->draw_horiz_band= src->draw_horiz_band;
+ dst->get_buffer2 = src->get_buffer2;
+
+ dst->opaque = src->opaque;
+ dst->debug = src->debug;
+
+ dst->slice_flags = src->slice_flags;
+ 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_number = src->frame_number;
+- dst->reordered_opaque = src->reordered_opaque;
+-#if FF_API_THREAD_SAFE_CALLBACKS
++ dst->frame_num = src->frame_num;
++#if FF_API_AVCTX_FRAME_NUMBER
+ FF_DISABLE_DEPRECATION_WARNINGS
+- dst->thread_safe_callbacks = src->thread_safe_callbacks;
++ 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
+
+ if (src->slice_count && src->slice_offset) {
+ if (dst->slice_count < src->slice_count) {
+ int err = av_reallocp_array(&dst->slice_offset, src->slice_count,
+ sizeof(*dst->slice_offset));
+ if (err < 0)
+ return err;
+ }
+ memcpy(dst->slice_offset, src->slice_offset,
+ src->slice_count * sizeof(*dst->slice_offset));
+ }
+ dst->slice_count = src->slice_count;
++
++ 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;
+ }
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+-/// Releases the buffers that this decoding thread was the last user of.
+-static void release_delayed_buffers(PerThreadContext *p)
+-{
+- FrameThreadContext *fctx = p->parent;
+-
+- while (p->num_released_buffers > 0) {
+- AVFrame *f;
+-
+- pthread_mutex_lock(&fctx->buffer_mutex);
+-
+- // fix extended data in case the caller screwed it up
+- av_assert0(p->avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
+- p->avctx->codec_type == AVMEDIA_TYPE_AUDIO);
+- f = p->released_buffers[--p->num_released_buffers];
+- f->extended_data = f->data;
+- av_frame_unref(f);
+-
+- pthread_mutex_unlock(&fctx->buffer_mutex);
+- }
+-}
+-#endif
+-
+ static int submit_packet(PerThreadContext *p, AVCodecContext *user_avctx,
+ AVPacket *avpkt)
+ {
+ FrameThreadContext *fctx = p->parent;
+ PerThreadContext *prev_thread = fctx->prev_thread;
+ const AVCodec *codec = p->avctx->codec;
+ int ret;
+
+ if (!avpkt->size && !(codec->capabilities & AV_CODEC_CAP_DELAY))
+ return 0;
+
+ pthread_mutex_lock(&p->mutex);
+
+ ret = update_context_from_user(p->avctx, user_avctx);
+ if (ret) {
+ pthread_mutex_unlock(&p->mutex);
+ return ret;
+ }
+ atomic_store_explicit(&p->debug_threads,
+ (p->avctx->debug & FF_DEBUG_THREADS) != 0,
+ memory_order_relaxed);
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+- release_delayed_buffers(p);
+-#endif
+-
+ if (prev_thread) {
+ int err;
+ if (atomic_load(&prev_thread->state) == STATE_SETTING_UP) {
+@@ -492,44 +450,6 @@ static int submit_packet(PerThreadContext *p, AVCodecContext *user_avctx,
+ pthread_cond_signal(&p->input_cond);
+ pthread_mutex_unlock(&p->mutex);
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+-FF_DISABLE_DEPRECATION_WARNINGS
+- /*
+- * If the client doesn't have a thread-safe get_buffer(),
+- * then decoding threads call back to the main thread,
+- * and it calls back to the client here.
+- */
+-
+- if (!p->avctx->thread_safe_callbacks && (
+- p->avctx->get_format != avcodec_default_get_format ||
+- p->avctx->get_buffer2 != avcodec_default_get_buffer2)) {
+- while (atomic_load(&p->state) != STATE_SETUP_FINISHED && atomic_load(&p->state) != STATE_INPUT_READY) {
+- int call_done = 1;
+- pthread_mutex_lock(&p->progress_mutex);
+- while (atomic_load(&p->state) == STATE_SETTING_UP)
+- pthread_cond_wait(&p->progress_cond, &p->progress_mutex);
+-
+- switch (atomic_load_explicit(&p->state, memory_order_acquire)) {
+- case STATE_GET_BUFFER:
+- p->result = ff_get_buffer(p->avctx, p->requested_frame, p->requested_flags);
+- break;
+- case STATE_GET_FORMAT:
+- p->result_format = ff_get_format(p->avctx, p->available_formats);
+- break;
+- default:
+- call_done = 0;
+- break;
+- }
+- if (call_done) {
+- atomic_store(&p->state, STATE_SETTING_UP);
+- pthread_cond_signal(&p->progress_cond);
+- }
+- pthread_mutex_unlock(&p->progress_mutex);
+- }
+- }
+-FF_ENABLE_DEPRECATION_WARNINGS
+-#endif
+-
+ fctx->prev_thread = p;
+ fctx->next_decoding++;
+
+@@ -760,21 +680,16 @@ void ff_frame_thread_free(AVCodecContext *avctx, int thread_count)
+ if (codec->close && p->thread_init != UNINITIALIZED)
+ codec->close(ctx);
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+- release_delayed_buffers(p);
+- for (int j = 0; j < p->released_buffers_allocated; j++)
+- av_frame_free(&p->released_buffers[j]);
+- av_freep(&p->released_buffers);
+-#endif
+ if (ctx->priv_data) {
+ if (codec->p.priv_class)
+ av_opt_free(ctx->priv_data);
+ av_freep(&ctx->priv_data);
+ }
+
+ av_freep(&ctx->slice_offset);
+
+ av_buffer_unref(&ctx->internal->pool);
++ av_packet_free(&ctx->internal->last_pkt_props);
+ av_freep(&ctx->internal);
+ av_buffer_unref(&ctx->hw_frames_ctx);
+ }
+@@ -848,11 +763,14 @@ static av_cold int init_thread(PerThreadContext *p, int *threads_to_free,
+ if (!(p->frame = av_frame_alloc()) ||
+ !(p->avpkt = av_packet_alloc()))
+ return AVERROR(ENOMEM);
+- copy->internal->last_pkt_props = p->avpkt;
+
+ if (!first)
+ copy->internal->is_copy = 1;
+
++ copy->internal->last_pkt_props = av_packet_alloc();
++ if (!copy->internal->last_pkt_props)
++ return AVERROR(ENOMEM);
++
+ if (codec->init) {
+ err = codec->init(copy);
+ if (err < 0) {
+@@ -959,116 +877,48 @@ void ff_thread_flush(AVCodecContext *avctx)
+ av_frame_unref(p->frame);
+ p->result = 0;
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+- release_delayed_buffers(p);
+-#endif
+-
+ if (ffcodec(avctx->codec)->flush)
+ ffcodec(avctx->codec)->flush(p->avctx);
+ }
+ }
+
+ int ff_thread_can_start_frame(AVCodecContext *avctx)
+ {
+ PerThreadContext *p = avctx->internal->thread_ctx;
+-FF_DISABLE_DEPRECATION_WARNINGS
++
+ if ((avctx->active_thread_type&FF_THREAD_FRAME) && atomic_load(&p->state) != STATE_SETTING_UP &&
+- (ffcodec(avctx->codec)->update_thread_context
+-#if FF_API_THREAD_SAFE_CALLBACKS
+- || !THREAD_SAFE_CALLBACKS(avctx)
+-#endif
+- )) {
++ ffcodec(avctx->codec)->update_thread_context) {
+ return 0;
+ }
+-FF_ENABLE_DEPRECATION_WARNINGS
++
+ return 1;
+ }
+
+ static int thread_get_buffer_internal(AVCodecContext *avctx, AVFrame *f, int flags)
+ {
+ PerThreadContext *p;
+ int err;
+
+ if (!(avctx->active_thread_type & FF_THREAD_FRAME))
+ return ff_get_buffer(avctx, f, flags);
+
+ p = avctx->internal->thread_ctx;
+ FF_DISABLE_DEPRECATION_WARNINGS
+ if (atomic_load(&p->state) != STATE_SETTING_UP &&
+- (ffcodec(avctx->codec)->update_thread_context
+-#if FF_API_THREAD_SAFE_CALLBACKS
+- || !THREAD_SAFE_CALLBACKS(avctx)
+-#endif
+- )) {
++ ffcodec(avctx->codec)->update_thread_context) {
+ FF_ENABLE_DEPRECATION_WARNINGS
+ av_log(avctx, AV_LOG_ERROR, "get_buffer() cannot be called after ff_thread_finish_setup()\n");
+ return -1;
+ }
+
+ pthread_mutex_lock(&p->parent->buffer_mutex);
+-#if !FF_API_THREAD_SAFE_CALLBACKS
+ err = ff_get_buffer(avctx, f, flags);
+-#else
+-FF_DISABLE_DEPRECATION_WARNINGS
+- if (THREAD_SAFE_CALLBACKS(avctx)) {
+- err = ff_get_buffer(avctx, f, flags);
+- } else {
+- pthread_mutex_lock(&p->progress_mutex);
+- p->requested_frame = f;
+- p->requested_flags = flags;
+- atomic_store_explicit(&p->state, STATE_GET_BUFFER, memory_order_release);
+- pthread_cond_broadcast(&p->progress_cond);
+-
+- while (atomic_load(&p->state) != STATE_SETTING_UP)
+- pthread_cond_wait(&p->progress_cond, &p->progress_mutex);
+-
+- err = p->result;
+-
+- pthread_mutex_unlock(&p->progress_mutex);
+-
+- }
+- if (!THREAD_SAFE_CALLBACKS(avctx) && !ffcodec(avctx->codec)->update_thread_context)
+- ff_thread_finish_setup(avctx);
+-FF_ENABLE_DEPRECATION_WARNINGS
+-#endif
+
+ pthread_mutex_unlock(&p->parent->buffer_mutex);
+
+ return err;
+ }
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+-FF_DISABLE_DEPRECATION_WARNINGS
+-enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
+-{
+- enum AVPixelFormat res;
+- PerThreadContext *p;
+- if (!(avctx->active_thread_type & FF_THREAD_FRAME) || avctx->thread_safe_callbacks ||
+- avctx->get_format == avcodec_default_get_format)
+- return ff_get_format(avctx, fmt);
+-
+- p = avctx->internal->thread_ctx;
+- if (atomic_load(&p->state) != STATE_SETTING_UP) {
+- av_log(avctx, AV_LOG_ERROR, "get_format() cannot be called after ff_thread_finish_setup()\n");
+- return -1;
+- }
+- pthread_mutex_lock(&p->progress_mutex);
+- p->available_formats = fmt;
+- atomic_store(&p->state, STATE_GET_FORMAT);
+- pthread_cond_broadcast(&p->progress_cond);
+-
+- while (atomic_load(&p->state) != STATE_SETTING_UP)
+- pthread_cond_wait(&p->progress_cond, &p->progress_mutex);
+-
+- res = p->result_format;
+-
+- pthread_mutex_unlock(&p->progress_mutex);
+-
+- return res;
+-}
+-FF_ENABLE_DEPRECATION_WARNINGS
+-#endif
+-
+ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
+ {
+ int ret = thread_get_buffer_internal(avctx, f, flags);
+@@ -1110,69 +960,13 @@ int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
+
+ void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f)
+ {
+-#if FF_API_THREAD_SAFE_CALLBACKS
+-FF_DISABLE_DEPRECATION_WARNINGS
+- PerThreadContext *p;
+- FrameThreadContext *fctx;
+- AVFrame *dst;
+- int ret = 0;
+- int can_direct_free = !(avctx->active_thread_type & FF_THREAD_FRAME) ||
+- THREAD_SAFE_CALLBACKS(avctx);
+-FF_ENABLE_DEPRECATION_WARNINGS
+-#endif
+-
+ if (!f)
+ return;
+
+ if (avctx->debug & FF_DEBUG_BUFFERS)
+ av_log(avctx, AV_LOG_DEBUG, "thread_release_buffer called on pic %p\n", f);
+
+-#if !FF_API_THREAD_SAFE_CALLBACKS
+ av_frame_unref(f);
+-#else
+- // when the frame buffers are not allocated, just reset it to clean state
+- if (can_direct_free || !f->buf[0]) {
+- av_frame_unref(f);
+- return;
+- }
+-
+- p = avctx->internal->thread_ctx;
+- fctx = p->parent;
+- pthread_mutex_lock(&fctx->buffer_mutex);
+-
+- if (p->num_released_buffers == p->released_buffers_allocated) {
+- AVFrame **tmp = av_realloc_array(p->released_buffers, p->released_buffers_allocated + 1,
+- sizeof(*p->released_buffers));
+- if (tmp) {
+- tmp[p->released_buffers_allocated] = av_frame_alloc();
+- p->released_buffers = tmp;
+- }
+-
+- if (!tmp || !tmp[p->released_buffers_allocated]) {
+- ret = AVERROR(ENOMEM);
+- goto fail;
+- }
+- p->released_buffers_allocated++;
+- }
+-
+- dst = p->released_buffers[p->num_released_buffers];
+- av_frame_move_ref(dst, f);
+-
+- p->num_released_buffers++;
+-
+-fail:
+- pthread_mutex_unlock(&fctx->buffer_mutex);
+-
+- // make sure the frame is clean even if we fail to free it
+- // this leaks, but it is better than crashing
+- if (ret < 0) {
+- av_log(avctx, AV_LOG_ERROR, "Could not queue a frame for freeing, this will leak\n");
+- memset(f->buf, 0, sizeof(f->buf));
+- if (f->extended_buf)
+- memset(f->extended_buf, 0, f->nb_extended_buf * sizeof(*f->extended_buf));
+- av_frame_unref(f);
+- }
+-#endif
+ }
+
+ void ff_thread_release_ext_buffer(AVCodecContext *avctx, ThreadFrame *f)
+diff --git a/media/ffvpx/libavcodec/put_bits.h b/media/ffvpx/libavcodec/put_bits.h
+index 4b4f977ad5b1..4561dc131ac1 100644
+--- a/media/ffvpx/libavcodec/put_bits.h
++++ b/media/ffvpx/libavcodec/put_bits.h
+@@ -363,6 +363,13 @@ static inline void put_bits64(PutBitContext *s, int n, uint64_t value)
+ }
+ }
+
++static inline void put_sbits63(PutBitContext *pb, int n, int64_t value)
++{
++ av_assert2(n >= 0 && n < 64);
++
++ put_bits64(pb, n, (uint64_t)(value) & (~(UINT64_MAX << n)));
++}
++
+ /**
+ * Return the pointer to the byte where the bitstream writer will put
+ * the next bit.
+diff --git a/media/ffvpx/libavcodec/ratecontrol.h b/media/ffvpx/libavcodec/ratecontrol.h
+index 2a7aaec644c4..4de80fad9048 100644
+--- a/media/ffvpx/libavcodec/ratecontrol.h
++++ b/media/ffvpx/libavcodec/ratecontrol.h
+@@ -80,9 +80,6 @@ typedef struct RateControlContext{
+ int frame_count[5];
+ int last_non_b_pict_type;
+
+- void *non_lavc_opaque; ///< context for non lavc rc code (for example xvid)
+- float dry_run_qscale; ///< for xvid rc
+- int last_picture_number; ///< for xvid rc
+ AVExpr * rc_eq_eval;
+ }RateControlContext;
+
+diff --git a/media/ffvpx/libavcodec/thread.h b/media/ffvpx/libavcodec/thread.h
+index d5673f25eaff..88a14cfeb12a 100644
+--- a/media/ffvpx/libavcodec/thread.h
++++ b/media/ffvpx/libavcodec/thread.h
+@@ -62,19 +62,7 @@ int ff_thread_decode_frame(AVCodecContext *avctx, AVFrame *picture,
+ */
+ void ff_thread_finish_setup(AVCodecContext *avctx);
+
+-#if FF_API_THREAD_SAFE_CALLBACKS
+-/**
+- * Wrapper around get_format() for frame-multithreaded codecs.
+- * Call this function instead of avctx->get_format().
+- * Cannot be called after the codec has called ff_thread_finish_setup().
+- *
+- * @param avctx The current context.
+- * @param fmt The list of available formats.
+- */
+-enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt);
+-#else
+ #define ff_thread_get_format ff_get_format
+-#endif
+
+ /**
+ * Wrapper around get_buffer() for frame-multithreaded codecs.
+diff --git a/media/ffvpx/libavcodec/utils.c b/media/ffvpx/libavcodec/utils.c
+index 2b63a498b9ab..599da21dba29 100644
+--- a/media/ffvpx/libavcodec/utils.c
++++ b/media/ffvpx/libavcodec/utils.c
+@@ -243,6 +243,8 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
+ case AV_PIX_FMT_GBRAP16BE:
+ w_align = 16; //FIXME assume 16 pixel per macroblock
+ h_align = 16 * 2; // interlaced needs 2 macroblocks height
++ if (s->codec_id == AV_CODEC_ID_BINKVIDEO)
++ w_align = 16*2;
+ break;
+ case AV_PIX_FMT_YUV411P:
+ case AV_PIX_FMT_YUVJ411P:
+@@ -321,19 +323,23 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
+ *width = FFALIGN(*width, w_align);
+ *height = FFALIGN(*height, h_align);
+ if (s->codec_id == AV_CODEC_ID_H264 || s->lowres ||
++ s->codec_id == AV_CODEC_ID_VC1 || s->codec_id == AV_CODEC_ID_WMV3 ||
+ s->codec_id == AV_CODEC_ID_VP5 || s->codec_id == AV_CODEC_ID_VP6 ||
+ s->codec_id == AV_CODEC_ID_VP6F || s->codec_id == AV_CODEC_ID_VP6A
+ ) {
+ // some of the optimized chroma MC reads one line too much
+ // which is also done in mpeg decoders with lowres > 0
+ *height += 2;
+
+ // H.264 uses edge emulation for out of frame motion vectors, for this
+ // it requires a temporary area large enough to hold a 21x21 block,
+ // increasing witdth ensure that the temporary area is large enough,
+ // the next rounded up width is 32
+ *width = FFMAX(*width, 32);
+ }
++ if (s->codec_id == AV_CODEC_ID_SVQ3) {
++ *width = FFMAX(*width, 32);
++ }
+
+ for (i = 0; i < 4; i++)
+ linesize_align[i] = STRIDE_ALIGN;
+@@ -514,7 +520,9 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id)
+ case AV_CODEC_ID_PCM_SGA:
+ case AV_CODEC_ID_PCM_U8:
+ case AV_CODEC_ID_SDX2_DPCM:
++ case AV_CODEC_ID_CBD2_DPCM:
+ case AV_CODEC_ID_DERF_DPCM:
++ case AV_CODEC_ID_WADY_DPCM:
+ return 8;
+ case AV_CODEC_ID_PCM_S16BE:
+ case AV_CODEC_ID_PCM_S16BE_PLANAR:
+@@ -765,6 +773,9 @@ static int get_audio_frame_duration(enum AVCodecID id, int sr, int ch, int ba,
+ case AV_CODEC_ID_ADPCM_MTAF:
+ tmp = blocks * (ba - 16LL) * 2 / ch;
+ break;
++ case AV_CODEC_ID_ADPCM_XMD:
++ tmp = blocks * 32;
++ break;
+ }
+ if (tmp) {
+ if (tmp != (int)tmp)
+@@ -906,11 +917,6 @@ int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src)
+
+ #if !HAVE_THREADS
+
+-enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
+-{
+- return ff_get_format(avctx, fmt);
+-}
+-
+ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
+ {
+ return ff_get_buffer(avctx, f, flags);
+diff --git a/media/ffvpx/libavcodec/vaapi_av1.c b/media/ffvpx/libavcodec/vaapi_av1.c
+index 63374c31c986..d0339b2705a8 100644
+--- a/media/ffvpx/libavcodec/vaapi_av1.c
++++ b/media/ffvpx/libavcodec/vaapi_av1.c
+@@ -274,7 +274,7 @@ static int vaapi_av1_start_frame(AVCodecContext *avctx,
+ };
+
+ for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) {
+- if (pic_param.pic_info_fields.bits.frame_type == AV1_FRAME_KEY)
++ if (pic_param.pic_info_fields.bits.frame_type == AV1_FRAME_KEY && frame_header->show_frame)
+ pic_param.ref_frame_map[i] = VA_INVALID_ID;
+ else
+ pic_param.ref_frame_map[i] = ctx->ref_tab[i].valid ?
+diff --git a/media/ffvpx/libavcodec/vaapi_decode.c b/media/ffvpx/libavcodec/vaapi_decode.c
+index 134f10eca5fd..ab8c12e36423 100644
+--- a/media/ffvpx/libavcodec/vaapi_decode.c
++++ b/media/ffvpx/libavcodec/vaapi_decode.c
+@@ -410,7 +410,9 @@ static const struct {
+ #endif
+ #if VA_CHECK_VERSION(1, 2, 0) && CONFIG_HEVC_VAAPI_HWACCEL
+ MAP(HEVC, HEVC_REXT, None,
+- ff_vaapi_parse_hevc_rext_profile ),
++ ff_vaapi_parse_hevc_rext_scc_profile ),
++ MAP(HEVC, HEVC_SCC, None,
++ ff_vaapi_parse_hevc_rext_scc_profile ),
+ #endif
+ MAP(MJPEG, MJPEG_HUFFMAN_BASELINE_DCT,
+ JPEGBaseline),
+diff --git a/media/ffvpx/libavcodec/vaapi_hevc.h b/media/ffvpx/libavcodec/vaapi_hevc.h
+index b3b0e6fc1e98..449635d0d706 100644
+--- a/media/ffvpx/libavcodec/vaapi_hevc.h
++++ b/media/ffvpx/libavcodec/vaapi_hevc.h
+@@ -22,6 +22,6 @@
+ #include <va/va.h>
+ #include "avcodec.h"
+
+-VAProfile ff_vaapi_parse_hevc_rext_profile(AVCodecContext *avctx);
++VAProfile ff_vaapi_parse_hevc_rext_scc_profile(AVCodecContext *avctx);
+
+ #endif /* AVCODEC_VAAPI_HEVC_H */
+diff --git a/media/ffvpx/libavcodec/version.h b/media/ffvpx/libavcodec/version.h
+index 43d0d9a9fcb1..7aa95fc3f1c1 100644
+--- a/media/ffvpx/libavcodec/version.h
++++ b/media/ffvpx/libavcodec/version.h
+@@ -29,8 +29,8 @@
+
+ #include "version_major.h"
+
+-#define LIBAVCODEC_VERSION_MINOR 51
+-#define LIBAVCODEC_VERSION_MICRO 101
++#define LIBAVCODEC_VERSION_MINOR 5
++#define LIBAVCODEC_VERSION_MICRO 100
+
+ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
+ LIBAVCODEC_VERSION_MINOR, \
+diff --git a/media/ffvpx/libavcodec/version_major.h b/media/ffvpx/libavcodec/version_major.h
+index 12f863deb79d..c2f118b26204 100644
+--- a/media/ffvpx/libavcodec/version_major.h
++++ b/media/ffvpx/libavcodec/version_major.h
+@@ -25,33 +25,28 @@
+ * Libavcodec version macros.
+ */
+
+-#define LIBAVCODEC_VERSION_MAJOR 59
++#define LIBAVCODEC_VERSION_MAJOR 60
+
+ /**
+ * 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_OPENH264_SLICE_MODE (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_OPENH264_CABAC (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_UNUSED_CODEC_CAPS (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_THREAD_SAFE_CALLBACKS (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_DEBUG_MV (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_GET_FRAME_CLASS (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_AUTO_THREADS (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_INIT_PACKET (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_FLAG_TRUNCATED (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_SUB_TEXT_FORMAT (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_IDCT_NONE (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_SVTAV1_OPTS (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_AYUV_CODECID (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_VT_OUTPUT_CALLBACK (LIBAVCODEC_VERSION_MAJOR < 60)
+-#define FF_API_AVCODEC_CHROMA_POS (LIBAVCODEC_VERSION_MAJOR < 60)
++#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)
++
++// reminder to remove CrystalHD decoders on next major bump
++#define FF_CODEC_CRYSTAL_HD (LIBAVCODEC_VERSION_MAJOR < 61)
+
+ #endif /* AVCODEC_VERSION_MAJOR_H */
+diff --git a/media/ffvpx/libavcodec/videodsp_template.c b/media/ffvpx/libavcodec/videodsp_template.c
+index 324d70f2cb26..d653f4d524df 100644
+--- a/media/ffvpx/libavcodec/videodsp_template.c
++++ b/media/ffvpx/libavcodec/videodsp_template.c
+@@ -64,30 +64,30 @@ void FUNC(ff_emulated_edge_mc)(uint8_t *buf, const uint8_t *src,
+ av_assert2(start_x < end_x && block_w);
+
+ w = end_x - start_x;
+- src += start_y * src_linesize + start_x * sizeof(pixel);
++ src += start_y * src_linesize + start_x * (ptrdiff_t)sizeof(pixel);
+ buf += start_x * sizeof(pixel);
+
+ // top
+ for (y = 0; y < start_y; y++) {
+ memcpy(buf, src, w * sizeof(pixel));
+ buf += buf_linesize;
+ }
+
+ // copy existing part
+ for (; y < end_y; y++) {
+ memcpy(buf, src, w * sizeof(pixel));
+ src += src_linesize;
+ buf += buf_linesize;
+ }
+
+ // bottom
+ src -= src_linesize;
+ for (; y < block_h; y++) {
+ memcpy(buf, src, w * sizeof(pixel));
+ buf += buf_linesize;
+ }
+
+- buf -= block_h * buf_linesize + start_x * sizeof(pixel);
++ buf -= block_h * buf_linesize + start_x * (ptrdiff_t)sizeof(pixel);
+ while (block_h--) {
+ pixel *bufp = (pixel *) buf;
+
+diff --git a/media/ffvpx/libavcodec/vp8.c b/media/ffvpx/libavcodec/vp8.c
+index 67f36d893370..db2419deaf70 100644
+--- a/media/ffvpx/libavcodec/vp8.c
++++ b/media/ffvpx/libavcodec/vp8.c
+@@ -2404,15 +2404,16 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void
+ int num_jobs = s->num_jobs;
+ const VP8Frame *prev_frame = s->prev_frame;
+ VP8Frame *curframe = s->curframe;
+- VPXRangeCoder *c = &s->coeff_partition[mb_y & (s->num_coeff_partitions - 1)];
++ VPXRangeCoder *coeff_c = &s->coeff_partition[mb_y & (s->num_coeff_partitions - 1)];
++
+ VP8Macroblock *mb;
+ uint8_t *dst[3] = {
+ curframe->tf.f->data[0] + 16 * mb_y * s->linesize,
+ curframe->tf.f->data[1] + 8 * mb_y * s->uvlinesize,
+ curframe->tf.f->data[2] + 8 * mb_y * s->uvlinesize
+ };
+
+- if (vpx_rac_is_end(c))
++ if (vpx_rac_is_end(&s->c))
+ return AVERROR_INVALIDDATA;
+
+ if (mb_y == 0)
+@@ -2443,35 +2444,38 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void
+ td->mv_bounds.mv_max.x = ((s->mb_width - 1) << 6) + MARGIN;
+
+ for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) {
+- if (vpx_rac_is_end(c))
++ if (vpx_rac_is_end(&s->c))
+ return AVERROR_INVALIDDATA;
+ // Wait for previous thread to read mb_x+2, and reach mb_y-1.
+ if (prev_td != td) {
+ if (threadnr != 0) {
+ check_thread_pos(td, prev_td,
+ mb_x + (is_vp7 ? 2 : 1),
+ mb_y - (is_vp7 ? 2 : 1));
+ } else {
+ check_thread_pos(td, prev_td,
+ mb_x + (is_vp7 ? 2 : 1) + s->mb_width + 3,
+ mb_y - (is_vp7 ? 2 : 1));
+ }
+ }
+
+ s->vdsp.prefetch(dst[0] + (mb_x & 3) * 4 * s->linesize + 64,
+ s->linesize, 4);
+ s->vdsp.prefetch(dst[1] + (mb_x & 7) * s->uvlinesize + 64,
+ dst[2] - dst[1], 2);
+
+ if (!s->mb_layout)
+ decode_mb_mode(s, &td->mv_bounds, mb, mb_x, mb_y, curframe->seg_map->data + mb_xy,
+ prev_frame && prev_frame->seg_map ?
+ prev_frame->seg_map->data + mb_xy : NULL, 0, is_vp7);
+
+ prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP8_FRAME_PREVIOUS);
+
+- if (!mb->skip)
+- decode_mb_coeffs(s, td, c, mb, s->top_nnz[mb_x], td->left_nnz, is_vp7);
++ if (!mb->skip) {
++ if (vpx_rac_is_end(coeff_c))
++ return AVERROR_INVALIDDATA;
++ decode_mb_coeffs(s, td, coeff_c, mb, s->top_nnz[mb_x], td->left_nnz, is_vp7);
++ }
+
+ if (mb->mode <= MODE_I4x4)
+ intra_predict(s, td, dst, mb, mb_x, mb_y, is_vp7);
+diff --git a/media/ffvpx/libavcodec/x86/fft.asm b/media/ffvpx/libavcodec/x86/fft.asm
+index a44596e5655c..34c3fc9a0f5a 100644
+--- a/media/ffvpx/libavcodec/x86/fft.asm
++++ b/media/ffvpx/libavcodec/x86/fft.asm
+@@ -475,7 +475,7 @@ cglobal fft_calc, 2,5,8
+ mov r0, r1
+ mov r1, r3
+ FFT_DISPATCH _interleave %+ SUFFIX, r1
+- REP_RET
++ RET
+
+ %endif
+
+@@ -510,7 +510,7 @@ cglobal fft_calc, 2,5,8
+ add r2, mmsize*2
+ jl .loop
+ .end:
+- REP_RET
++ RET
+
+ cglobal fft_permute, 2,7,1
+ mov r4, [r0 + FFTContext.revtab]
+@@ -543,7 +543,7 @@ cglobal fft_permute, 2,7,1
+ movaps [r1 + r2 + 16], xmm1
+ add r2, 32
+ jl .loopcopy
+- REP_RET
++ RET
+
+ INIT_XMM sse
+ cglobal imdct_calc, 3,5,3
+@@ -583,7 +583,7 @@ cglobal imdct_calc, 3,5,3
+ sub r3, mmsize
+ add r2, mmsize
+ jl .loop
+- REP_RET
++ RET
+
+ %ifdef PIC
+ %define SECTION_REL - $$
+diff --git a/media/ffvpx/libavcodec/x86/flacdsp.asm b/media/ffvpx/libavcodec/x86/flacdsp.asm
+index 6d755f497281..44416e4dfde7 100644
+--- a/media/ffvpx/libavcodec/x86/flacdsp.asm
++++ b/media/ffvpx/libavcodec/x86/flacdsp.asm
+@@ -79,7 +79,7 @@ ALIGN 16
+ movd [decodedq+4], m1
+ jg .loop_sample
+ .ret:
+- REP_RET
++ RET
+ %endmacro
+
+ %if HAVE_XOP_EXTERNAL
+@@ -133,7 +133,7 @@ align 16
+ mova [outq + lenq], m%2
+ add lenq, 16
+ jl .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse2
+@@ -177,7 +177,7 @@ align 16
+ add outq, mmsize*2
+ sub lend, mmsize/4
+ jg .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse2
+@@ -302,7 +302,7 @@ align 16
+ add outq, mmsize*REPCOUNT
+ sub lend, mmsize/4
+ jg .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM ssse3
+diff --git a/media/ffvpx/libavcodec/x86/h264_intrapred.asm b/media/ffvpx/libavcodec/x86/h264_intrapred.asm
+index 31840a14720f..8a38ba2bb5d2 100644
+--- a/media/ffvpx/libavcodec/x86/h264_intrapred.asm
++++ b/media/ffvpx/libavcodec/x86/h264_intrapred.asm
+@@ -62,7 +62,7 @@ cglobal pred16x16_vertical_8, 2,3
+ lea r0, [r0+r1*2]
+ dec r2
+ jg .loop
+- REP_RET
++ RET
+
+ ;-----------------------------------------------------------------------------
+ ; void ff_pred16x16_horizontal_8(uint8_t *src, ptrdiff_t stride)
+@@ -95,7 +95,7 @@ cglobal pred16x16_horizontal_8, 2,3
+ lea r0, [r0+r1*2]
+ dec r2
+ jg .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_MMX mmxext
+@@ -146,7 +146,7 @@ cglobal pred16x16_dc_8, 2,7
+ lea r4, [r4+r1*2]
+ dec r3d
+ jg .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse2
+@@ -192,7 +192,7 @@ cglobal pred16x16_tm_vp8_8, 2,6,6
+ lea r0, [r0+r1*2]
+ dec r5d
+ jg .loop
+- REP_RET
++ RET
+
+ %if HAVE_AVX2_EXTERNAL
+ INIT_YMM avx2
+@@ -228,7 +228,7 @@ cglobal pred16x16_tm_vp8_8, 2, 4, 5, dst, stride, stride3, iteration
+ lea dstq, [dstq+strideq*4]
+ dec iterationd
+ jg .loop
+- REP_RET
++ RET
+ %endif
+
+ ;-----------------------------------------------------------------------------
+@@ -427,7 +427,7 @@ cglobal pred16x16_plane_%1_8, 2,9,7
+ lea r0, [r0+r2*2]
+ dec r4
+ jg .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse2
+@@ -556,7 +556,7 @@ ALIGN 16
+ lea r0, [r0+r2*2]
+ dec r4
+ jg .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse2
+@@ -599,7 +599,7 @@ cglobal pred8x8_horizontal_8, 2,3
+ lea r0, [r0+r1*2]
+ dec r2
+ jg .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_MMX mmxext
+@@ -737,7 +737,7 @@ cglobal pred8x8_dc_rv40_8, 2,7
+ lea r4, [r4+r1*2]
+ dec r3d
+ jg .loop
+- REP_RET
++ RET
+
+ ;-----------------------------------------------------------------------------
+ ; void ff_pred8x8_tm_vp8_8(uint8_t *src, ptrdiff_t stride)
+@@ -770,34 +770,34 @@ cglobal pred8x8_tm_vp8_8, 2,6,4
+ lea r0, [r0+r1*2]
+ dec r5d
+ jg .loop
+- REP_RET
++ RET
+
+ INIT_XMM ssse3
+ cglobal pred8x8_tm_vp8_8, 2,3,6
+ sub r0, r1
+ movdqa xmm4, [tm_shuf]
+ pxor xmm1, xmm1
+ movq xmm0, [r0]
+ punpcklbw xmm0, xmm1
+ movd xmm5, [r0-4]
+ pshufb xmm5, xmm4
+ mov r2d, 4
+ .loop:
+ movd xmm2, [r0+r1*1-4]
+ movd xmm3, [r0+r1*2-4]
+ pshufb xmm2, xmm4
+ pshufb xmm3, xmm4
+ psubw xmm2, xmm5
+ psubw xmm3, xmm5
+ paddw xmm2, xmm0
+ paddw xmm3, xmm0
+ packuswb xmm2, xmm3
+ movq [r0+r1*1], xmm2
+ movhps [r0+r1*2], xmm2
+ lea r0, [r0+r1*2]
+ dec r2d
+ jg .loop
+- REP_RET
++ RET
+
+ ; dest, left, right, src, tmp
+ ; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
+@@ -1802,7 +1802,7 @@ cglobal pred4x4_tm_vp8_8, 3,6
+ lea r0, [r0+r2*2]
+ dec r5d
+ jg .loop
+- REP_RET
++ RET
+
+ INIT_XMM ssse3
+ cglobal pred4x4_tm_vp8_8, 3,3
+diff --git a/media/ffvpx/libavcodec/x86/h264_intrapred_10bit.asm b/media/ffvpx/libavcodec/x86/h264_intrapred_10bit.asm
+index c4645d434ee1..2f30807332ad 100644
+--- a/media/ffvpx/libavcodec/x86/h264_intrapred_10bit.asm
++++ b/media/ffvpx/libavcodec/x86/h264_intrapred_10bit.asm
+@@ -327,7 +327,7 @@ cglobal pred8x8_horizontal_10, 2, 3
+ lea r0, [r0+r1*2]
+ dec r2d
+ jg .loop
+- REP_RET
++ RET
+
+ ;-----------------------------------------------------------------------------
+ ; void ff_predict_8x8_dc_10(pixel *src, ptrdiff_t stride)
+@@ -481,7 +481,7 @@ cglobal pred8x8_plane_10, 2, 7, 7
+ add r0, r1
+ dec r2d
+ jg .loop
+- REP_RET
++ RET
+
+
+ ;-----------------------------------------------------------------------------
+@@ -994,25 +994,25 @@ cglobal pred16x16_vertical_10, 2, 3
+ lea r0, [r0+r1*2]
+ dec r2d
+ jg .loop
+- REP_RET
++ RET
+
+ ;-----------------------------------------------------------------------------
+ ; void ff_pred16x16_horizontal_10(pixel *src, ptrdiff_t stride)
+ ;-----------------------------------------------------------------------------
+ INIT_XMM sse2
+ cglobal pred16x16_horizontal_10, 2, 3
+ mov r2d, 8
+ .vloop:
+ movd m0, [r0+r1*0-4]
+ movd m1, [r0+r1*1-4]
+ SPLATW m0, m0, 1
+ SPLATW m1, m1, 1
+ MOV16 r0+r1*0, m0, m0, m0, m0
+ MOV16 r0+r1*1, m1, m1, m1, m1
+ lea r0, [r0+r1*2]
+ dec r2d
+ jg .vloop
+- REP_RET
++ RET
+
+ ;-----------------------------------------------------------------------------
+ ; void ff_pred16x16_dc_10(pixel *src, ptrdiff_t stride)
+@@ -1048,29 +1048,29 @@ cglobal pred16x16_dc_10, 2, 6
+ lea r5, [r5+r1*2]
+ dec r3d
+ jg .loop
+- REP_RET
++ RET
+
+ ;-----------------------------------------------------------------------------
+ ; void ff_pred16x16_top_dc_10(pixel *src, ptrdiff_t stride)
+ ;-----------------------------------------------------------------------------
+ INIT_XMM sse2
+ cglobal pred16x16_top_dc_10, 2, 3
+ sub r0, r1
+ mova m0, [r0+0]
+ paddw m0, [r0+mmsize]
+ HADDW m0, m2
+
+ SPLATW m0, m0
+ paddw m0, [pw_8]
+ psrlw m0, 4
+ mov r2d, 8
+ .loop:
+ MOV16 r0+r1*1, m0, m0, m0, m0
+ MOV16 r0+r1*2, m0, m0, m0, m0
+ lea r0, [r0+r1*2]
+ dec r2d
+ jg .loop
+- REP_RET
++ RET
+
+ ;-----------------------------------------------------------------------------
+ ; void ff_pred16x16_left_dc_10(pixel *src, ptrdiff_t stride)
+@@ -1101,19 +1101,19 @@ cglobal pred16x16_left_dc_10, 2, 6
+ lea r5, [r5+r1*2]
+ dec r3d
+ jg .loop
+- REP_RET
++ RET
+
+ ;-----------------------------------------------------------------------------
+ ; void ff_pred16x16_128_dc_10(pixel *src, ptrdiff_t stride)
+ ;-----------------------------------------------------------------------------
+ INIT_XMM sse2
+ cglobal pred16x16_128_dc_10, 2,3
+ mova m0, [pw_512]
+ mov r2d, 8
+ .loop:
+ MOV16 r0+r1*0, m0, m0, m0, m0
+ MOV16 r0+r1*1, m0, m0, m0, m0
+ lea r0, [r0+r1*2]
+ dec r2d
+ jg .loop
+- REP_RET
++ RET
+diff --git a/media/ffvpx/libavcodec/x86/videodsp.asm b/media/ffvpx/libavcodec/x86/videodsp.asm
+index b19a8300c54c..3cc07878d3b8 100644
+--- a/media/ffvpx/libavcodec/x86/videodsp.asm
++++ b/media/ffvpx/libavcodec/x86/videodsp.asm
+@@ -433,4 +433,4 @@ cglobal prefetch, 3, 3, 0, buf, stride, h
+ add bufq, strideq
+ dec hd
+ jg .loop
+- REP_RET
++ RET
+diff --git a/media/ffvpx/libavcodec/x86/vp8dsp.asm b/media/ffvpx/libavcodec/x86/vp8dsp.asm
+index 33d488bf6f21..6ac5a7721bfc 100644
+--- a/media/ffvpx/libavcodec/x86/vp8dsp.asm
++++ b/media/ffvpx/libavcodec/x86/vp8dsp.asm
+@@ -200,7 +200,7 @@ cglobal put_vp8_epel%1_h6, 6, 6 + npicregs, 8, dst, dststride, src, srcstride, h
+ add srcq, srcstrideq
+ dec heightd ; next row
+ jg .nextrow
+- REP_RET
++ RET
+
+ cglobal put_vp8_epel%1_h4, 6, 6 + npicregs, 7, dst, dststride, src, srcstride, height, mx, picreg
+ shl mxd, 4
+@@ -230,7 +230,7 @@ cglobal put_vp8_epel%1_h4, 6, 6 + npicregs, 7, dst, dststride, src, srcstride, h
+ add srcq, srcstrideq
+ dec heightd ; next row
+ jg .nextrow
+- REP_RET
++ RET
+
+ cglobal put_vp8_epel%1_v4, 7, 7, 8, dst, dststride, src, srcstride, height, picreg, my
+ shl myd, 4
+@@ -268,7 +268,7 @@ cglobal put_vp8_epel%1_v4, 7, 7, 8, dst, dststride, src, srcstride, height, picr
+ add srcq, srcstrideq
+ dec heightd ; next row
+ jg .nextrow
+- REP_RET
++ RET
+
+ cglobal put_vp8_epel%1_v6, 7, 7, 8, dst, dststride, src, srcstride, height, picreg, my
+ lea myd, [myq*3]
+@@ -314,7 +314,7 @@ cglobal put_vp8_epel%1_v6, 7, 7, 8, dst, dststride, src, srcstride, height, picr
+ add srcq, srcstrideq
+ dec heightd ; next row
+ jg .nextrow
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_MMX ssse3
+@@ -368,7 +368,7 @@ cglobal put_vp8_epel4_h4, 6, 6 + npicregs, 0, dst, dststride, src, srcstride, he
+ add srcq, srcstrideq
+ dec heightd ; next row
+ jg .nextrow
+- REP_RET
++ RET
+
+ ; 4x4 block, H-only 6-tap filter
+ INIT_MMX mmxext
+@@ -426,7 +426,7 @@ cglobal put_vp8_epel4_h6, 6, 6 + npicregs, 0, dst, dststride, src, srcstride, he
+ add srcq, srcstrideq
+ dec heightd ; next row
+ jg .nextrow
+- REP_RET
++ RET
+
+ INIT_XMM sse2
+ cglobal put_vp8_epel8_h4, 6, 6 + npicregs, 10, dst, dststride, src, srcstride, height, mx, picreg
+@@ -474,7 +474,7 @@ cglobal put_vp8_epel8_h4, 6, 6 + npicregs, 10, dst, dststride, src, srcstride, h
+ add srcq, srcstrideq
+ dec heightd ; next row
+ jg .nextrow
+- REP_RET
++ RET
+
+ INIT_XMM sse2
+ cglobal put_vp8_epel8_h6, 6, 6 + npicregs, 14, dst, dststride, src, srcstride, height, mx, picreg
+@@ -537,7 +537,7 @@ cglobal put_vp8_epel8_h6, 6, 6 + npicregs, 14, dst, dststride, src, srcstride, h
+ add srcq, srcstrideq
+ dec heightd ; next row
+ jg .nextrow
+- REP_RET
++ RET
+
+ %macro FILTER_V 1
+ ; 4x4 block, V-only 4-tap filter
+@@ -590,7 +590,7 @@ cglobal put_vp8_epel%1_v4, 7, 7, 8, dst, dststride, src, srcstride, height, picr
+ add srcq, srcstrideq
+ dec heightd ; next row
+ jg .nextrow
+- REP_RET
++ RET
+
+
+ ; 4x4 block, V-only 6-tap filter
+@@ -655,7 +655,7 @@ cglobal put_vp8_epel%1_v6, 7, 7, 8, dst, dststride, src, srcstride, height, picr
+ add srcq, srcstrideq
+ dec heightd ; next row
+ jg .nextrow
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_MMX mmxext
+@@ -738,7 +738,7 @@ cglobal put_vp8_bilinear%1_v, 7, 7, 7, dst, dststride, src, srcstride, height, p
+ lea srcq, [srcq+srcstrideq*2]
+ sub heightd, 2
+ jg .nextrow
+- REP_RET
++ RET
+
+ %if cpuflag(ssse3)
+ cglobal put_vp8_bilinear%1_h, 6, 6 + npicregs, 5, dst, dststride, src, srcstride, height, mx, picreg
+@@ -815,43 +815,43 @@ cglobal put_vp8_bilinear%1_h, 6, 6 + npicregs, 7, dst, dststride, src, srcstride
+ lea srcq, [srcq+srcstrideq*2]
+ sub heightd, 2
+ jg .nextrow
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_MMX mmxext
+ FILTER_BILINEAR 4
+ INIT_XMM sse2
+ FILTER_BILINEAR 8
+ INIT_MMX ssse3
+ FILTER_BILINEAR 4
+ INIT_XMM ssse3
+ FILTER_BILINEAR 8
+
+ INIT_MMX mmx
+ cglobal put_vp8_pixels8, 5, 5, 0, dst, dststride, src, srcstride, height
+ .nextrow:
+ movq mm0, [srcq+srcstrideq*0]
+ movq mm1, [srcq+srcstrideq*1]
+ lea srcq, [srcq+srcstrideq*2]
+ movq [dstq+dststrideq*0], mm0
+ movq [dstq+dststrideq*1], mm1
+ lea dstq, [dstq+dststrideq*2]
+ sub heightd, 2
+ jg .nextrow
+- REP_RET
++ RET
+
+ INIT_XMM sse
+ cglobal put_vp8_pixels16, 5, 5, 2, dst, dststride, src, srcstride, height
+ .nextrow:
+ movups xmm0, [srcq+srcstrideq*0]
+ movups xmm1, [srcq+srcstrideq*1]
+ lea srcq, [srcq+srcstrideq*2]
+ movaps [dstq+dststrideq*0], xmm0
+ movaps [dstq+dststrideq*1], xmm1
+ lea dstq, [dstq+dststrideq*2]
+ sub heightd, 2
+ jg .nextrow
+- REP_RET
++ RET
+
+ ;-----------------------------------------------------------------------------
+ ; void ff_vp8_idct_dc_add_<opt>(uint8_t *dst, int16_t block[16], ptrdiff_t stride);
+diff --git a/media/ffvpx/libavutil/avstring.c b/media/ffvpx/libavutil/avstring.c
+index 5ddbe9219e8e..e460b5be7f33 100644
+--- a/media/ffvpx/libavutil/avstring.c
++++ b/media/ffvpx/libavutil/avstring.c
+@@ -139,16 +139,6 @@ end:
+ return p;
+ }
+
+-#if FF_API_D2STR
+-char *av_d2str(double d)
+-{
+- char *str = av_malloc(16);
+- if (str)
+- snprintf(str, 16, "%f", d);
+- return str;
+-}
+-#endif
+-
+ #define WHITESPACES " \n\t\r"
+
+ char *av_get_token(const char **buf, const char *term)
+diff --git a/media/ffvpx/libavutil/avstring.h b/media/ffvpx/libavutil/avstring.h
+index 74aa4cd0e4e2..e26026376308 100644
+--- a/media/ffvpx/libavutil/avstring.h
++++ b/media/ffvpx/libavutil/avstring.h
+@@ -157,15 +157,6 @@ static inline size_t av_strnlen(const char *s, size_t len)
+ */
+ char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2);
+
+-#if FF_API_D2STR
+-/**
+- * Convert a number to an av_malloced string.
+- * @deprecated use av_asprintf() with "%f" or a more specific format
+- */
+-attribute_deprecated
+-char *av_d2str(double d);
+-#endif
+-
+ /**
+ * Unescape the given string until a non escaped terminating char,
+ * and return the token corresponding to the unescaped string.
+diff --git a/media/ffvpx/libavutil/avutil.symbols b/media/ffvpx/libavutil/avutil.symbols
+index f3081a024bcb..aefd9b731098 100644
+--- a/media/ffvpx/libavutil/avutil.symbols
++++ b/media/ffvpx/libavutil/avutil.symbols
+@@ -54,14 +54,14 @@ av_crc
+ av_crc_get_table
+ av_crc_init
+ av_d2q
+-av_d2str
+ av_default_get_category
+ av_default_item_name
+ av_dict_copy
+ av_dict_count
+ av_dict_free
+ av_dict_get
+ av_dict_get_string
++av_dict_iterate
+ av_dict_parse_string
+ av_dict_set
+ av_dict_set_int
+@@ -134,7 +134,6 @@ av_get_channel_layout_channel_index
+ av_get_channel_layout_nb_channels
+ av_get_channel_layout_string
+ av_get_channel_name
+-av_get_colorspace_name
+ av_get_cpu_flags
+ av_get_default_channel_layout
+ av_get_known_color_name
+@@ -325,4 +324,3 @@ av_hwdevice_ctx_init
+ av_hwframe_transfer_get_formats
+ av_hwdevice_ctx_create_derived
+ av_malloc_array
+-av_mallocz_array
+diff --git a/media/ffvpx/libavutil/channel_layout.c b/media/ffvpx/libavutil/channel_layout.c
+index 5af7ea0e010c..e2f7512254a8 100644
+--- a/media/ffvpx/libavutil/channel_layout.c
++++ b/media/ffvpx/libavutil/channel_layout.c
+@@ -196,6 +196,7 @@ static const struct channel_layout_name channel_layout_map[] = {
+ { "7.1", AV_CHANNEL_LAYOUT_7POINT1 },
+ { "7.1(wide)", AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK },
+ { "7.1(wide-side)", AV_CHANNEL_LAYOUT_7POINT1_WIDE },
++ { "7.1(top)", AV_CHANNEL_LAYOUT_7POINT1_TOP_BACK },
+ { "octagonal", AV_CHANNEL_LAYOUT_OCTAGONAL },
+ { "cube", AV_CHANNEL_LAYOUT_CUBE },
+ { "hexadecagonal", AV_CHANNEL_LAYOUT_HEXADECAGONAL },
+diff --git a/media/ffvpx/libavutil/channel_layout.h b/media/ffvpx/libavutil/channel_layout.h
+index 3e691633607e..f345415c55e4 100644
+--- a/media/ffvpx/libavutil/channel_layout.h
++++ b/media/ffvpx/libavutil/channel_layout.h
+@@ -232,6 +232,7 @@ enum AVChannelOrder {
+ #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_7POINT1_TOP_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_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)
+@@ -389,6 +390,7 @@ typedef struct AVChannelLayout {
+ #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_7POINT1_TOP_BACK AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_7POINT1_TOP_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_HEXADECAGONAL AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_HEXADECAGONAL)
+diff --git a/media/ffvpx/libavutil/dict.c b/media/ffvpx/libavutil/dict.c
+index 14ad780a7919..f673977a986b 100644
+--- a/media/ffvpx/libavutil/dict.c
++++ b/media/ffvpx/libavutil/dict.c
+@@ -20,50 +20,65 @@
+
+ #include <string.h>
+
++#include "avassert.h"
+ #include "avstring.h"
+ #include "dict.h"
+ #include "dict_internal.h"
+ #include "internal.h"
+ #include "mem.h"
+ #include "time_internal.h"
+ #include "bprint.h"
+
+ struct AVDictionary {
+ int count;
+ AVDictionaryEntry *elems;
+ };
+
+ int av_dict_count(const AVDictionary *m)
+ {
+ return m ? m->count : 0;
+ }
+
+-AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key,
+- const AVDictionaryEntry *prev, int flags)
++const AVDictionaryEntry *av_dict_iterate(const AVDictionary *m,
++ const AVDictionaryEntry *prev)
+ {
+- unsigned int i, j;
++ int i = 0;
+
+- if (!m || !key)
++ if (!m)
+ return NULL;
+
+ if (prev)
+ i = prev - m->elems + 1;
+- else
+- i = 0;
+
+- for (; i < m->count; i++) {
+- const char *s = m->elems[i].key;
++ av_assert2(i >= 0);
++ if (i >= m->count)
++ return NULL;
++
++ return &m->elems[i];
++}
++
++AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key,
++ const AVDictionaryEntry *prev, int flags)
++{
++ const AVDictionaryEntry *entry = prev;
++ unsigned int j;
++
++ if (!key)
++ return NULL;
++
++ while ((entry = av_dict_iterate(m, entry))) {
++ const char *s = entry->key;
+ if (flags & AV_DICT_MATCH_CASE)
+ for (j = 0; s[j] == key[j] && key[j]; j++)
+ ;
+ else
+ for (j = 0; av_toupper(s[j]) == av_toupper(key[j]) && key[j]; j++)
+ ;
+ if (key[j])
+ continue;
+ if (s[j] && !(flags & AV_DICT_IGNORE_SUFFIX))
+ continue;
+- return &m->elems[i];
++ return (AVDictionaryEntry *)entry;
+ }
+ return NULL;
+ }
+@@ -221,36 +236,36 @@ void av_dict_free(AVDictionary **pm)
+
+ int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
+ {
+- AVDictionaryEntry *t = NULL;
++ const AVDictionaryEntry *t = NULL;
+
+- while ((t = av_dict_get(src, "", t, AV_DICT_IGNORE_SUFFIX))) {
++ while ((t = av_dict_iterate(src, t))) {
+ int ret = av_dict_set(dst, t->key, t->value, flags);
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
+ }
+
+ int av_dict_get_string(const AVDictionary *m, char **buffer,
+ const char key_val_sep, const char pairs_sep)
+ {
+- AVDictionaryEntry *t = NULL;
++ const AVDictionaryEntry *t = NULL;
+ AVBPrint bprint;
+ int cnt = 0;
+ char special_chars[] = {pairs_sep, key_val_sep, '\0'};
+
+ if (!buffer || pairs_sep == '\0' || key_val_sep == '\0' || pairs_sep == key_val_sep ||
+ pairs_sep == '\\' || key_val_sep == '\\')
+ return AVERROR(EINVAL);
+
+ if (!av_dict_count(m)) {
+ *buffer = av_strdup("");
+ return *buffer ? 0 : AVERROR(ENOMEM);
+ }
+
+ av_bprint_init(&bprint, 64, AV_BPRINT_SIZE_UNLIMITED);
+- while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX))) {
++ while ((t = av_dict_iterate(m, t))) {
+ if (cnt++)
+ av_bprint_append_data(&bprint, &pairs_sep, 1);
+ av_bprint_escape(&bprint, t->key, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
+diff --git a/media/ffvpx/libavutil/dict.h b/media/ffvpx/libavutil/dict.h
+index 0d1afc6c64ab..713c9e361af8 100644
+--- a/media/ffvpx/libavutil/dict.h
++++ b/media/ffvpx/libavutil/dict.h
+@@ -39,154 +39,197 @@
+ * @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.
+- * Use av_dict_get() to retrieve an entry or iterate over all
+- * entries and finally av_dict_free() to free the dictionary
+- * and all its contents.
++ * 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_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {
+- <....> // iterate over all entries in d
++ 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_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. */
++ 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.
+ *
+- * To iterate through all the dictionary entries, you can set the matching key
+- * to the null string "" and set the AV_DICT_IGNORE_SUFFIX flag.
++ * @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
+ *
+- * @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
++ * @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.
++ * @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
++ * @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
++ * 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.
++ * 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
++ * @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
++ * @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 dictionary.
+- * AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL
++ * @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.
+- * @param dst pointer to a pointer to a AVDictionary struct. If *dst is NULL,
+- * this function will allocate a struct for you and put it in *dst
+- * @param src pointer to source AVDictionary struct
+- * @param flags flags to use when setting entries in *dst
+- * @note metadata is read using the AV_DICT_IGNORE_SUFFIX flag
++ *
++ * @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 ('\').
+ *
+- * @param[in] m dictionary
++ * @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
++ * @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_dict_get_string(const AVDictionary *m, char **buffer,
+ const char key_val_sep, const char pairs_sep);
+diff --git a/media/ffvpx/libavutil/ffversion.h b/media/ffvpx/libavutil/ffversion.h
+index 05d052c91f23..21f6614f7aa9 100644
+--- 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-107213-gfed07efcde"
++#define FFMPEG_VERSION "N-109117-g6a3e174ad1"
+ #endif /* AVUTIL_FFVERSION_H */
+diff --git a/media/ffvpx/libavutil/frame.c b/media/ffvpx/libavutil/frame.c
+index de4ad1f94d23..9545477acc95 100644
+--- a/media/ffvpx/libavutil/frame.c
++++ b/media/ffvpx/libavutil/frame.c
+@@ -35,23 +35,6 @@
+ av_get_channel_layout_nb_channels((frame)->channel_layout))
+ #endif
+
+-#if FF_API_COLORSPACE_NAME
+-const char *av_get_colorspace_name(enum AVColorSpace val)
+-{
+- static const char * const name[] = {
+- [AVCOL_SPC_RGB] = "GBR",
+- [AVCOL_SPC_BT709] = "bt709",
+- [AVCOL_SPC_FCC] = "fcc",
+- [AVCOL_SPC_BT470BG] = "bt470bg",
+- [AVCOL_SPC_SMPTE170M] = "smpte170m",
+- [AVCOL_SPC_SMPTE240M] = "smpte240m",
+- [AVCOL_SPC_YCOCG] = "YCgCo",
+- };
+- if ((unsigned)val >= FF_ARRAY_ELEMS(name))
+- return NULL;
+- return name[val];
+-}
+-#endif
+ static void get_frame_defaults(AVFrame *frame)
+ {
+ memset(frame, 0, sizeof(*frame));
+@@ -304,11 +287,19 @@ FF_DISABLE_DEPRECATION_WARNINGS
+ 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;
+@@ -831,6 +822,7 @@ const char *av_frame_side_data_name(enum AVFrameSideDataType type)
+ 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;
+ }
+diff --git a/media/ffvpx/libavutil/frame.h b/media/ffvpx/libavutil/frame.h
+index e60a82f6c0ef..25802695493a 100644
+--- a/media/ffvpx/libavutil/frame.h
++++ b/media/ffvpx/libavutil/frame.h
+@@ -209,6 +209,11 @@ enum AVFrameSideDataType {
+ * 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,
+ };
+
+ enum AVActiveFormatDescription {
+@@ -446,14 +451,18 @@ typedef struct AVFrame {
+ */
+ 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))
+@@ -486,15 +495,20 @@ typedef struct AVFrame {
+ */
+ int palette_has_changed;
+
++#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.
+@@ -715,15 +729,6 @@ typedef struct AVFrame {
+ } AVFrame;
+
+
+-#if FF_API_COLORSPACE_NAME
+-/**
+- * Get the name of a colorspace.
+- * @return a static string identifying the colorspace; can be NULL.
+- * @deprecated use av_color_space_name()
+- */
+-attribute_deprecated
+-const char *av_get_colorspace_name(enum AVColorSpace val);
+-#endif
+ /**
+ * Allocate an AVFrame and set its fields to default values. The resulting
+ * struct must be freed using av_frame_free().
+diff --git a/media/ffvpx/libavutil/hwcontext.c b/media/ffvpx/libavutil/hwcontext.c
+index ab9ad3703ec7..339659826931 100644
+--- a/media/ffvpx/libavutil/hwcontext.c
++++ b/media/ffvpx/libavutil/hwcontext.c
+@@ -397,10 +397,14 @@ int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ref,
+
+ static int transfer_data_alloc(AVFrame *dst, const AVFrame *src, int flags)
+ {
+- AVHWFramesContext *ctx = (AVHWFramesContext*)src->hw_frames_ctx->data;
++ AVHWFramesContext *ctx;
+ AVFrame *frame_tmp;
+ int ret = 0;
+
++ if (!src->hw_frames_ctx)
++ return AVERROR(EINVAL);
++ ctx = (AVHWFramesContext*)src->hw_frames_ctx->data;
++
+ frame_tmp = av_frame_alloc();
+ if (!frame_tmp)
+ return AVERROR(ENOMEM);
+diff --git a/media/ffvpx/libavutil/hwcontext_vaapi.c b/media/ffvpx/libavutil/hwcontext_vaapi.c
+index 997c0033fc7e..de30a919ab73 100644
+--- a/media/ffvpx/libavutil/hwcontext_vaapi.c
++++ b/media/ffvpx/libavutil/hwcontext_vaapi.c
+@@ -1321,8 +1321,17 @@ static int vaapi_map_to_drm_esh(AVHWFramesContext *hwfc, AVFrame *dst,
+ surface_id = (VASurfaceID)(uintptr_t)src->data[3];
+
+ export_flags = VA_EXPORT_SURFACE_SEPARATE_LAYERS;
+- if (flags & AV_HWFRAME_MAP_READ)
++ if (flags & AV_HWFRAME_MAP_READ) {
+ export_flags |= VA_EXPORT_SURFACE_READ_ONLY;
++
++ vas = vaSyncSurface(hwctx->display, surface_id);
++ if (vas != VA_STATUS_SUCCESS) {
++ av_log(hwfc, AV_LOG_ERROR, "Failed to sync surface "
++ "%#x: %d (%s).\n", surface_id, vas, vaErrorStr(vas));
++ return AVERROR(EIO);
++ }
++ }
++
+ if (flags & AV_HWFRAME_MAP_WRITE)
+ export_flags |= VA_EXPORT_SURFACE_WRITE_ONLY;
+
+@@ -1702,42 +1711,57 @@ static int vaapi_device_create(AVHWDeviceContext *ctx, const char *device,
+ char path[64];
+ int n, max_devices = 8;
+ #if CONFIG_LIBDRM
++ drmVersion *info;
+ const AVDictionaryEntry *kernel_driver;
+ kernel_driver = av_dict_get(opts, "kernel_driver", NULL, 0);
+ #endif
+ for (n = 0; n < max_devices; n++) {
+ snprintf(path, sizeof(path),
+ "/dev/dri/renderD%d", 128 + n);
+ priv->drm_fd = open(path, O_RDWR);
+ if (priv->drm_fd < 0) {
+ av_log(ctx, AV_LOG_VERBOSE, "Cannot open "
+ "DRM render node for device %d.\n", n);
+ break;
+ }
+ #if CONFIG_LIBDRM
++ info = drmGetVersion(priv->drm_fd);
++ if (!info) {
++ av_log(ctx, AV_LOG_VERBOSE,
++ "Failed to get DRM version for device %d.\n", n);
++ close(priv->drm_fd);
++ priv->drm_fd = -1;
++ continue;
++ }
+ if (kernel_driver) {
+- drmVersion *info;
+- info = drmGetVersion(priv->drm_fd);
+ if (strcmp(kernel_driver->value, info->name)) {
+ av_log(ctx, AV_LOG_VERBOSE, "Ignoring device %d "
+ "with non-matching kernel driver (%s).\n",
+ n, info->name);
+ drmFreeVersion(info);
+ close(priv->drm_fd);
+ priv->drm_fd = -1;
+ continue;
+ }
+ av_log(ctx, AV_LOG_VERBOSE, "Trying to use "
+ "DRM render node for device %d, "
+ "with matching kernel driver (%s).\n",
+ n, info->name);
+ drmFreeVersion(info);
+- } else
+-#endif
+- {
+- av_log(ctx, AV_LOG_VERBOSE, "Trying to use "
+- "DRM render node for device %d.\n", n);
++ break;
++ // drmGetVersion() ensures |info->name| is 0-terminated.
++ } else if (!strcmp(info->name, "vgem")) {
++ av_log(ctx, AV_LOG_VERBOSE,
++ "Skipping vgem node for device %d.\n", n);
++ drmFreeVersion(info);
++ close(priv->drm_fd);
++ priv->drm_fd = -1;
++ continue;
+ }
++ drmFreeVersion(info);
++#endif
++ av_log(ctx, AV_LOG_VERBOSE, "Trying to use "
++ "DRM render node for device %d.\n", n);
+ break;
+ }
+ if (n >= max_devices)
+diff --git a/media/ffvpx/libavutil/mem.c b/media/ffvpx/libavutil/mem.c
+index 18aff5291f0f..36b8940a0cf5 100644
+--- a/media/ffvpx/libavutil/mem.c
++++ b/media/ffvpx/libavutil/mem.c
+@@ -212,16 +212,6 @@ void *av_malloc_array(size_t nmemb, size_t size)
+ return av_malloc(result);
+ }
+
+-#if FF_API_AV_MALLOCZ_ARRAY
+-void *av_mallocz_array(size_t nmemb, size_t size)
+-{
+- size_t result;
+- if (size_mult(nmemb, size, &result) < 0)
+- return NULL;
+- return av_mallocz(result);
+-}
+-#endif
+-
+ void *av_realloc_array(void *ptr, size_t nmemb, size_t size)
+ {
+ size_t result;
+diff --git a/media/ffvpx/libavutil/mem.h b/media/ffvpx/libavutil/mem.h
+index c9c4fcf1ff02..62b4ca6e50e3 100644
+--- a/media/ffvpx/libavutil/mem.h
++++ b/media/ffvpx/libavutil/mem.h
+@@ -51,86 +51,6 @@
+ * @{
+ */
+
+-#if FF_API_DECLARE_ALIGNED
+-/**
+- *
+- * @defgroup lavu_mem_macros Alignment Macros
+- * Helper macros for declaring aligned variables.
+- * @{
+- */
+-
+-/**
+- * @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];
+- *
+- * // The default-alignment equivalent would be
+- * uint16_t aligned_int = 42;
+- * uint8_t aligned_array[128];
+- * @endcode
+- *
+- * @param n Minimum alignment in bytes
+- * @param t Type of the variable (or array element)
+- * @param v Name of the variable
+- */
+-
+-/**
+- * @def DECLARE_ASM_ALIGNED(n,t,v)
+- * Declare an aligned variable appropriate for use in inline assembly code.
+- *
+- * @code{.c}
+- * DECLARE_ASM_ALIGNED(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008);
+- * @endcode
+- *
+- * @param n Minimum alignment in bytes
+- * @param t Type of the variable (or array element)
+- * @param v Name of the variable
+- */
+-
+-/**
+- * @def DECLARE_ASM_CONST(n,t,v)
+- * Declare a static constant aligned variable appropriate for use in inline
+- * assembly code.
+- *
+- * @code{.c}
+- * DECLARE_ASM_CONST(16, uint64_t, pw_08) = UINT64_C(0x0008000800080008);
+- * @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_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_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_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_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_ASM_ALIGNED(n,t,v) t v
+- #define DECLARE_ASM_CONST(n,t,v) static const t v
+-#endif
+-
+-/**
+- * @}
+- */
+-#endif
+-
+ /**
+ * @defgroup lavu_mem_attrs Function Attributes
+ * Function attributes applicable to memory handling functions.
+@@ -239,14 +159,6 @@ av_alloc_size(1, 2) void *av_malloc_array(size_t nmemb, size_t size);
+ */
+ void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib av_alloc_size(1, 2);
+
+-#if FF_API_AV_MALLOCZ_ARRAY
+-/**
+- * @deprecated use av_calloc()
+- */
+-attribute_deprecated
+-void *av_mallocz_array(size_t nmemb, size_t size) av_malloc_attrib av_alloc_size(1, 2);
+-#endif
+-
+ /**
+ * Allocate, reallocate, or free a block of memory.
+ *
+diff --git a/media/ffvpx/libavutil/mem_internal.h b/media/ffvpx/libavutil/mem_internal.h
+index 955e31a69814..2448c606f193 100644
+--- a/media/ffvpx/libavutil/mem_internal.h
++++ b/media/ffvpx/libavutil/mem_internal.h
+@@ -30,7 +30,6 @@
+ #include "mem.h"
+ #include "version.h"
+
+-#if !FF_API_DECLARE_ALIGNED
+ /**
+ * @def DECLARE_ALIGNED(n,t,v)
+ * Declare a variable that is aligned in memory.
+@@ -97,7 +96,6 @@
+ #define DECLARE_ASM_ALIGNED(n,t,v) t v
+ #define DECLARE_ASM_CONST(n,t,v) static const t v
+ #endif
+-#endif
+
+ // Some broken preprocessors need a second expansion
+ // to be forced to tokenize __VA_ARGS__
+diff --git a/media/ffvpx/libavutil/opt.c b/media/ffvpx/libavutil/opt.c
+index a3940f47fbf7..0908751752ea 100644
+--- a/media/ffvpx/libavutil/opt.c
++++ b/media/ffvpx/libavutil/opt.c
+@@ -1742,17 +1742,17 @@ void av_opt_free(void *obj)
+
+ int av_opt_set_dict2(void *obj, AVDictionary **options, int search_flags)
+ {
+- AVDictionaryEntry *t = NULL;
++ const AVDictionaryEntry *t = NULL;
+ AVDictionary *tmp = NULL;
+ int ret;
+
+ if (!options)
+ return 0;
+
+- while ((t = av_dict_get(*options, "", t, AV_DICT_IGNORE_SUFFIX))) {
++ while ((t = av_dict_iterate(*options, t))) {
+ ret = av_opt_set(obj, t->key, t->value, search_flags);
+ if (ret == AVERROR_OPTION_NOT_FOUND)
+- ret = av_dict_set(&tmp, t->key, t->value, 0);
++ ret = av_dict_set(&tmp, t->key, t->value, AV_DICT_MULTIKEY);
+ if (ret < 0) {
+ av_log(obj, AV_LOG_ERROR, "Error setting option %s to value %s.\n", t->key, t->value);
+ av_dict_free(&tmp);
+@@ -2137,16 +2137,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
+ case AV_OPT_TYPE_DICT: {
+ AVDictionary *dict1 = NULL;
+ AVDictionary *dict2 = *(AVDictionary **)dst;
+- AVDictionaryEntry *en1 = NULL;
+- AVDictionaryEntry *en2 = NULL;
++ const AVDictionaryEntry *en1 = NULL;
++ const AVDictionaryEntry *en2 = NULL;
+ ret = av_dict_parse_string(&dict1, o->default_val.str, "=", ":", 0);
+ if (ret < 0) {
+ av_dict_free(&dict1);
+ return ret;
+ }
+ do {
+- en1 = av_dict_get(dict1, "", en1, AV_DICT_IGNORE_SUFFIX);
+- en2 = av_dict_get(dict2, "", en2, AV_DICT_IGNORE_SUFFIX);
++ en1 = av_dict_iterate(dict1, en1);
++ en2 = av_dict_iterate(dict2, en2);
+ } while (en1 && en2 && !strcmp(en1->key, en2->key) && !strcmp(en1->value, en2->value));
+ av_dict_free(&dict1);
+ return (!en1 && !en2);
+diff --git a/media/ffvpx/libavutil/pixdesc.c b/media/ffvpx/libavutil/pixdesc.c
+index ca3e204a0b8e..62a2ae08d907 100644
+--- a/media/ffvpx/libavutil/pixdesc.c
++++ b/media/ffvpx/libavutil/pixdesc.c
+@@ -46,19 +46,35 @@ void av_read_image_line2(void *dst,
+ uint32_t *dst32 = dst;
+
+ if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
+- int skip = x * step + comp.offset;
+- const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
+- int shift = 8 - depth - (skip & 7);
++ if (depth == 10) {
++ // Assume all channels are packed into a 32bit value
++ const uint8_t *byte_p = data[plane] + y * linesize[plane];
++ const uint32_t *p = (uint32_t *)byte_p;
+
+- while (w--) {
+- int val = (*p >> shift) & mask;
+- if (read_pal_component)
+- val = data[1][4*val + c];
+- shift -= step;
+- p -= shift >> 3;
+- shift &= 7;
+- if (dst_element_size == 4) *dst32++ = val;
+- else *dst16++ = val;
++ while (w--) {
++ int val = AV_RB32(p);
++ val = (val >> comp.offset) & mask;
++ if (read_pal_component)
++ val = data[1][4*val + c];
++ if (dst_element_size == 4) *dst32++ = val;
++ else *dst16++ = val;
++ p++;
++ }
++ } else {
++ int skip = x * step + comp.offset;
++ const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
++ int shift = 8 - depth - (skip & 7);
++
++ while (w--) {
++ int val = (*p >> shift) & mask;
++ if (read_pal_component)
++ val = data[1][4*val + c];
++ shift -= step;
++ p -= shift >> 3;
++ shift &= 7;
++ if (dst_element_size == 4) *dst32++ = val;
++ else *dst16++ = val;
++ }
+ }
+ } else {
+ const uint8_t *p = data[plane] + y * linesize[plane] +
+@@ -109,15 +125,29 @@ void av_write_image_line2(const void *src,
+ const uint16_t *src16 = src;
+
+ if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
+- int skip = x * step + comp.offset;
+- uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
+- int shift = 8 - depth - (skip & 7);
++ if (depth == 10) {
++ // Assume all channels are packed into a 32bit value
++ const uint8_t *byte_p = data[plane] + y * linesize[plane];
++ uint32_t *p = (uint32_t *)byte_p;
++ int offset = comp.offset;
++ uint32_t mask = ((1ULL << depth) - 1) << offset;
+
+- while (w--) {
+- *p |= (src_element_size == 4 ? *src32++ : *src16++) << shift;
+- shift -= step;
+- p -= shift >> 3;
+- shift &= 7;
++ while (w--) {
++ uint16_t val = src_element_size == 4 ? *src32++ : *src16++;
++ AV_WB32(p, (AV_RB32(p) & ~mask) | (val << offset));
++ p++;
++ }
++ } else {
++ int skip = x * step + comp.offset;
++ uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
++ int shift = 8 - depth - (skip & 7);
++
++ while (w--) {
++ *p |= (src_element_size == 4 ? *src32++ : *src16++) << shift;
++ shift -= step;
++ p -= shift >> 3;
++ shift &= 7;
++ }
+ }
+ } else {
+ int shift = comp.shift;
+diff --git a/media/ffvpx/libavutil/pixfmt.h b/media/ffvpx/libavutil/pixfmt.h
+index 224670a73185..37c2c79e0140 100644
+--- a/media/ffvpx/libavutil/pixfmt.h
++++ b/media/ffvpx/libavutil/pixfmt.h
+@@ -206,8 +206,36 @@ enum AVPixelFormat {
+ 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.
++ * 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,
+ /**
+diff --git a/media/ffvpx/libavutil/version.h b/media/ffvpx/libavutil/version.h
+index 2df788e529ab..900b7989718a 100644
+--- a/media/ffvpx/libavutil/version.h
++++ b/media/ffvpx/libavutil/version.h
+@@ -78,43 +78,41 @@
+ * @{
+ */
+
+-#define LIBAVUTIL_VERSION_MAJOR 57
+-#define LIBAVUTIL_VERSION_MINOR 40
++#define LIBAVUTIL_VERSION_MAJOR 58
++#define LIBAVUTIL_VERSION_MINOR 3
+ #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_D2STR (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_DECLARE_ALIGNED (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_COLORSPACE_NAME (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_AV_MALLOCZ_ARRAY (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_FIFO_PEEK2 (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_FIFO_OLD_API (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_XVMC (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_OLD_CHANNEL_LAYOUT (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_AV_FOPEN_UTF8 (LIBAVUTIL_VERSION_MAJOR < 58)
+-#define FF_API_PKT_DURATION (LIBAVUTIL_VERSION_MAJOR < 58)
++#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)
+
+ /**
+ * @}
+diff --git a/media/ffvpx/libavutil/video_enc_params.c b/media/ffvpx/libavutil/video_enc_params.c
+index 54bfed0ed979..33592dc12843 100644
+--- a/media/ffvpx/libavutil/video_enc_params.c
++++ b/media/ffvpx/libavutil/video_enc_params.c
+@@ -27,11 +27,11 @@
+ AVVideoEncParams *av_video_enc_params_alloc(enum AVVideoEncParamsType type,
+ unsigned int nb_blocks, size_t *out_size)
+ {
+- const size_t blocks_offset = offsetof(
+- struct {
+- AVVideoEncParams p;
+- AVVideoBlockParams b;
+- }, b);
++ struct TestStruct {
++ AVVideoEncParams p;
++ AVVideoBlockParams b;
++ };
++ const size_t blocks_offset = offsetof(struct TestStruct, b);
+ size_t size = blocks_offset;
+ AVVideoEncParams *par;
+
+diff --git a/media/ffvpx/libavutil/x86/float_dsp.asm b/media/ffvpx/libavutil/x86/float_dsp.asm
+index ff608f5f5a80..e84ba5256680 100644
+--- a/media/ffvpx/libavutil/x86/float_dsp.asm
++++ b/media/ffvpx/libavutil/x86/float_dsp.asm
+@@ -48,7 +48,7 @@ ALIGN 16
+
+ sub lenq, 64
+ jge .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse
+@@ -141,7 +141,7 @@ cglobal vector_fmac_scalar, 4,4,5, dst, src, mul, len
+ %endif ; mmsize
+ sub lenq, 64
+ jge .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse
+@@ -178,7 +178,7 @@ cglobal vector_fmul_scalar, 4,4,3, dst, src, mul, len
+ mova [dstq+lenq], m1
+ sub lenq, mmsize
+ jge .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse
+@@ -233,7 +233,7 @@ cglobal vector_dmac_scalar, 4,4,5, dst, src, mul, len
+ movaps [dstq+lenq+3*mmsize], m4
+ sub lenq, mmsize*4
+ jge .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse2
+@@ -280,7 +280,7 @@ cglobal vector_dmul_scalar, 4,4,3, dst, src, mul, len
+ movaps [dstq+lenq+mmsize], m2
+ sub lenq, 2*mmsize
+ jge .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse2
+@@ -323,7 +323,7 @@ cglobal vector_fmul_window, 5, 6, 6, dst, src0, src1, win, len, len1
+ sub len1q, mmsize
+ add lenq, mmsize
+ jl .loop
+- REP_RET
++ RET
+
+ ;-----------------------------------------------------------------------------
+ ; vector_fmul_add(float *dst, const float *src0, const float *src1,
+@@ -352,7 +352,7 @@ ALIGN 16
+
+ sub lenq, 2*mmsize
+ jge .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse
+@@ -401,7 +401,7 @@ ALIGN 16
+ add src1q, 2*mmsize
+ sub lenq, 2*mmsize
+ jge .loop
+- REP_RET
++ RET
+ %endmacro
+
+ INIT_XMM sse
+@@ -585,4 +585,4 @@ cglobal butterflies_float, 3,3,3, src0, src1, len
+ mova [src0q + lenq], m0
+ add lenq, mmsize
+ jl .loop
+- REP_RET
++ RET
+diff --git a/media/ffvpx/libavutil/x86/lls.asm b/media/ffvpx/libavutil/x86/lls.asm
+index d2526d1ff487..e8141e6c4ffa 100644
+--- a/media/ffvpx/libavutil/x86/lls.asm
++++ b/media/ffvpx/libavutil/x86/lls.asm
+@@ -123,7 +123,7 @@ cglobal update_lls, 2,5,8, ctx, var, i, j, covar2
+ test id, id
+ jle .loop2x1
+ .ret:
+- REP_RET
++ RET
+
+ %macro UPDATE_LLS 0
+ cglobal update_lls, 3,6,8, ctx, var, count, i, j, count2
+@@ -240,7 +240,7 @@ cglobal update_lls, 3,6,8, ctx, var, count, i, j, count2
+ cmp id, countd
+ jle .loop2x1
+ .ret:
+- REP_RET
++ RET
+ %endmacro ; UPDATE_LLS
+
+ %if HAVE_AVX_EXTERNAL
+diff --git a/tools/rewriting/ThirdPartyPaths.txt b/tools/rewriting/ThirdPartyPaths.txt
+index 92c88205e19b..ba2fbfb7ba90 100644
+--- a/tools/rewriting/ThirdPartyPaths.txt
++++ b/tools/rewriting/ThirdPartyPaths.txt
+@@ -31,6 +31,7 @@ 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/libav53/
+ dom/media/platforms/ffmpeg/libav54/
+ dom/media/platforms/ffmpeg/libav55/
diff --git a/firefox/0003-Bug-1820416-Use-correct-FFVPX-headers-from-ffmpeg-6.patch b/firefox/0003-Bug-1820416-Use-correct-FFVPX-headers-from-ffmpeg-6.patch
new file mode 100644
index 000000000..b0381041d
--- /dev/null
+++ b/firefox/0003-Bug-1820416-Use-correct-FFVPX-headers-from-ffmpeg-6.patch
@@ -0,0 +1,24 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: stransky <stransky(a)redhat.com>
+Date: Thu, 9 Mar 2023 13:16:19 +0000
+Subject: [PATCH] Bug 1820416 Use correct FFVPX headers from ffmpeg 6.0
+ r=padenot
+
+Differential Revision: https://phabricator.services.mozilla.com/D172116
+---
+ dom/media/platforms/ffmpeg/ffvpx/moz.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/dom/media/platforms/ffmpeg/ffvpx/moz.build b/dom/media/platforms/ffmpeg/ffvpx/moz.build
+index 188b866fc9de..cda0960787a5 100644
+--- a/dom/media/platforms/ffmpeg/ffvpx/moz.build
++++ b/dom/media/platforms/ffmpeg/ffvpx/moz.build
+@@ -20,7 +20,7 @@ SOURCES += [
+ ]
+ LOCAL_INCLUDES += [
+ "..",
+- "../ffmpeg59/include",
++ "../ffmpeg60/include",
+ "/media/mozva",
+ ]
+
diff --git a/firefox/Pkgfile b/firefox/Pkgfile
index 7e03be2c2..b9ea73f63 100644
--- a/firefox/Pkgfile
+++ b/firefox/Pkgfile
@@ -1,6 +1,6 @@
# Description: The Mozilla Firefox browser with Alsa support
# URL: https://www.mozilla.com/firefox/
-# Maintainer: unmaintained
+# Maintainer: Danny Rawlins, crux at romster dot me
# Depends on: aom autoconf-2.13 brotli cbindgen dav1d dbus-glib ffmpeg graphite2 libevent libnotify libvpx libwebp libxkbcommon lld nodejs nss pulseaudio unzip wasi-libc++ xorg-libxcomposite xorg-libxcursor xorg-libxinerama xorg-libxt zip
# Optional: sccache jack pipewire
@@ -9,7 +9,10 @@ version=110.0.1
release=1
source=(https://archive.mozilla.org/pub/firefox/releases/$version/source/$n…
firefox.desktop
- node-stdout-nonblocking-wrapper)
+ node-stdout-nonblocking-wrapper
+ 0001-libwebrtc-screen-cast-sync.patch
+ 0002-Bug-1819374-Squashed-ffmpeg-6.0-update.patch
+ 0003-Bug-1820416-Use-correct-FFVPX-headers-from-ffmpeg-6.patch)
_clear_vendor_checksums() {
sed -i 's/\("files":{\)[^}]*/\1/' third_party/rust/$1/.cargo-checksum.json
@@ -18,6 +21,10 @@ _clear_vendor_checksums() {
build() {
cd $name-$version
+ for p in $SRC/*.patch; do
+ patch -p1 -i $p
+ done
+
if [ "$(/usr/bin/python3 -c "import sys; print(sys.stdout.encoding)")" != 'utf-8' ]; then
printf "\e[031mError: set an UTF-8 locale to compile this!\033[0m\n"
exit 1
1
0
commit 936b2df8f9932bc33f8417d1d86d907315cbcc6f
Author: Juergen Daubert <jue(a)jue.li>
Date: Sat Mar 11 10:00:09 2023 +0100
imlib2: fix footprint
diff --git a/imlib2/.footprint b/imlib2/.footprint
index 833bc8586..c3816063a 100644
--- a/imlib2/.footprint
+++ b/imlib2/.footprint
@@ -44,10 +44,6 @@ drwxr-xr-x root/root usr/lib/imlib2/loaders/
-rwxr-xr-x root/root usr/lib/imlib2/loaders/png.so
-rwxr-xr-x root/root usr/lib/imlib2/loaders/pnm.la
-rwxr-xr-x root/root usr/lib/imlib2/loaders/pnm.so
--rwxr-xr-x root/root usr/lib/imlib2/loaders/ps.la
--rwxr-xr-x root/root usr/lib/imlib2/loaders/ps.so
--rwxr-xr-x root/root usr/lib/imlib2/loaders/svg.la
--rwxr-xr-x root/root usr/lib/imlib2/loaders/svg.so
-rwxr-xr-x root/root usr/lib/imlib2/loaders/tga.la
-rwxr-xr-x root/root usr/lib/imlib2/loaders/tga.so
-rwxr-xr-x root/root usr/lib/imlib2/loaders/tiff.la
diff --git a/imlib2/.signature b/imlib2/.signature
index af8be0006..098ebf82a 100644
--- a/imlib2/.signature
+++ b/imlib2/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/opt.pub
-RWSE3ohX2g5d/bMKY7M0d1qR9FXGLUSyUjlxiBM4mDD+gHVMU6r1eHYWsJrQJWn8uvw+1snhBFygmRMkki3hQP+lnXdaElGYoAs=
+RWSE3ohX2g5d/RjqGcju3uHRJ6lVrGLYzWyfJIroYSR4RCttB+N2lklNqB6IBTFSi20bFay8L+Gm1HJHr87rd3Y5JslfIGVnkw8=
SHA256 (Pkgfile) = 0864b52ab8cd64a27fa054389e82f9406ce874b7a239bec6b616a9474e2768c3
-SHA256 (.footprint) = 583bbc58f98eb602ad15531cca8e64a9fa9ac7ae96e18c8bcf41aa8b41d9f737
+SHA256 (.footprint) = 1f9faa990380dc9a8d1413595c941ef489e060f29143ce89d46cf76c5ffc354a
SHA256 (imlib2-1.11.0.tar.xz) = 6121196a05a82cc49d104d066ef1bd1e68b4b6394064d244985d0d6aa5fd8170
1
0
commit 1d9e99a87181ddb998a6dfa7dc6db8eadad5e3c7
Author: John McQuah <jmcquah(a)disroot.org>
Date: Fri Mar 10 22:29:27 2023 -0500
normalize: adopted
diff --git a/normalize/.signature b/normalize/.signature
index 369357eac..f06a5d1c2 100644
--- a/normalize/.signature
+++ b/normalize/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF38vRQFpuJWnG/7QDv+0qrPPm1SpkM29GOhIE++DiOYDzsy6VOaujXN4zi9bB4qvobv/rT1BE1D+14KYCJ3LgWgI=
-SHA256 (Pkgfile) = 9871c7fbad35da86f2f184990f38857d3264286ea5bcd6031b0e853656671198
+RWSagIOpLGJF39XRpsh8hw6CwgoKNhn5kh1LkxOSzAnxXCKlBUh5YvEjDesNSrT1MpZwuNi4tkX0LCDo0PGgcCo6xBVt6CLj9Q0=
+SHA256 (Pkgfile) = 5dd460a32b58a8357270815a18cd7af4cabe15ad2a015bd5a1028fdcf9df451e
SHA256 (.footprint) = fd0cc8ceebec06dae0899a8ad8b4829d5b3774e3ee1db6cd07339cf2dbc6a71d
SHA256 (normalize-0.7.7.tar.bz2) = ef9d8558515cc942518981d3db8fa2490fba6d6b5b74e0a3b75336fbc66c6bd8
diff --git a/normalize/Pkgfile b/normalize/Pkgfile
index 91d377432..3ba74de33 100644
--- a/normalize/Pkgfile
+++ b/normalize/Pkgfile
@@ -1,7 +1,7 @@
# Description: Normalize mp3 and wav files.
# URL: http://normalize.nongnu.org/
-# Maintainer: Danny Rawlins, crux at romster dot me
-# Depends on: lame libmad vorbisgain
+# Maintainer: John McQuah, jmcquah at disroot dot org
+# Depends on: lame libmad
name=normalize
version=0.7.7
@@ -9,12 +9,13 @@ release=2
source=(https://download.savannah.gnu.org/releases/$name/$name-$version.tar…
build() {
- cd normalize-$version
+ cd $name-$version
./configure \
--prefix=/usr \
--mandir=/usr/share/man \
- --disable-nls
+ --disable-nls \
+ --with-audiofile=no
make
make DESTDIR=$PKG install
1
0
11 Mar '23
commit 754ae7cefec9e1b50a2f4214c78b5eb03812c407
Author: John McQuah <jmcquah(a)disroot.org>
Date: Fri Mar 10 22:01:26 2023 -0500
fdk-aac: adopted; new build system cmake/ninja
diff --git a/fdk-aac/.footprint b/fdk-aac/.footprint
index 7d14af636..152739d94 100644
--- a/fdk-aac/.footprint
+++ b/fdk-aac/.footprint
@@ -8,9 +8,13 @@ drwxr-xr-x root/root usr/include/fdk-aac/
-rw-r--r-- root/root usr/include/fdk-aac/machine_type.h
-rw-r--r-- root/root usr/include/fdk-aac/syslib_channelMapDescr.h
drwxr-xr-x root/root usr/lib/
--rw-r--r-- root/root usr/lib/libfdk-aac.a
--rwxr-xr-x root/root usr/lib/libfdk-aac.la
-lrwxrwxrwx root/root usr/lib/libfdk-aac.so -> libfdk-aac.so.2.0.2
+drwxr-xr-x root/root usr/lib/cmake/
+drwxr-xr-x root/root usr/lib/cmake/fdk-aac/
+-rw-r--r-- root/root usr/lib/cmake/fdk-aac/fdk-aac-config-version.cmake
+-rw-r--r-- root/root usr/lib/cmake/fdk-aac/fdk-aac-config.cmake
+-rw-r--r-- root/root usr/lib/cmake/fdk-aac/fdk-aac-targets-release.cmake
+-rw-r--r-- root/root usr/lib/cmake/fdk-aac/fdk-aac-targets.cmake
+lrwxrwxrwx root/root usr/lib/libfdk-aac.so -> libfdk-aac.so.2
lrwxrwxrwx root/root usr/lib/libfdk-aac.so.2 -> libfdk-aac.so.2.0.2
-rwxr-xr-x root/root usr/lib/libfdk-aac.so.2.0.2
drwxr-xr-x root/root usr/lib/pkgconfig/
diff --git a/fdk-aac/.signature b/fdk-aac/.signature
index 51f7308af..ae4aadb74 100644
--- a/fdk-aac/.signature
+++ b/fdk-aac/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF35v557RxOT4DARyJCGxL3r/ges3lcC+jkhOhsV+Mb9bVtTumBa7LWabFPGTpyu2bs3fyV7VPystlyP4oxQoRjAg=
-SHA256 (Pkgfile) = 1df12504d319bd7d32637e19a2e3597899972065a7e065d181390c04f992bf25
-SHA256 (.footprint) = de4c0f8753ad2e91fa3667519ae0c91d9bfed872ae4d7975c31e9c686385e3f9
+RWSagIOpLGJF352o7SE4XpB29+MXOZlW+3aaYt2W9cFRbRnGsGmUUf4Jh7gDNff0MST9Re4/yw7fNMeHWtkHkjMsqUTB+ikanQY=
+SHA256 (Pkgfile) = d84eebfc0d31b1abe057e5075eeced728531ce7f666dd8c713054aa9a5acf02d
+SHA256 (.footprint) = 1059395308429c48ff28ca27f6a3ad41788b14aec1bcfdda1e997ec39695c672
SHA256 (fdk-aac-2.0.2.tar.gz) = c9e8630cf9d433f3cead74906a1520d2223f89bcd3fa9254861017440b8eb22f
diff --git a/fdk-aac/Pkgfile b/fdk-aac/Pkgfile
index fc3a1e4bb..accb99993 100644
--- a/fdk-aac/Pkgfile
+++ b/fdk-aac/Pkgfile
@@ -1,17 +1,21 @@
-# Description: Library of OpenCORE Framework implementation of Adaptive Multi Rate Narrowband and Wideband (AMR-NB and AMR-WB) speech codec.
+# Description: Fraunhofer Advanced Audio Coding, extracted from the Android Open Source Project
# URL: https://sourceforge.net/projects/opencore-amr/
-# Maintainer: Danny Rawlins, crux at romster dot me
+# Maintainer: John McQuah, jmcquah at disroot dot org
name=fdk-aac
version=2.0.2
-release=1
+release=2
source=(https://downloads.sourceforge.net/project/opencore-amr/$name/$name-…
build() {
- cd $name-$version
+ cmake -S $name-$version -B build -G Ninja \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_LIBDIR=lib \
+ -DCMAKE_C_FLAGS_RELEASE="$CFLAGS" \
+ -DCMAKE_CXX_FLAGS_RELEASE="$CXXFLAGS" \
+ -Wno-dev
- ./configure --prefix=/usr
-
- make
- make DESTDIR=$PKG install
+ ninja -C build -j ${JOBS:-1}
+ DESTDIR=$PKG ninja -C build install
}
1
0
commit 3a724539fbc30fb104e70360c0dbe610b4d37613
Author: John McQuah <jmcquah(a)disroot.org>
Date: Fri Mar 10 21:46:34 2023 -0500
libsamplerate,libplacebo: adopted
diff --git a/libplacebo/.signature b/libplacebo/.signature
index c30d9e1ae..afcc9c9ac 100644
--- a/libplacebo/.signature
+++ b/libplacebo/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF37oMGiyWYPn1kcWlQhHJ0i1EoRpqoESrNBQsOQ+BSU/xWVJZrxKMUTtYQHX6XhkeekenFPPPr2HfbpywmZ+Rgw0=
-SHA256 (Pkgfile) = 845a7e7cdb54f6d99ee87c67aab0a899959151c3a4984e03caa4ba8f4ba497dd
+RWSagIOpLGJF319vcy66ARvkfbfZms2zP31FFUey9eo58f9ayQjrhOo57MVt7qqm1SAGDWCGmA7OWcr+WPzeydkUQRyK1jbgdgI=
+SHA256 (Pkgfile) = fa820782a721cba90f8167ab84aa13d346e51e0b77ba45c7b249fa61d10a1f13
SHA256 (.footprint) = d96e8bca396f0e276af631d2a8c4e343bd071d7924491104aeb2f31a984fa63e
SHA256 (libplacebo-v5.229.2.tar.gz) = a42035c69e4a6373cb9856cc0c5736f24af4485006f3b29605ddffba377264db
diff --git a/libplacebo/Pkgfile b/libplacebo/Pkgfile
index 5193be51c..53468d1e5 100644
--- a/libplacebo/Pkgfile
+++ b/libplacebo/Pkgfile
@@ -1,6 +1,6 @@
# Description: Reusable library for GPU-accelerated video/image rendering primitives
# URL: https://github.com/haasn/libplacebo
-# Maintainer: Danny Rawlins, crux at romster dot me
+# Maintainer: John McQuah, jmcquah at disroot dot org
# Depends on: ffmpeg glad glfw3 lcms2 libepoxy shaderc vulkan-loader
name=libplacebo
diff --git a/libsamplerate/.signature b/libsamplerate/.signature
index d7825aae1..cf23ce93f 100644
--- a/libsamplerate/.signature
+++ b/libsamplerate/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF38JuV2IAacFX+v+/mqtVMUtp84b4DlqaybTLu2OKjoJAFFJ0NxLWTdgJlALpSXRMZbjKQiVQUIHILO8wGnNY6gs=
-SHA256 (Pkgfile) = 54803f1bc013c135bd195f70c37d0f413f44a066261fc1a9af6f3dfe4a064762
+RWSagIOpLGJF3wK/SnP3T0qnEmjuMlAJpwoYf+eBzyt7Sj4M7po0gpSDGLyW91N/PrIYsMMF092tXvm34SCIRXOhijXP+WZLtwI=
+SHA256 (Pkgfile) = a4a86ddbc9e08d396f065044fd864b579189cf57db7675846440c7b64486524d
SHA256 (.footprint) = 1f7df48e455ba4224278fae5d5ecbfe23878247913d6efd9b216cc3728026a31
SHA256 (libsamplerate-0.2.2.tar.xz) = 3258da280511d24b49d6b08615bbe824d0cacc9842b0e4caf11c52cf2b043893
diff --git a/libsamplerate/Pkgfile b/libsamplerate/Pkgfile
index 0abc8cee1..bd2169476 100644
--- a/libsamplerate/Pkgfile
+++ b/libsamplerate/Pkgfile
@@ -1,26 +1,25 @@
# Description: Sound sample rate conversion library.
# URL: https://libsndfile.github.io/libsamplerate/
-# Maintainer: Danny Rawlins, crux at romster dot me
-# Depends on: cmake libsndfile
-# Optional: fftw ninja
+# Maintainer: John McQuah, jmcquah at disroot dot org
+# Depends on: libsndfile
+# Optional: fftw
name=libsamplerate
version=0.2.2
release=1
-source=(https://github.com/libsndfile/libsamplerate/releases/download/$version/$name-$version.tar.xz)
+source=(https://github.com/libsndfile/$name/releases/download/$version/$name-$version.tar.xz)
build() {
- prt-get isinst ninja && PKGMK_LSR+=' -G Ninja'
-
- cmake -S $name-$version -B build $PKGMK_LSR \
+ cmake -S $name-$version -B build -G Ninja \
-D CMAKE_INSTALL_PREFIX=/usr \
-D CMAKE_INSTALL_LIBDIR=lib \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_C_FLAGS_RELEASE="$CFLAGS" \
-D BUILD_SHARED_LIBS=ON \
-Wno-dev
- cmake --build build
- DESTDIR=$PKG cmake --install build
+
+ ninja -C build -j ${JOBS:-1}
+ DESTDIR=$PKG ninja -C build install
rm -r $PKG/usr/share
}
1
0
commit 19fa6ef35fceb26f098e376e25762de7c9b4874f
Author: John McQuah <jmcquah(a)disroot.org>
Date: Fri Mar 10 21:33:45 2023 -0500
atkmm,libsigc++: adopted
diff --git a/atkmm/.footprint b/atkmm/.footprint
index 1e8a39baa..289989559 100644
--- a/atkmm/.footprint
+++ b/atkmm/.footprint
@@ -3,48 +3,48 @@ drwxr-xr-x root/root usr/include/
drwxr-xr-x root/root usr/include/atkmm-1.6/
-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm.h
drwxr-xr-x root/root usr/include/atkmm-1.6/atkmm/
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/action.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/component.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/document.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/editabletext.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/hyperlink.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/hypertext.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/image.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/implementor.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/action.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/component.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/document.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/editabletext.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/hyperlink.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/hypertext.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/image.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/implementor.h
-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/init.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/noopobject.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/object.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/objectaccessible.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/noopobject.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/object.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/objectaccessible.h
drwxr-xr-x root/root usr/include/atkmm-1.6/atkmm/private/
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/action_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/component_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/document_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/editabletext_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/hyperlink_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/hypertext_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/image_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/implementor_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/noopobject_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/object_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/objectaccessible_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/range_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/relation_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/relationset_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/selection_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/stateset_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/streamablecontent_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/table_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/text_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/private/value_p.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/range.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/relation.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/relationset.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/selection.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/stateset.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/streamablecontent.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/table.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/text.h
--rw-rw-r-- root/root usr/include/atkmm-1.6/atkmm/value.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/action_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/component_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/document_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/editabletext_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/hyperlink_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/hypertext_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/image_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/implementor_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/noopobject_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/object_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/objectaccessible_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/range_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/relation_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/relationset_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/selection_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/stateset_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/streamablecontent_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/table_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/text_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/private/value_p.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/range.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/relation.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/relationset.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/selection.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/stateset.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/streamablecontent.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/table.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/text.h
+-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/value.h
-rw-r--r-- root/root usr/include/atkmm-1.6/atkmm/wrap_init.h
drwxr-xr-x root/root usr/lib/
drwxr-xr-x root/root usr/lib/atkmm-1.6/
diff --git a/atkmm/.signature b/atkmm/.signature
index 05eb91d6b..cc57bc3ac 100644
--- a/atkmm/.signature
+++ b/atkmm/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF3/O5RZLhA7ov0ifWuho/9//XyukINcGPadzgmSJWkRflX/quTEHnA/KKR9WcN3xV+zxgOZfNCBxg87O/RwAQ7Qk=
-SHA256 (Pkgfile) = 40714bf9563db61ec7fbdb61b779b461ab7a8cb019ccbcd0083c4d45b5a20021
-SHA256 (.footprint) = 167030bd87f13e92284d5dff4f1fd96ef11ecaf68b9fb12c7feb61c536f40616
+RWSagIOpLGJF303R79djz6yykRZZvg1VIttzqQ8PHDaBmfiraKOvviL2klCjXfbb2DuzXG3YmHYvlkGahfv3O70A9ylhTLkCFwE=
+SHA256 (Pkgfile) = c616ffbad3001b396b3a85843f0012456ace6953e7b19c6408633e7294def09c
+SHA256 (.footprint) = f62eae375ec970c0bca6ab492c76b628975750c1d4b704fa2647eced0fcd8f3f
SHA256 (atkmm-2.28.3.tar.xz) = 7c2088b486a909be8da2b18304e56c5f90884d1343c8da7367ea5cd3258b9969
diff --git a/atkmm/Pkgfile b/atkmm/Pkgfile
index 2548c298c..ec91a4b12 100644
--- a/atkmm/Pkgfile
+++ b/atkmm/Pkgfile
@@ -1,6 +1,6 @@
# Description: C++ interface for atk
# URL: https://www.gtkmm.org/
-# Maintainer: Danny Rawlins, crux at romster dot me
+# Maintainer: John McQuah, jmcquah at disroot dot org
# Depends on: at-spi2-core glibmm
name=atkmm
@@ -15,7 +15,10 @@ build() {
--wrap-mode nodownload \
-D b_lto=true \
-D b_pie=true \
+ -D build-documentation=false
meson compile -C build -j ${JOBS-1}
DESTDIR=$PKG meson install -C build
+
+ find $PKG -type f -name '*.h' -exec chmod g-w '{}' +
}
diff --git a/libsigc++/.signature b/libsigc++/.signature
index 507d7fb56..4026633ea 100644
--- a/libsigc++/.signature
+++ b/libsigc++/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF34uchsT9SjshEJaiTTG1Qtj5Dk61CRZP71AkKVoq4ZGixK1IkSlowuDnRYd3u1A0ypn1GC7yZpDt2J+Il2pYOgY=
-SHA256 (Pkgfile) = 70ce0e3f01550d95e13f161c79c210dfaad51fc1f1204d062a8cf25f991c400e
+RWSagIOpLGJF3w2uR7cUG+VfZNuWJ3sA78v1JKvjqVVGmKTY8X06KsPkWEvV7elT/0ATQagNVKJGAuJv2Q8bmIq2IUfhTZqv5gs=
+SHA256 (Pkgfile) = b186e8424278658557eccefffbd683dbfa45596da64d3e8dfe201c9524bda90d
SHA256 (.footprint) = 09f30d18c898d0d3b1ed8f6b03fecaf175bc46877795082cf815e45e9e2e22b8
SHA256 (libsigc++-3.4.0.tar.xz) = 02e2630ffb5ce93cd52c38423521dfe7063328863a6e96d41d765a6116b8707e
diff --git a/libsigc++/Pkgfile b/libsigc++/Pkgfile
index 988706cda..2cffc186d 100644
--- a/libsigc++/Pkgfile
+++ b/libsigc++/Pkgfile
@@ -1,6 +1,6 @@
# Description: A callback framework for C++.
# URL: https://libsigcplusplus.github.io/libsigcplusplus/
-# Maintainer: Danny Rawlins, crux at romster dot me
+# Maintainer: John McQuah, jmcquah at disroot dot org
# Depends on: mm-common
name=libsigc++
@@ -11,7 +11,10 @@ source=(https://download.gnome.org/sources/libsigc++/${version%.*}/$name-$v…
build() {
meson setup $name-$version build \
--prefix=/usr \
- --buildtype=plain
+ --buildtype=plain \
+ -D build-documentation=false \
+ -D build-examples=false \
+ -D build-tests=false
meson compile -C build -j ${JOBS:-1}
DESTDIR=$PKG meson install -C build
1
0
11 Mar '23
commit 3cca836eb2a2b9920c3704a1ea6b34c5e0a530e0
Author: John McQuah <jmcquah(a)disroot.org>
Date: Fri Mar 10 21:02:58 2023 -0500
libcddb,libcdio,libcdio-paranoia: adopted
diff --git a/libcddb/.signature b/libcddb/.signature
index c2fc8e1cd..fbb323bef 100644
--- a/libcddb/.signature
+++ b/libcddb/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF3+i982NRXB0udxKm05rVVpsTPwDN1uKeQ3HREbPj4bsc+xVGs734PfCVUvO7pSJrdS/ntmdhf+4XL1yyx3xLTA0=
-SHA256 (Pkgfile) = 313f2f7db4043c33f1a8ebdd927f0d7df14f1d9dada0241f120164af9bd49e17
+RWSagIOpLGJF36WjmSNgzADbDzwTIBCfiLISX4UQh7JPasHTodUK14Ud5+eM6Q1jvyayYetQZQkJa4udMHKLAfVRK1i2DOlXVQE=
+SHA256 (Pkgfile) = e7d8ff49282ea35aed65d3b94a73c0c0d8c3ede29ad2525d5b2cf4ceaf5fbf6f
SHA256 (.footprint) = 165cd8bd9fbcfca11c66aaf56f023245e94355ba1c0d2f3e9778ae64daf1b9e2
SHA256 (libcddb-1.3.2.tar.bz2) = 35ce0ee1741ea38def304ddfe84a958901413aa829698357f0bee5bb8f0a223b
diff --git a/libcddb/Pkgfile b/libcddb/Pkgfile
index 0e04fca86..ce84d1c7f 100644
--- a/libcddb/Pkgfile
+++ b/libcddb/Pkgfile
@@ -1,7 +1,6 @@
# Description: Library to access and submit data on a CDDB server.
# URL: http://libcddb.sourceforge.net/
-# Maintainer: Danny Rawlins, crux at romster dot me
-# Packager: Han Boetes, han at mijncomputer dot nl
+# Maintainer: John McQuah, jmcquah at disroot dot org
name=libcddb
version=1.3.2
@@ -11,7 +10,8 @@ source=(http://download.sourceforge.net/$name/$name-$version.tar.bz2)
build() {
cd $name-$version
- ./configure --prefix=/usr
+ ./configure --prefix=/usr \
+ --without-cdio
make
make DESTDIR=$PKG install
diff --git a/libcdio-paranoia/.signature b/libcdio-paranoia/.signature
index d86997686..9d1638088 100644
--- a/libcdio-paranoia/.signature
+++ b/libcdio-paranoia/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF341mvLr3luSS/d/ZnC/yfM4KY2bj1AjINDCY0IETKeSR03moezPbCsAlhr+NacxKJnP3VXLGEmQsn0zYTwrF2QM=
-SHA256 (Pkgfile) = c1a6b5103f0d77ed92e28b36abdb100da44cb40db97dfa99c7b08109dab97f2d
+RWSagIOpLGJF39Att/dFp2YtzZQXcjGkNUPcDvyIZUnd8fmApeh+222OjldSUX7EomXz+eIer6oKSx1aLajgPeZPgzXrCshFOAg=
+SHA256 (Pkgfile) = 54fc40f18ad83d829a5f9b1211ca2ec4da630747238af6ca53bc9cdb162268dc
SHA256 (.footprint) = 2e882fff9f854e3675f7c777ac177c5bb703d4f5d1c26dce60f801d3ad7ac341
SHA256 (libcdio-paranoia-10.2+2.0.1.tar.gz) = 28d7d00e4a83d0221acda0fd2eb3e3240bf094db4c00a85998922201939fa952
diff --git a/libcdio-paranoia/Pkgfile b/libcdio-paranoia/Pkgfile
index 150be0eef..67d9db131 100644
--- a/libcdio-paranoia/Pkgfile
+++ b/libcdio-paranoia/Pkgfile
@@ -1,6 +1,6 @@
# Description: CD paranoia libraries from libcdio
-# URL: http://www.gnu.org/software/libcdio/
-# Maintainer: Danny Rawlins, crux at romster dot me
+# URL: https://github.com/rocky/libcdio-paranoia
+# Maintainer: John McQuah, jmcquah at disroot dot org
# Depends on: libcdio
name=libcdio-paranoia
@@ -13,10 +13,8 @@ build() {
./configure \
--prefix=/usr \
- --enable-cpp-progs \
--disable-example-progs
-
make
make DESTDIR=$PKG install
diff --git a/libcdio/.signature b/libcdio/.signature
index b42a3b900..39c489c1a 100644
--- a/libcdio/.signature
+++ b/libcdio/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF30CYSzy8rDTKFPZjahFcHnVaJFGf25r5rA8YTtz6z6TbsKJJsyTtK3HSOV8qpIcjvpLJprls8BQ0Ltc1V/FeYAk=
-SHA256 (Pkgfile) = bcd27fc61217393ff4a13e21ec0ead717300c5542484d615768e5edc900ec1b6
+RWSagIOpLGJF34jH9e5qFNGkTPnA+37jmSImgUKbFO7eAUI1pX++QQmW6oZTJTf3ycrYeS1pVgH0E1FeIl0O+F0BfcppzVE+/gs=
+SHA256 (Pkgfile) = d04ff2f5ef0afc917ebea85461e887e054751eb343024bf0766a845ed0ec4f72
SHA256 (.footprint) = 462509477e2b2c50ea440cda54fd6520ca35cfe436c9fe15b76daa90e03d0f75
SHA256 (libcdio-2.1.0.tar.bz2) = 8550e9589dbd594bfac93b81ecf129b1dc9d0d51e90f9696f1b2f9b2af32712b
diff --git a/libcdio/Pkgfile b/libcdio/Pkgfile
index 408eae3d6..e0761e33f 100644
--- a/libcdio/Pkgfile
+++ b/libcdio/Pkgfile
@@ -1,6 +1,6 @@
# Description: A library for CD-ROM and CD image access.
# URL: http://www.gnu.org/software/libcdio/
-# Maintainer: Danny Rawlins, crux at romster dot me
+# Maintainer: John McQuah, jmcquah at disroot dot org
# Depends on: libcddb ncurses
name=libcdio
1
0
11 Mar '23
commit d0e6c0ce871078f01d901a4d4a2c797bc7848e54
Author: John McQuah <jmcquah(a)disroot.org>
Date: Fri Mar 10 20:39:07 2023 -0500
libdvdcss,libdvdread,libdvdnav: adopted
diff --git a/libdvdcss/.signature b/libdvdcss/.signature
index eb32bb9fb..e00447a81 100644
--- a/libdvdcss/.signature
+++ b/libdvdcss/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF3+78D4Ly7SjpV23+qSpiCcfP4IhkU4GN18zSO7AQrrK8nvwvQjBWuuB8jU1h8tr1IqPs2PnP4Gkc9rWTJqgR1w0=
-SHA256 (Pkgfile) = 9accb9b989ca96483541acf29f8098a7f68096fd685699e9b67149f0dfcefe35
+RWSagIOpLGJF3+ZgteWYxW9JbMd4XHITTy1M20exykOCgHDlzPhMDAcCf5aOUWnrq8cUP2yGHCsDYCdNbXLETl7vOgXvry56TwE=
+SHA256 (Pkgfile) = 086c6a6fad62245d26adcf88fdd4f21cdb5f253fffaf32d773b27ec6c202e0e4
SHA256 (.footprint) = e81f1bc1c02d57e0ec5428abaaa2c4952d8ecc4a2264e5086309b1fcf8625d90
SHA256 (libdvdcss-1.4.3.tar.bz2) = 233cc92f5dc01c5d3a96f5b3582be7d5cee5a35a52d3a08158745d3d86070079
diff --git a/libdvdcss/Pkgfile b/libdvdcss/Pkgfile
index 606a8dc66..f7e5a285c 100644
--- a/libdvdcss/Pkgfile
+++ b/libdvdcss/Pkgfile
@@ -1,6 +1,6 @@
# Description: A library which provides functions for reading DVD video disks.
# URL: http://www.videolan.org/developers/libdvdcss.html
-# Maintainer: Danny Rawlins, crux at romster dot me
+# Maintainer: John McQuah, jmcquah at disroot dot org
name=libdvdcss
version=1.4.3
@@ -15,6 +15,5 @@ build() {
make
make DESTDIR=$PKG install
- rm -rf $PKG/usr/share/doc
- rmdir $PKG/usr/share
+ rm -rf $PKG/usr/share
}
diff --git a/libdvdnav/.footprint b/libdvdnav/.footprint
index 0c53308e7..876632ca7 100644
--- a/libdvdnav/.footprint
+++ b/libdvdnav/.footprint
@@ -13,4 +13,3 @@ lrwxrwxrwx root/root usr/lib/libdvdnav.so.4 -> libdvdnav.so.4.3.0
-rwxr-xr-x root/root usr/lib/libdvdnav.so.4.3.0
drwxr-xr-x root/root usr/lib/pkgconfig/
-rw-r--r-- root/root usr/lib/pkgconfig/dvdnav.pc
-drwxr-xr-x root/root usr/share/
diff --git a/libdvdnav/.signature b/libdvdnav/.signature
index 2e4bd787d..9320fb2d4 100644
--- a/libdvdnav/.signature
+++ b/libdvdnav/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF3zWoKE/0QnX1Gd2NumsK+11P/XxeBDXXuWXOMaY07gP3VZCGVv/Iefg4kE8nJ8SJn10nGCNvOYx0vfGuRNxIzgM=
-SHA256 (Pkgfile) = 25846ad90bbee356c565bfb87d7789a25693aee862679b442fc8f84015785149
-SHA256 (.footprint) = 8444a9ecce066e6d9c8000bded64a1774fa1b8eef7e471551cc9a286f8b5bb04
+RWSagIOpLGJF3+oFJO5NOzSJw1peWItVeWWs9sRvnzP+K0sW318PCF5jMqAGe+AVIZJ2zGH0neakhbxrMV+8h06sQ04LJg1P3QA=
+SHA256 (Pkgfile) = e78813ec5c46a6a77c537015e1af6e853fada7eaf481e6707533389aa2b8ab50
+SHA256 (.footprint) = 229680b404161f3ba47187a705043c3eb1335f8ddcf66ba18fa2db7dc3ef2b05
SHA256 (libdvdnav-6.1.1.tar.bz2) = c191a7475947d323ff7680cf92c0fb1be8237701885f37656c64d04e98d18d48
diff --git a/libdvdnav/Pkgfile b/libdvdnav/Pkgfile
index 31bdb2f8d..1f540c9d7 100755
--- a/libdvdnav/Pkgfile
+++ b/libdvdnav/Pkgfile
@@ -1,6 +1,6 @@
# Description: DVD Navigation library.
# URL: https://www.videolan.org/developers/libdvdnav.html
-# Maintainer: Danny Rawlins, crux at romster dot me
+# Maintainer: John McQuah, jmcquah at disroot dot org
# Depends on: libdvdread
name=libdvdnav
@@ -18,5 +18,5 @@ build() {
make
make DESTDIR=$PKG install
- rm -r $PKG/usr/share/doc
+ rm -rf $PKG/usr/share
}
diff --git a/libdvdread/.footprint b/libdvdread/.footprint
index 5acf5932e..d51f1244d 100644
--- a/libdvdread/.footprint
+++ b/libdvdread/.footprint
@@ -19,4 +19,3 @@ lrwxrwxrwx root/root usr/lib/libdvdread.so.8 -> libdvdread.so.8.0.0
-rwxr-xr-x root/root usr/lib/libdvdread.so.8.0.0
drwxr-xr-x root/root usr/lib/pkgconfig/
-rw-r--r-- root/root usr/lib/pkgconfig/dvdread.pc
-drwxr-xr-x root/root usr/share/
diff --git a/libdvdread/.signature b/libdvdread/.signature
index a4bddf4c3..e7681b18f 100644
--- a/libdvdread/.signature
+++ b/libdvdread/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF3yvcpGJz+qSRGWsOkpSrL0PC2l2NIrb/sxdgJpEgdDkMyFFZITbeHSaz5WD1Fbt6QFPBc4KAvt3zkdHd3oDQBgE=
-SHA256 (Pkgfile) = ca5ec79035e790caa94578a0094d0f197e828d916259341556c40f2afa6954ea
-SHA256 (.footprint) = fcd07c66e1becd75878dd676881d099871163632cd1e64232666f0a8d6ff465d
+RWSagIOpLGJF3xUeMf35H7SV6OzAYqVRAh+zUoE57WSgfJ65YnGakzhGWwrPPKIyM0HG7If3Cj548+N/DPtU5RxJm0oHDmJAxgI=
+SHA256 (Pkgfile) = f97ebeb03234bb54468ad24ca98fae3abe72a6c20624925757cc5780b46b0c19
+SHA256 (.footprint) = db0b42daffa8012dc301de9edda977288ae03bc69266891aa259b5efb9dbd7e0
SHA256 (libdvdread-6.1.3.tar.bz2) = ce35454997a208cbe50e91232f0e73fb1ac3471965813a13b8730a8f18a15369
diff --git a/libdvdread/Pkgfile b/libdvdread/Pkgfile
index 66158dd6e..0729c6d3f 100644
--- a/libdvdread/Pkgfile
+++ b/libdvdread/Pkgfile
@@ -1,6 +1,6 @@
# Description: DVD reading library.
# URL: https://www.videolan.org/developers/libdvdnav.html
-# Maintainer: Danny Rawlins, crux at romster dot me
+# Maintainer: John McQuah, jmcquah at disroot dot org
# Depends on: libdvdcss
name=libdvdread
@@ -20,5 +20,5 @@ build() {
make
make DESTDIR=$PKG install
- rm -r $PKG/usr/share/doc
+ rm -rf $PKG/usr/share
}
1
0
ports/contrib (3.7): scrot: marked unmaintained; fixed stale dependency (s/giblib/imlib2/)
by crux@crux.nu 11 Mar '23
by crux@crux.nu 11 Mar '23
11 Mar '23
commit 33eda908e144fe4b74704db9d9765f7bbcf9673b
Author: John McQuah <jmcquah(a)disroot.org>
Date: Fri Mar 10 20:29:14 2023 -0500
scrot: marked unmaintained; fixed stale dependency (s/giblib/imlib2/)
diff --git a/giblib/.signature b/giblib/.signature
index 3cf9928ea..28384b831 100644
--- a/giblib/.signature
+++ b/giblib/.signature
@@ -1,6 +1,6 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF31dRlMT8HcnkQJEwr+o02US/OV6+e3vwaoZLhfsltEeGhsQJF/9u3WeUsDnDb5YuH6pbIwzvKhVgmPt/OCKJhww=
-SHA256 (Pkgfile) = 8451c08d72aec66e37f5ba888af7a6b073b4f05961152c18f9bce5f62755b322
+RWSagIOpLGJF39SA0afvH3lTH5zgmH5u5y6EetVXeJKbfwpH5B4nl2p6xMRLulPxe1oNoS+CZ7wLGSC1CPaO0gKDPPHDOviv8w8=
+SHA256 (Pkgfile) = 5999d1d5b9cb223940f71cda8193396d88dbf1e03d36bbfa3d97ca87250baae3
SHA256 (.footprint) = 87ecce07dda670bc2eba6df0d26e8b2397afd1fe628886f5b5cc5501c8adbcfa
SHA256 (giblib-1.2.4.tar.gz) = 176611c4d88d742ea4013991ad54c2f9d2feefbc97a28434c0f48922ebaa8bac
SHA256 (fix-configure_ac-imlib2.patch) = 982df1853b6c47bfdb73b27293e629a06e8b3b431084f20725d700eb8edbaf3c
diff --git a/giblib/Pkgfile b/giblib/Pkgfile
index bb99cb1c4..9a15857bb 100644
--- a/giblib/Pkgfile
+++ b/giblib/Pkgfile
@@ -1,6 +1,6 @@
# Description: Library for doubly linked lists and a wrapper for imlib2.
# URL: http://freshmeat.net/projects/giblib/
-# Maintainer: Danny Rawlins, crux at romster dot me
+# Maintainer: unmaintained
# Depends on: imlib2
name=giblib
diff --git a/scrot/.signature b/scrot/.signature
index 730af49aa..4cf7b188b 100644
--- a/scrot/.signature
+++ b/scrot/.signature
@@ -1,5 +1,5 @@
untrusted comment: verify with /etc/ports/contrib.pub
-RWSagIOpLGJF355NovjLfm4btan72F4EW/JX96FEMkUWfkP6K35lRtQtjQfXjjnxZOQaNUIpXbDKtDldm4QbgFpxvzTXwVg+Xww=
-SHA256 (Pkgfile) = 6746d510eb8e455a934fff0a35072705c3b52290f3fbbe6de435563466187033
+RWSagIOpLGJF38oAoPIfla4IltoaFtK+NMywTIFtgA5pmNh2cr4pJzS50OaIcy9YQuG1JmypRHzjW8zXyrDaO1MX5Xx7HRJUAQ0=
+SHA256 (Pkgfile) = 4e6feafaf6fc08410c0fc05b8412025bb8afcc2ca9824d89de49b1b62220ecbd
SHA256 (.footprint) = 4043d00c86d02ab444547ccb9633bddfbe2bbad286f7676a24822fcda3cd5c0e
SHA256 (scrot-1.8.1.tar.gz) = dabc59ee1aa8478eb8d77d715d3e9321f07fbbc551091dcb57d10c142034e271
diff --git a/scrot/Pkgfile b/scrot/Pkgfile
index aab4fddc7..c07e7a9d7 100644
--- a/scrot/Pkgfile
+++ b/scrot/Pkgfile
@@ -1,7 +1,7 @@
# Description: Commandline screen capture.
# URL: https://github.com/resurrecting-open-source-projects/scrot
-# Maintainer: Danny Rawlins, crux at romster dot me
-# Depends on: autoconf-archive giblib libbsd xorg-libxcomposite xorg-libxcursor xorg-libxinerama
+# Maintainer: unmaintained
+# Depends on: autoconf-archive imlib2 libbsd xorg-libxcomposite xorg-libxcursor xorg-libxinerama
name=scrot
version=1.8.1
1
0