public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/musescore] rawhide: Backport upstream PR to add FFmpeg 9 support
@ 2026-09-08 17:43 Dominik 'Rathann' Mierzejewski
  0 siblings, 0 replies; only message in thread
From: Dominik 'Rathann' Mierzejewski @ 2026-09-08 17:43 UTC (permalink / raw)
  To: git-commits

            A new commit has been pushed.

            Repo   : rpms/musescore
            Branch : rawhide
            Commit : f100664cfe2931da4b9cbc091b415887d5b7713d
            Author : Dominik 'Rathann' Mierzejewski <dominik@greysector.net>
            Date   : 2026-09-07T12:43:46+02:00
            Stats  : +23624/-12 in 2 file(s)
            URL    : https://src.fedoraproject.org/rpms/musescore/c/f100664cfe2931da4b9cbc091b415887d5b7713d?branch=rawhide

            Log:
            Backport upstream PR to add FFmpeg 9 support

- Drop unnecessary BuildRequires on FFmpeg (uses bundled headers)

---
diff --git a/musescore-ffmpeg9.patch b/musescore-ffmpeg9.patch
new file mode 100644
index 0000000..e41b0f7
--- /dev/null
+++ b/musescore-ffmpeg9.patch
@@ -0,0 +1,23606 @@
+diff -up MuseScore-4.7.4/src/framework/media/CMakeLists.txt.ffmpeg9 MuseScore-4.7.4/src/framework/media/CMakeLists.txt
+--- MuseScore-4.7.4/src/framework/media/CMakeLists.txt.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/CMakeLists.txt	2026-09-07 12:23:47.680085953 +0200
+@@ -37,6 +37,11 @@ target_sources(muse_media PRIVATE
+     internal/ffmpegutils.cpp
+     internal/ffmpegutils.h
+ 
++    internal/ffmpeg/v9/ffmpeglibhandler.cpp
++    internal/ffmpeg/v9/ffmpeglibhandler.h
++    internal/ffmpeg/v9/videoencoder.cpp
++    internal/ffmpeg/v9/videoencoder.h
++
+     internal/ffmpeg/v8/ffmpeglibhandler.cpp
+     internal/ffmpeg/v8/ffmpeglibhandler.h
+     internal/ffmpeg/v8/videoencoder.cpp
+@@ -64,6 +69,12 @@ target_sources(muse_media PRIVATE
+ )
+ 
+ set_source_files_properties(
++    internal/ffmpeg/v9/ffmpeglibhandler.cpp
++    internal/ffmpeg/v9/videoencoder.cpp
++    PROPERTIES INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/ffmpeg/v9"
++)
++
++set_source_files_properties(
+     internal/ffmpeg/v8/ffmpeglibhandler.cpp
+     internal/ffmpeg/v8/videoencoder.cpp
+     PROPERTIES INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/ffmpeg/v8"
+@@ -92,3 +103,7 @@ set_source_files_properties(
+     internal/ffmpeg/v4/videoencoder.cpp
+     PROPERTIES INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/ffmpeg/v4"
+ )
++
++if (MUSE_MODULE_MEDIA_TESTS)
++    add_subdirectory(tests)
++endif()
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpegutils.cpp.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpegutils.cpp
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpegutils.cpp.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpegutils.cpp	2026-09-07 12:23:47.681212628 +0200
+@@ -22,6 +22,8 @@
+ 
+ #include "ffmpegutils.h"
+ 
++#include <algorithm>
++
+ #include "io/fileinfo.h"
+ #include "io/path.h"
+ 
+@@ -71,7 +73,7 @@ io::paths_t defaultSearchPaths()
+     return paths;
+ }
+ 
+-static FFmpegLibPaths libraryPathsForVersion(int ffmpegVer, const io::path_t& searchDir)
++static FFmpegLibPaths libraryPathsForVersion(int ffmpegVer, const io::path_t& searchDir, FFmpegCandidateOrigin origin)
+ {
+     FFmpegVersionInfo ffmpegVersionInfo;
+     for (const auto& [ffmpegVersion, componentsVersions] : FFMPEG_COMPONENTS_VERSIONS) {
+@@ -115,6 +117,9 @@ static FFmpegLibPaths libraryPathsForVer
+     if (io::FileInfo::exists(avutilPath) && io::FileInfo::exists(avcodecPath)
+         && io::FileInfo::exists(avformatPath) && io::FileInfo::exists(swscalePath)
+         && io::FileInfo::exists(swresamplePath)) {
++        result.ffmpegVersion = ffmpegVer;
++        result.origin = origin;
++        result.searchDir = searchDir;
+         result.avUtilPath = avutilPath;
+         result.avCodecPath = avcodecPath;
+         result.avFormatPath = avformatPath;
+@@ -171,29 +176,114 @@ FFmpegVersion versionFromAVFormatPath(co
+     return FFMPEG_INVALID_VERSION;
+ }
+ 
+-FFmpegLibPaths findLibraryPaths(const io::path_t& configPath)
++static io::path_t normalizedSearchPath(const io::path_t& path)
+ {
+-    FFmpegLibPaths result;
++    const io::FileInfo fileInfo(path);
++    const String canonicalPath = fileInfo.canonicalFilePath();
++    return canonicalPath.empty() ? io::path_t(fileInfo.absoluteFilePath()) : io::path_t(canonicalPath);
++}
+ 
+-    io::paths_t searchPaths;
+-    if (!configPath.empty() && io::FileInfo::exists(configPath)) {
+-        searchPaths.push_back(io::FileInfo(configPath).entryType() == io::EntryType::Dir
+-                              ? configPath : io::dirpath(configPath));
++static String searchPathKey(const io::path_t& path)
++{
++#if defined(Q_OS_WIN)
++    return path.toString().toLower();
++#else
++    return path.toString();
++#endif
++}
++
++static bool containsSearchPath(const io::paths_t& paths, const io::path_t& path)
++{
++    const String pathKey = searchPathKey(path);
++    return std::find_if(paths.cbegin(), paths.cend(), [&pathKey](const io::path_t& candidate) {
++        return searchPathKey(candidate) == pathKey;
++    }) != paths.cend();
++}
++
++static io::paths_t normalizedSearchPaths(const io::paths_t& paths)
++{
++    io::paths_t result;
++    result.reserve(paths.size());
++
++    for (const io::path_t& path : paths) {
++        const io::path_t normalizedPath = normalizedSearchPath(path);
++        if (normalizedPath.empty() || containsSearchPath(result, normalizedPath)) {
++            continue;
++        }
++
++        result.push_back(normalizedPath);
+     }
+ 
+-    for (const io::path_t& p : defaultSearchPaths()) {
+-        searchPaths.push_back(p);
++    std::sort(result.begin(), result.end(), [](const io::path_t& first, const io::path_t& second) {
++        return searchPathKey(first) < searchPathKey(second);
++    });
++    return result;
++}
++
++static void appendLibraryPathsForAllVersions(FFmpegLibPathsList& result, const io::path_t& searchPath,
++                                             FFmpegCandidateOrigin origin)
++{
++    for (const auto& [ffmpegVersion, _] : FFMPEG_COMPONENTS_VERSIONS) {
++        FFmpegLibPaths paths = libraryPathsForVersion(ffmpegVersion, searchPath, origin);
++        if (!paths.avFormatPath.empty()) {
++            result.push_back(std::move(paths));
++        }
+     }
++}
+ 
+-    for (const io::path_t& path : searchPaths) {
+-        for (const auto& [ffmpegVer, _] : FFMPEG_COMPONENTS_VERSIONS) {
+-            result = libraryPathsForVersion(ffmpegVer, path);
+-            if (!result.avFormatPath.empty()) {
+-                return result;
+-            }
++FFmpegLibPathsList findLibraryPaths(const io::path_t& configPath)
++{
++    return findLibraryPaths(configPath, defaultSearchPaths());
++}
++
++FFmpegLibPathsList findLibraryPaths(const io::path_t& configPath, const io::paths_t& defaultPaths)
++{
++    FFmpegLibPathsList result;
++    const io::paths_t automaticSearchPaths = normalizedSearchPaths(defaultPaths);
++
++    if (!configPath.empty() && io::FileInfo::exists(configPath)) {
++        const io::path_t configuredSearchPath = normalizedSearchPath(
++            io::FileInfo(configPath).entryType() == io::EntryType::Dir ? configPath : io::dirpath(configPath));
++
++        if (!containsSearchPath(automaticSearchPaths, configuredSearchPath)) {
++            appendLibraryPathsForAllVersions(result, configuredSearchPath, FFmpegCandidateOrigin::Configured);
+         }
+     }
+ 
++    FFmpegLibPathsList automaticCandidates;
++    for (const io::path_t& path : automaticSearchPaths) {
++        appendLibraryPathsForAllVersions(automaticCandidates, path, FFmpegCandidateOrigin::Automatic);
++    }
++
++    std::sort(automaticCandidates.begin(), automaticCandidates.end(), [](const FFmpegLibPaths& first, const FFmpegLibPaths& second) {
++        if (first.ffmpegVersion != second.ffmpegVersion) {
++            return first.ffmpegVersion > second.ffmpegVersion;
++        }
++        return searchPathKey(first.searchDir) < searchPathKey(second.searchDir);
++    });
++
++    result.insert(result.end(), automaticCandidates.cbegin(), automaticCandidates.cend());
++
+     return result;
+ }
++
++std::optional<io::path_t> configuredPathToPersist(const io::path_t& requestedPath, const FFmpegLibPaths& loadedCandidate)
++{
++    if (requestedPath.empty()) {
++        return io::path_t();
++    }
++
++    const io::FileInfo requestedFileInfo(requestedPath);
++    if (!requestedFileInfo.exists()) {
++        return std::nullopt;
++    }
++
++    const io::path_t requestedSearchPath = normalizedSearchPath(
++        requestedFileInfo.entryType() == io::EntryType::Dir ? requestedPath : io::dirpath(requestedPath));
++    if (searchPathKey(requestedSearchPath) != searchPathKey(loadedCandidate.searchDir)) {
++        return std::nullopt;
++    }
++
++    return requestedSearchPath;
++}
+ }
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpegutils.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpegutils.h
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpegutils.h.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpegutils.h	2026-09-07 12:23:47.681279951 +0200
+@@ -22,6 +22,7 @@
+ 
+ #pragma once
+ 
++#include <optional>
+ #include <vector>
+ 
+ #include "io/path.h"
+@@ -29,6 +30,7 @@
+ #include "../mediatypes.h"
+ 
+ namespace muse::media {
++static const FFmpegVersion FFMPEG_V9 = 9;
+ static const FFmpegVersion FFMPEG_V8 = 8;
+ static const FFmpegVersion FFMPEG_V7 = 7;
+ static const FFmpegVersion FFMPEG_V6 = 6;
+@@ -50,6 +52,7 @@ struct FFmpegVersionInfo {
+ 
+ static const std::vector<std::pair<int, FFmpegVersionInfo> > FFMPEG_COMPONENTS_VERSIONS = {
+     // ffmpeg           avFormat    avUtil      avCodec     swScale    swResample
++    { FFMPEG_V9,        { 63,       61,         63,         10,        7 } },
+     { FFMPEG_V8,        { 62,       60,         62,         9,         6 } },
+     { FFMPEG_V7,        { 61,       59,         61,         8,         5 } },
+     { FFMPEG_V6,        { 60,       58,         60,         7,         4 } },
+@@ -57,7 +60,15 @@ static const std::vector<std::pair<int,
+     { FFMPEG_V4,        { 58,       56,         58,         5,         3 } },
+ };
+ 
++enum class FFmpegCandidateOrigin {
++    Automatic,
++    Configured
++};
++
+ struct FFmpegLibPaths {
++    FFmpegVersion ffmpegVersion = FFMPEG_INVALID_VERSION;
++    FFmpegCandidateOrigin origin = FFmpegCandidateOrigin::Automatic;
++    io::path_t searchDir;
+     io::path_t avUtilPath;
+     io::path_t avCodecPath;
+     io::path_t avFormatPath;
+@@ -65,8 +76,12 @@ struct FFmpegLibPaths {
+     io::path_t swResamplePath;
+ };
+ 
++using FFmpegLibPathsList = std::vector<FFmpegLibPaths>;
++
+ io::paths_t defaultSearchPaths();
+ 
+-FFmpegLibPaths findLibraryPaths(const io::path_t& ffmpegLibsDir);
++FFmpegLibPathsList findLibraryPaths(const io::path_t& ffmpegLibsDir);
++FFmpegLibPathsList findLibraryPaths(const io::path_t& ffmpegLibsDir, const io::paths_t& defaultPaths);
++std::optional<io::path_t> configuredPathToPersist(const io::path_t& requestedPath, const FFmpegLibPaths& loadedCandidate);
+ FFmpegVersion versionFromAVFormatPath(const io::path_t& path);
+ }
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v4/ffmpeglibhandler.cpp.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v4/ffmpeglibhandler.cpp
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v4/ffmpeglibhandler.cpp.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v4/ffmpeglibhandler.cpp	2026-09-07 12:23:47.681505588 +0200
+@@ -22,10 +22,6 @@
+ 
+ #include "ffmpeglibhandler.h"
+ 
+-#if !defined(Q_OS_WIN)
+-#include <dlfcn.h>
+-#endif
+-
+ #include "io/fileinfo.h"
+ #include "global/dlib.h"
+ 
+@@ -34,21 +30,20 @@
+ namespace muse::media::ffmpeg::v4 {
+ #define RESOLVE_FROM(lib, name) do { \
+         name = reinterpret_cast<decltype(name)>(getSymbol(lib, #name)); \
+-        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; return false; } \
++        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; clearFunctions(); return false; } \
+ } while (0)
+ 
++FFmpegLibHandler::~FFmpegLibHandler()
++{
++    unload();
++}
++
+ void* FFmpegLibHandler::getSymbol(void* lib, const char* name) const
+ {
+     if (!lib) {
+         return nullptr;
+     }
+-    void* sym = muse::getLibFunc(lib, name);
+-    if (!sym) {
+-#if !defined(Q_OS_WIN)
+-        sym = dlsym(RTLD_DEFAULT, name);
+-#endif
+-    }
+-    return sym;
++    return muse::getLibFunc(lib, name);
+ }
+ 
+ bool FFmpegLibHandler::loadApi()
+@@ -122,6 +117,7 @@ bool FFmpegLibHandler::loadLib(const io:
+         || !tryLoadPath(m_swsScaleLibrary, swScalePath)
+         || !tryLoadPath(m_avCodecLibrary, avCodecPath)
+         || !tryLoadPath(m_avFormatLibrary, avFormatPath)) {
++        unload();
+         return false;
+     }
+ 
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v4/ffmpeglibhandler.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v4/ffmpeglibhandler.h
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v4/ffmpeglibhandler.h.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v4/ffmpeglibhandler.h	2026-09-07 12:23:47.681556767 +0200
+@@ -44,6 +44,9 @@ class FFmpegLibHandler
+ {
+ public:
+     FFmpegLibHandler() = default;
++    ~FFmpegLibHandler();
++    FFmpegLibHandler(const FFmpegLibHandler&) = delete;
++    FFmpegLibHandler& operator=(const FFmpegLibHandler&) = delete;
+ 
+     bool loadLib(const io::path_t& avUtilPath, const io::path_t& avCodecPath, const io::path_t& avFormatPath, const io::path_t& swScalePath,
+                  const io::path_t& swResamplePath);
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v5/ffmpeglibhandler.cpp.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v5/ffmpeglibhandler.cpp
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v5/ffmpeglibhandler.cpp.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v5/ffmpeglibhandler.cpp	2026-09-07 12:23:47.681610243 +0200
+@@ -22,10 +22,6 @@
+ 
+ #include "ffmpeglibhandler.h"
+ 
+-#if !defined(Q_OS_WIN)
+-#include <dlfcn.h>
+-#endif
+-
+ #include "io/fileinfo.h"
+ #include "global/dlib.h"
+ 
+@@ -34,21 +30,20 @@
+ namespace muse::media::ffmpeg::v5 {
+ #define RESOLVE_FROM(lib, name) do { \
+         name = reinterpret_cast<decltype(name)>(getSymbol(lib, #name)); \
+-        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; return false; } \
++        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; clearFunctions(); return false; } \
+ } while (0)
+ 
++FFmpegLibHandler::~FFmpegLibHandler()
++{
++    unload();
++}
++
+ void* FFmpegLibHandler::getSymbol(void* lib, const char* name) const
+ {
+     if (!lib) {
+         return nullptr;
+     }
+-    void* sym = muse::getLibFunc(lib, name);
+-    if (!sym) {
+-#if !defined(Q_OS_WIN)
+-        sym = dlsym(RTLD_DEFAULT, name);
+-#endif
+-    }
+-    return sym;
++    return muse::getLibFunc(lib, name);
+ }
+ 
+ bool FFmpegLibHandler::loadApi()
+@@ -122,6 +117,7 @@ bool FFmpegLibHandler::loadLib(const io:
+         || !tryLoadPath(m_swsScaleLibrary, swScalePath)
+         || !tryLoadPath(m_avCodecLibrary, avCodecPath)
+         || !tryLoadPath(m_avFormatLibrary, avFormatPath)) {
++        unload();
+         return false;
+     }
+ 
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v5/ffmpeglibhandler.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v5/ffmpeglibhandler.h
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v5/ffmpeglibhandler.h.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v5/ffmpeglibhandler.h	2026-09-07 12:23:47.681660286 +0200
+@@ -44,6 +44,9 @@ class FFmpegLibHandler
+ {
+ public:
+     FFmpegLibHandler() = default;
++    ~FFmpegLibHandler();
++    FFmpegLibHandler(const FFmpegLibHandler&) = delete;
++    FFmpegLibHandler& operator=(const FFmpegLibHandler&) = delete;
+ 
+     bool loadLib(const io::path_t& avUtilPath, const io::path_t& avCodecPath, const io::path_t& avFormatPath, const io::path_t& swScalePath,
+                  const io::path_t& swResamplePath);
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v6/ffmpeglibhandler.cpp.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v6/ffmpeglibhandler.cpp
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v6/ffmpeglibhandler.cpp.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v6/ffmpeglibhandler.cpp	2026-09-07 12:23:47.681723919 +0200
+@@ -22,10 +22,6 @@
+ 
+ #include "ffmpeglibhandler.h"
+ 
+-#if !defined(Q_OS_WIN)
+-#include <dlfcn.h>
+-#endif
+-
+ #include "io/fileinfo.h"
+ #include "global/dlib.h"
+ 
+@@ -34,21 +30,20 @@
+ namespace muse::media::ffmpeg::v6 {
+ #define RESOLVE_FROM(lib, name) do { \
+         name = reinterpret_cast<decltype(name)>(getSymbol(lib, #name)); \
+-        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; return false; } \
++        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; clearFunctions(); return false; } \
+ } while (0)
+ 
++FFmpegLibHandler::~FFmpegLibHandler()
++{
++    unload();
++}
++
+ void* FFmpegLibHandler::getSymbol(void* lib, const char* name) const
+ {
+     if (!lib) {
+         return nullptr;
+     }
+-    void* sym = muse::getLibFunc(lib, name);
+-    if (!sym) {
+-#if !defined(Q_OS_WIN)
+-        sym = dlsym(RTLD_DEFAULT, name);
+-#endif
+-    }
+-    return sym;
++    return muse::getLibFunc(lib, name);
+ }
+ 
+ bool FFmpegLibHandler::loadApi()
+@@ -122,6 +117,7 @@ bool FFmpegLibHandler::loadLib(const io:
+         || !tryLoadPath(m_swsScaleLibrary, swScalePath)
+         || !tryLoadPath(m_avCodecLibrary, avCodecPath)
+         || !tryLoadPath(m_avFormatLibrary, avFormatPath)) {
++        unload();
+         return false;
+     }
+ 
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v6/ffmpeglibhandler.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v6/ffmpeglibhandler.h
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v6/ffmpeglibhandler.h.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v6/ffmpeglibhandler.h	2026-09-07 12:23:47.681780751 +0200
+@@ -44,6 +44,9 @@ class FFmpegLibHandler
+ {
+ public:
+     FFmpegLibHandler() = default;
++    ~FFmpegLibHandler();
++    FFmpegLibHandler(const FFmpegLibHandler&) = delete;
++    FFmpegLibHandler& operator=(const FFmpegLibHandler&) = delete;
+ 
+     bool loadLib(const io::path_t& avUtilPath, const io::path_t& avCodecPath, const io::path_t& avFormatPath, const io::path_t& swScalePath,
+                  const io::path_t& swResamplePath);
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v7/ffmpeglibhandler.cpp.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v7/ffmpeglibhandler.cpp
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v7/ffmpeglibhandler.cpp.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v7/ffmpeglibhandler.cpp	2026-09-07 12:23:47.681847380 +0200
+@@ -22,10 +22,6 @@
+ 
+ #include "ffmpeglibhandler.h"
+ 
+-#if !defined(Q_OS_WIN)
+-#include <dlfcn.h>
+-#endif
+-
+ #include "io/fileinfo.h"
+ #include "global/dlib.h"
+ 
+@@ -34,21 +30,20 @@
+ namespace muse::media::ffmpeg::v7 {
+ #define RESOLVE_FROM(lib, name) do { \
+         name = reinterpret_cast<decltype(name)>(getSymbol(lib, #name)); \
+-        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; return false; } \
++        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; clearFunctions(); return false; } \
+ } while (0)
+ 
++FFmpegLibHandler::~FFmpegLibHandler()
++{
++    unload();
++}
++
+ void* FFmpegLibHandler::getSymbol(void* lib, const char* name) const
+ {
+     if (!lib) {
+         return nullptr;
+     }
+-    void* sym = muse::getLibFunc(lib, name);
+-    if (!sym) {
+-#if !defined(Q_OS_WIN)
+-        sym = dlsym(RTLD_DEFAULT, name);
+-#endif
+-    }
+-    return sym;
++    return muse::getLibFunc(lib, name);
+ }
+ 
+ bool FFmpegLibHandler::loadApi()
+@@ -122,6 +117,7 @@ bool FFmpegLibHandler::loadLib(const io:
+         || !tryLoadPath(m_swsScaleLibrary, swScalePath)
+         || !tryLoadPath(m_avCodecLibrary, avCodecPath)
+         || !tryLoadPath(m_avFormatLibrary, avFormatPath)) {
++        unload();
+         return false;
+     }
+ 
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v7/ffmpeglibhandler.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v7/ffmpeglibhandler.h
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v7/ffmpeglibhandler.h.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v7/ffmpeglibhandler.h	2026-09-07 12:23:47.681899173 +0200
+@@ -44,6 +44,9 @@ class FFmpegLibHandler
+ {
+ public:
+     FFmpegLibHandler() = default;
++    ~FFmpegLibHandler();
++    FFmpegLibHandler(const FFmpegLibHandler&) = delete;
++    FFmpegLibHandler& operator=(const FFmpegLibHandler&) = delete;
+ 
+     bool loadLib(const io::path_t& avUtilPath, const io::path_t& avCodecPath, const io::path_t& avFormatPath, const io::path_t& swScalePath,
+                  const io::path_t& swResamplePath);
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v8/ffmpeglibhandler.cpp.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v8/ffmpeglibhandler.cpp
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v8/ffmpeglibhandler.cpp.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v8/ffmpeglibhandler.cpp	2026-09-07 12:23:47.681959910 +0200
+@@ -22,10 +22,6 @@
+ 
+ #include "ffmpeglibhandler.h"
+ 
+-#if !defined(Q_OS_WIN)
+-#include <dlfcn.h>
+-#endif
+-
+ #include "io/fileinfo.h"
+ #include "global/dlib.h"
+ 
+@@ -34,21 +30,20 @@
+ namespace muse::media::ffmpeg::v8 {
+ #define RESOLVE_FROM(lib, name) do { \
+         name = reinterpret_cast<decltype(name)>(getSymbol(lib, #name)); \
+-        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; return false; } \
++        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; clearFunctions(); return false; } \
+ } while (0)
+ 
++FFmpegLibHandler::~FFmpegLibHandler()
++{
++    unload();
++}
++
+ void* FFmpegLibHandler::getSymbol(void* lib, const char* name) const
+ {
+     if (!lib) {
+         return nullptr;
+     }
+-    void* sym = muse::getLibFunc(lib, name);
+-    if (!sym) {
+-#if !defined(Q_OS_WIN)
+-        sym = dlsym(RTLD_DEFAULT, name);
+-#endif
+-    }
+-    return sym;
++    return muse::getLibFunc(lib, name);
+ }
+ 
+ bool FFmpegLibHandler::loadApi()
+@@ -122,6 +117,7 @@ bool FFmpegLibHandler::loadLib(const io:
+         || !tryLoadPath(m_swsScaleLibrary, swScalePath)
+         || !tryLoadPath(m_avCodecLibrary, avCodecPath)
+         || !tryLoadPath(m_avFormatLibrary, avFormatPath)) {
++        unload();
+         return false;
+     }
+ 
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v8/ffmpeglibhandler.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v8/ffmpeglibhandler.h
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v8/ffmpeglibhandler.h.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v8/ffmpeglibhandler.h	2026-09-07 12:23:47.682012290 +0200
+@@ -44,6 +44,9 @@ class FFmpegLibHandler
+ {
+ public:
+     FFmpegLibHandler() = default;
++    ~FFmpegLibHandler();
++    FFmpegLibHandler(const FFmpegLibHandler&) = delete;
++    FFmpegLibHandler& operator=(const FFmpegLibHandler&) = delete;
+ 
+     bool loadLib(const io::path_t& avUtilPath, const io::path_t& avCodecPath, const io::path_t& avFormatPath, const io::path_t& swScalePath,
+                  const io::path_t& swResamplePath);
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/ffmpeglibhandler.cpp.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/ffmpeglibhandler.cpp
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/ffmpeglibhandler.cpp.ffmpeg9	2026-09-07 12:23:47.680225343 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/ffmpeglibhandler.cpp	2026-09-07 12:23:47.682063301 +0200
+@@ -0,0 +1,229 @@
++/*
++ * SPDX-License-Identifier: GPL-3.0-only
++ * MuseScore-Studio-CLA-applies
++ *
++ * MuseScore Studio
++ * Music Composition & Notation
++ *
++ * Copyright (C) 2025 MuseScore Limited
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 3 as
++ * published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see <https://www.gnu.org/licenses/>.
++ */
++
++#include "ffmpeglibhandler.h"
++
++#include "io/fileinfo.h"
++#include "global/dlib.h"
++
++#include "log.h"
++
++namespace muse::media::ffmpeg::v9 {
++#define RESOLVE_FROM(lib, name) do { \
++        name = reinterpret_cast<decltype(name)>(getSymbol(lib, #name)); \
++        if (!name) { LOGW() << "FFmpeg: missing symbol " #name; clearFunctions(); return false; } \
++} while (0)
++
++FFmpegLibHandler::~FFmpegLibHandler()
++{
++    unload();
++}
++
++void* FFmpegLibHandler::getSymbol(void* lib, const char* name) const
++{
++    if (!lib) {
++        return nullptr;
++    }
++    return muse::getLibFunc(lib, name);
++}
++
++bool FFmpegLibHandler::loadApi()
++{
++    if (!m_avUtilLibrary || !m_avCodecLibrary || !m_avFormatLibrary || !m_swsScaleLibrary || !m_swResampleLibrary) {
++        return false;
++    }
++
++    clearFunctions();
++
++    // libavutil
++    RESOLVE_FROM(m_avUtilLibrary, av_rescale_q);
++    RESOLVE_FROM(m_avUtilLibrary, av_image_fill_arrays);
++    RESOLVE_FROM(m_avUtilLibrary, av_image_get_buffer_size);
++    RESOLVE_FROM(m_avUtilLibrary, av_opt_set_int);
++    RESOLVE_FROM(m_avUtilLibrary, av_frame_alloc);
++    RESOLVE_FROM(m_avUtilLibrary, av_frame_free);
++    RESOLVE_FROM(m_avUtilLibrary, av_malloc);
++
++    // libavformat
++    RESOLVE_FROM(m_avFormatLibrary, av_write_trailer);
++    RESOLVE_FROM(m_avFormatLibrary, av_interleaved_write_frame);
++    RESOLVE_FROM(m_avFormatLibrary, av_read_frame);
++    RESOLVE_FROM(m_avFormatLibrary, avio_open);
++    RESOLVE_FROM(m_avFormatLibrary, avio_close);
++    RESOLVE_FROM(m_avFormatLibrary, avformat_new_stream);
++    RESOLVE_FROM(m_avFormatLibrary, avformat_write_header);
++    RESOLVE_FROM(m_avFormatLibrary, avformat_open_input);
++    RESOLVE_FROM(m_avFormatLibrary, avformat_find_stream_info);
++    RESOLVE_FROM(m_avFormatLibrary, avformat_close_input);
++    RESOLVE_FROM(m_avFormatLibrary, avformat_free_context);
++    RESOLVE_FROM(m_avFormatLibrary, avformat_alloc_output_context2);
++    RESOLVE_FROM(m_avFormatLibrary, avformat_alloc_context);
++    RESOLVE_FROM(m_avFormatLibrary, avio_alloc_context);
++    RESOLVE_FROM(m_avFormatLibrary, avio_context_free);
++
++    // libavcodec
++    RESOLVE_FROM(m_avCodecLibrary, av_packet_alloc);
++    RESOLVE_FROM(m_avCodecLibrary, av_packet_free);
++    RESOLVE_FROM(m_avCodecLibrary, av_packet_unref);
++    RESOLVE_FROM(m_avCodecLibrary, av_packet_rescale_ts);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_alloc_context3);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_find_encoder);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_find_decoder);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_free_context);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_open2);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_parameters_from_context);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_parameters_to_context);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_parameters_copy);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_send_frame);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_receive_packet);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_send_packet);
++    RESOLVE_FROM(m_avCodecLibrary, avcodec_receive_frame);
++
++    // libswscale
++    RESOLVE_FROM(m_swsScaleLibrary, sws_getCachedContext);
++    RESOLVE_FROM(m_swsScaleLibrary, sws_scale);
++    RESOLVE_FROM(m_swsScaleLibrary, sws_freeContext);
++
++    return functionsValid();
++}
++
++bool FFmpegLibHandler::loadLib(const io::path_t& avUtilPath, const io::path_t& avCodecPath, const io::path_t& avFormatPath,
++                               const io::path_t& swScalePath, const io::path_t& swResamplePath)
++{
++    unload();
++
++    // Load avutil first, then swresample, swscale, avcodec, avformat (dependency order)
++    if (!tryLoadPath(m_avUtilLibrary, avUtilPath)
++        || !tryLoadPath(m_swResampleLibrary, swResamplePath)
++        || !tryLoadPath(m_swsScaleLibrary, swScalePath)
++        || !tryLoadPath(m_avCodecLibrary, avCodecPath)
++        || !tryLoadPath(m_avFormatLibrary, avFormatPath)) {
++        unload();
++        return false;
++    }
++
++    LOGI() << "FFmpeg loaded: avutil=" << avUtilPath << ", avcodec=" << avCodecPath << ", avformat=" << avFormatPath
++           << ", swscale=" << swScalePath << ", swresample=" << swResamplePath;
++
++    return true;
++}
++
++void FFmpegLibHandler::unload()
++{
++    closeLib(m_avFormatLibrary);
++    closeLib(m_swResampleLibrary);
++    closeLib(m_swsScaleLibrary);
++    closeLib(m_avCodecLibrary);
++    closeLib(m_avUtilLibrary);
++
++    clearFunctions();
++}
++
++void FFmpegLibHandler::closeLib(void*& lib)
++{
++    if (lib) {
++        muse::closeLib(lib);
++        lib = nullptr;
++    }
++}
++
++bool FFmpegLibHandler::tryLoadPath(void*& lib, const io::path_t& fullPath)
++{
++    if (!io::FileInfo::exists(fullPath)) {
++        return false;
++    }
++
++    void* loaded = muse::loadLib(fullPath);
++    if (loaded) {
++        lib = loaded;
++        return true;
++    }
++
++    return false;
++}
++
++bool FFmpegLibHandler::functionsValid() const
++{
++    return av_rescale_q
++           && av_image_fill_arrays && av_image_get_buffer_size
++           && av_opt_set_int
++           && avformat_new_stream
++           && avformat_write_header && av_write_trailer
++           && avio_open && avio_close && av_interleaved_write_frame
++           && avformat_open_input && avformat_find_stream_info
++           && avformat_close_input && avformat_free_context
++           && avformat_alloc_output_context2 && av_read_frame
++           && avformat_alloc_context && avio_alloc_context && avio_context_free
++           && avcodec_alloc_context3 && avcodec_find_encoder && avcodec_find_decoder && avcodec_free_context
++           && avcodec_open2 && avcodec_parameters_from_context && avcodec_parameters_to_context && avcodec_parameters_copy
++           && avcodec_send_frame && avcodec_receive_packet && avcodec_send_packet && avcodec_receive_frame
++           && av_frame_alloc && av_frame_free
++           && av_packet_alloc && av_packet_free && av_packet_unref && av_packet_rescale_ts
++           && av_malloc
++           && sws_getCachedContext && sws_scale && sws_freeContext;
++}
++
++void FFmpegLibHandler::clearFunctions()
++{
++    av_rescale_q = nullptr;
++    av_image_fill_arrays = nullptr;
++    av_image_get_buffer_size = nullptr;
++    av_opt_set_int = nullptr;
++    av_malloc = nullptr;
++    avformat_new_stream = nullptr;
++    avformat_write_header = nullptr;
++    av_write_trailer = nullptr;
++    avio_open = nullptr;
++    avio_close = nullptr;
++    av_interleaved_write_frame = nullptr;
++    avformat_open_input = nullptr;
++    avformat_find_stream_info = nullptr;
++    avformat_close_input = nullptr;
++    avformat_free_context = nullptr;
++    avformat_alloc_output_context2 = nullptr;
++    av_read_frame = nullptr;
++    avformat_alloc_context = nullptr;
++    avio_alloc_context = nullptr;
++    avio_context_free = nullptr;
++    avcodec_alloc_context3 = nullptr;
++    avcodec_find_encoder = nullptr;
++    avcodec_find_decoder = nullptr;
++    avcodec_free_context = nullptr;
++    avcodec_open2 = nullptr;
++    avcodec_parameters_from_context = nullptr;
++    avcodec_parameters_to_context = nullptr;
++    avcodec_parameters_copy = nullptr;
++    avcodec_send_frame = nullptr;
++    avcodec_receive_packet = nullptr;
++    avcodec_send_packet = nullptr;
++    avcodec_receive_frame = nullptr;
++    av_frame_alloc = nullptr;
++    av_frame_free = nullptr;
++    av_packet_alloc = nullptr;
++    av_packet_free = nullptr;
++    av_packet_unref = nullptr;
++    av_packet_rescale_ts = nullptr;
++    sws_getCachedContext = nullptr;
++    sws_scale = nullptr;
++    sws_freeContext = nullptr;
++}
++}
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/ffmpeglibhandler.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/ffmpeglibhandler.h
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/ffmpeglibhandler.h.ffmpeg9	2026-09-07 12:23:47.680308819 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/ffmpeglibhandler.h	2026-09-07 12:23:47.682112382 +0200
+@@ -0,0 +1,125 @@
++/*
++ * SPDX-License-Identifier: GPL-3.0-only
++ * MuseScore-Studio-CLA-applies
++ *
++ * MuseScore Studio
++ * Music Composition & Notation
++ *
++ * Copyright (C) 2025 MuseScore Limited
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 3 as
++ * published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see <https://www.gnu.org/licenses/>.
++ */
++
++#pragma once
++
++#if (defined (_MSCVER) || defined (_MSC_VER))
++#pragma warning(push)
++#pragma warning(disable: 4244)
++#endif
++
++extern "C" {
++#include "thirdparty/ffmpeg/v9/libavcodec/avcodec.h"
++#include "thirdparty/ffmpeg/v9/libavformat/avformat.h"
++#include "thirdparty/ffmpeg/v9/libswscale/swscale.h"
++}
++
++#if (defined (_MSCVER) || defined (_MSC_VER))
++#pragma warning(pop)
++#endif
++
++#include "io/path.h"
++
++namespace muse::media::ffmpeg::v9 {
++class FFmpegLibHandler
++{
++public:
++    FFmpegLibHandler() = default;
++    ~FFmpegLibHandler();
++    FFmpegLibHandler(const FFmpegLibHandler&) = delete;
++    FFmpegLibHandler& operator=(const FFmpegLibHandler&) = delete;
++
++    bool loadLib(const io::path_t& avUtilPath, const io::path_t& avCodecPath, const io::path_t& avFormatPath, const io::path_t& swScalePath,
++                 const io::path_t& swResamplePath);
++    bool loadApi();
++    void unload();
++
++    // libavutil
++    int64_t (*av_rescale_q)(int64_t a, AVRational bq, AVRational cq) = nullptr;
++    int (*av_image_fill_arrays)(uint8_t* dst_data[4], int dst_linesize[4], const uint8_t* src, AVPixelFormat pix_fmt, int width, int height,
++                                int align) = nullptr;
++    int (*av_image_get_buffer_size)(AVPixelFormat pix_fmt, int width, int height, int align) = nullptr;
++    int (*av_opt_set_int)(void* obj, const char* name, int64_t val, int search_flags) = nullptr;
++    void*(*av_malloc)(size_t size) = nullptr;
++
++    // libavformat
++    AVStream*(*avformat_new_stream)(AVFormatContext* s, const AVCodec* c) = nullptr;
++    int (*avformat_write_header)(AVFormatContext* s, AVDictionary** options) = nullptr;
++    int (*av_write_trailer)(AVFormatContext* s) = nullptr;
++    int (*avio_open)(AVIOContext** s, const char* url, int flags) = nullptr;
++    int (*avio_close)(AVIOContext* s) = nullptr;
++    int (*av_interleaved_write_frame)(AVFormatContext* s, AVPacket* pkt) = nullptr;
++    int (*avformat_open_input)(AVFormatContext** ctx, const char* url, const AVInputFormat* fmt, AVDictionary** options) = nullptr;
++    int (*avformat_find_stream_info)(AVFormatContext* ic, AVDictionary** options) = nullptr;
++    void (*avformat_close_input)(AVFormatContext** s) = nullptr;
++    void (*avformat_free_context)(AVFormatContext* s) = nullptr;
++    int (*avformat_alloc_output_context2)(AVFormatContext** ctx, const AVOutputFormat* oformat, const char* format_name,
++                                          const char* filename) = nullptr;
++    int (*av_read_frame)(AVFormatContext* s, AVPacket* pkt) = nullptr;
++    AVFormatContext*(*avformat_alloc_context)(void) = nullptr;
++    AVIOContext*(*avio_alloc_context)(unsigned char* buffer, int buffer_size, int write_flag, void* opaque,
++                                      int (*read_packet)(void* opaque, uint8_t* buf, int buf_size),
++                                      int (*write_packet)(void* opaque, const uint8_t* buf, int buf_size),
++                                      int64_t (*seek)(void* opaque, int64_t offset, int whence)) = nullptr;
++    void (*avio_context_free)(AVIOContext** s) = nullptr;
++
++    // libavcodec
++    AVCodecContext*(*avcodec_alloc_context3)(const AVCodec* codec) = nullptr;
++    const AVCodec*(*avcodec_find_encoder)(AVCodecID id) = nullptr;
++    const AVCodec*(*avcodec_find_decoder)(AVCodecID id) = nullptr;
++    void (*avcodec_free_context)(AVCodecContext** avctx) = nullptr;
++    int (*avcodec_open2)(AVCodecContext* avctx, const AVCodec* codec, AVDictionary** options) = nullptr;
++    int (*avcodec_parameters_from_context)(AVCodecParameters* par, const AVCodecContext* codec) = nullptr;
++    int (*avcodec_parameters_to_context)(AVCodecContext* codec, const AVCodecParameters* par) = nullptr;
++    int (*avcodec_parameters_copy)(AVCodecParameters* dst, const AVCodecParameters* src) = nullptr;
++    int (*avcodec_send_frame)(AVCodecContext* avctx, const AVFrame* frame) = nullptr;
++    int (*avcodec_receive_packet)(AVCodecContext* avctx, AVPacket* avpkt) = nullptr;
++    int (*avcodec_send_packet)(AVCodecContext* avctx, const AVPacket* avpkt) = nullptr;
++    int (*avcodec_receive_frame)(AVCodecContext* avctx, AVFrame* frame) = nullptr;
++    AVFrame*(*av_frame_alloc)(void) = nullptr;
++    void (*av_frame_free)(AVFrame** frame) = nullptr;
++    AVPacket*(*av_packet_alloc)(void) = nullptr;
++    void (*av_packet_free)(AVPacket** pkt) = nullptr;
++    void (*av_packet_unref)(AVPacket* pkt) = nullptr;
++    void (*av_packet_rescale_ts)(AVPacket* pkt, AVRational tb_src, AVRational tb_dst) = nullptr;
++
++    // libswscale
++    SwsContext*(*sws_getCachedContext)(SwsContext* context, int srcW, int srcH, AVPixelFormat srcFormat, int dstW, int dstH,
++                                       AVPixelFormat dstFormat, int flags, SwsFilter* srcFilter, SwsFilter* dstFilter,
++                                       const double* param) = nullptr;
++    int (*sws_scale)(struct SwsContext* c, const uint8_t* const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH,
++                     uint8_t* const dst[], const int dstStride[]) = nullptr;
++    void (*sws_freeContext)(SwsContext* swsContext) = nullptr;
++
++private: void* getSymbol(void* lib, const char* name) const;
++    bool tryLoadPath(void*& lib, const io::path_t& fullPath);
++    void closeLib(void*& lib);
++    void clearFunctions();
++    bool functionsValid() const;
++
++    void* m_avUtilLibrary = nullptr;
++    void* m_avCodecLibrary = nullptr;
++    void* m_avFormatLibrary = nullptr;
++    void* m_swsScaleLibrary = nullptr;
++    void* m_swResampleLibrary = nullptr;
++};
++}
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/videoencoder.cpp.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/videoencoder.cpp
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/videoencoder.cpp.ffmpeg9	2026-09-07 12:23:47.680496575 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/videoencoder.cpp	2026-09-07 12:23:47.680354765 +0200
+@@ -0,0 +1,784 @@
++/*
++ * SPDX-License-Identifier: GPL-3.0-only
++ * MuseScore-Studio-CLA-applies
++ *
++ * MuseScore Studio
++ * Music Composition & Notation
++ *
++ * Copyright (C) 2025 MuseScore Limited
++ *
++ * This program is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 3 as
++ * published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
++ */
++#include "videoencoder.h"
++#include "ffmpeglibhandler.h"
++
++#include <algorithm>
++
++#include "io/file.h"
++#include "io/path.h"
++#include "defer.h"
++#include "log.h"
++
++namespace muse::media::ffmpeg::v9 {
++struct MemoryReadContext {
++    const uint8_t* data = nullptr;
++    int64_t size = 0;
++    int64_t pos = 0;
++};
++
++static int memReadPacket(void* opaque, uint8_t* buf, int buf_size)
++{
++    auto* ctx = static_cast<MemoryReadContext*>(opaque);
++    int64_t remaining = ctx->size - ctx->pos;
++    int toRead = static_cast<int>(std::min(static_cast<int64_t>(buf_size), remaining));
++    if (toRead <= 0) {
++        return AVERROR_EOF;
++    }
++    memcpy(buf, ctx->data + ctx->pos, toRead);
++    ctx->pos += toRead;
++    return toRead;
++}
++
++static int64_t memSeek(void* opaque, int64_t offset, int whence)
++{
++    auto* ctx = static_cast<MemoryReadContext*>(opaque);
++    switch (whence) {
++    case SEEK_SET: ctx->pos = offset;
++        break;
++    case SEEK_CUR: ctx->pos += offset;
++        break;
++    case SEEK_END: ctx->pos = ctx->size + offset;
++        break;
++    case AVSEEK_SIZE: return ctx->size;
++    default: return -1;
++    }
++    if (ctx->pos < 0) {
++        ctx->pos = 0;
++    }
++    if (ctx->pos > ctx->size) {
++        ctx->pos = ctx->size;
++    }
++    return ctx->pos;
++}
++
++struct FFmpeg {
++    int width = 0;
++    int height = 0;
++    unsigned int ptsCounter = 0;
++
++    // FFmpeg stuff
++    AVFormatContext* formatCtx = nullptr;
++    AVStream* videoStream = nullptr;
++    AVCodecContext* codecCtx = nullptr;
++    const AVCodec* codec = nullptr;
++    // Frame data
++    AVFrame* ppicture = nullptr;
++    uint8_t* picture_buf = nullptr;
++    // Conversion
++    SwsContext* img_convert_ctx = nullptr;
++    // Packet
++    AVPacket* pkt;
++
++    bool opened = false;
++    bool finished = false;
++};
++
++VideoEncoder::VideoEncoder()
++{
++    m_ffmpeg = new FFmpeg();
++}
++
++VideoEncoder::~VideoEncoder()
++{
++    delete m_ffmpeg;
++}
++
++bool VideoEncoder::load(const FFmpegLibPaths& paths)
++{
++    auto handler = std::make_shared<FFmpegLibHandler>();
++    if (!handler->loadLib(paths.avUtilPath, paths.avCodecPath, paths.avFormatPath,
++                          paths.swScalePath, paths.swResamplePath)
++        || !handler->loadApi()) {
++        LOGW() << "FFmpeg libraries not found";
++        return false;
++    }
++    m_ffmpegHandler = std::move(handler);
++    return true;
++}
++
++bool VideoEncoder::open(const muse::io::path_t& fileName, const Options& options)
++{
++    m_ffmpeg->ptsCounter = 0;
++
++    m_ffmpeg->width = options.width;
++    m_ffmpeg->height = options.height;
++
++    if (m_ffmpegHandler->avformat_alloc_output_context2(&m_ffmpeg->formatCtx, nullptr, options.format.c_str(), fileName.c_str()) < 0
++        || !m_ffmpeg->formatCtx) {
++        LOGE() << "failed to allocate output context";
++        return false;
++    }
++
++    // Add the video stream
++    m_ffmpeg->videoStream = m_ffmpegHandler->avformat_new_stream(m_ffmpeg->formatCtx, nullptr);
++    if (!m_ffmpeg->videoStream) {
++        LOGE() << "failed allocate stream";
++        return false;
++    }
++
++    m_ffmpeg->videoStream->time_base.den = options.fps;
++    m_ffmpeg->videoStream->time_base.num = 1;
++
++    // find the video encoder
++    m_ffmpeg->codec = m_ffmpegHandler->avcodec_find_encoder(AV_CODEC_ID_H264);
++    if (!m_ffmpeg->codec) {
++        LOGE() << "not found codec";
++        return false;
++    }
++    m_ffmpeg->codecCtx = m_ffmpegHandler->avcodec_alloc_context3(m_ffmpeg->codec);
++    if (m_ffmpeg->codecCtx == nullptr) {
++        LOGE() << "failed to allocate AV context";
++        return false;
++    }
++
++    m_ffmpeg->videoStream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
++    m_ffmpeg->videoStream->codecpar->codec_id = AV_CODEC_ID_H264;
++    m_ffmpeg->videoStream->codecpar->width = options.width;
++    m_ffmpeg->videoStream->codecpar->height = options.height;
++    m_ffmpeg->videoStream->codecpar->format = AV_PIX_FMT_YUV420P;
++    m_ffmpeg->videoStream->codecpar->bit_rate = options.bitrate;
++
++    if (m_ffmpegHandler->avcodec_parameters_to_context(m_ffmpeg->codecCtx, m_ffmpeg->videoStream->codecpar) < 0) {
++        m_ffmpegHandler->avcodec_free_context(&m_ffmpeg->codecCtx);
++        LOGE() << "failed to set codec parameters from stream";
++        return false;
++    }
++
++    m_ffmpeg->codecCtx->profile = AV_PROFILE_H264_MAIN;
++    m_ffmpeg->codecCtx->time_base.den = options.fps;
++    m_ffmpeg->codecCtx->time_base.num = 1;
++    m_ffmpeg->codecCtx->gop_size = options.gop;
++    m_ffmpeg->codecCtx->thread_count = 10;
++    m_ffmpeg->codecCtx->max_b_frames = 0;
++    m_ffmpegHandler->av_opt_set_int(m_ffmpeg->codecCtx, "b_strategy", 1, 0);
++
++    m_ffmpeg->codecCtx->me_cmp = 1;
++    m_ffmpeg->codecCtx->me_range = 16;
++    m_ffmpegHandler->av_opt_set_int(m_ffmpeg->codecCtx, "hex", 1, 0);
++
++    m_ffmpeg->codecCtx->qmin = 10;
++    m_ffmpeg->codecCtx->qmax = 51;
++    m_ffmpegHandler->av_opt_set_int(m_ffmpeg->codecCtx, "sc_threshold", 40, 0);
++    m_ffmpeg->codecCtx->flags |= AV_CODEC_FLAG_LOOP_FILTER;
++    m_ffmpeg->codecCtx->me_subpel_quality = 5;
++    m_ffmpeg->codecCtx->i_quant_factor = 0.71f;
++    m_ffmpeg->codecCtx->qcompress = 0.6f;
++    m_ffmpeg->codecCtx->max_qdiff = 4;
++
++    if (m_ffmpeg->formatCtx->oformat->flags & AVFMT_GLOBALHEADER) {
++        m_ffmpeg->codecCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
++    }
++
++    if (m_ffmpegHandler->avcodec_open2(m_ffmpeg->codecCtx, m_ffmpeg->codec, nullptr) < 0) {
++        LOGE() << "failed open codec";
++        return false;
++    }
++
++    // Copy codec params to stream AFTER open - codec adds extradata (SPS/PPS) during open
++    if (m_ffmpegHandler->avcodec_parameters_from_context(m_ffmpeg->videoStream->codecpar, m_ffmpeg->codecCtx) < 0) {
++        m_ffmpegHandler->avcodec_free_context(&m_ffmpeg->codecCtx);
++        LOGE() << "failed to copy codec parameters to stream";
++        return false;
++    }
++
++    // Allocate the YUV frame
++    m_ffmpeg->ppicture = m_ffmpegHandler->av_frame_alloc();
++    if (!m_ffmpeg->ppicture) {
++        LOGE() << "failed allocate frame";
++        return false;
++    }
++
++    m_ffmpeg->ppicture->width = options.width;
++    m_ffmpeg->ppicture->height = options.height;
++    m_ffmpeg->ppicture->format = AV_PIX_FMT_YUV420P;
++
++    int size = m_ffmpegHandler->av_image_get_buffer_size(AV_PIX_FMT_YUV420P, m_ffmpeg->width, m_ffmpeg->height, 1);
++    m_ffmpeg->picture_buf = new uint8_t[size];
++    if (!m_ffmpeg->picture_buf) {
++        LOGE() << "failed allocate frame buf";
++        m_ffmpegHandler->av_frame_free(&m_ffmpeg->ppicture);
++        return false;
++    }
++
++    // Setup the planes
++    m_ffmpegHandler->av_image_fill_arrays(m_ffmpeg->ppicture->data, m_ffmpeg->ppicture->linesize, m_ffmpeg->picture_buf,
++                                          AV_PIX_FMT_YUV420P, m_ffmpeg->width, m_ffmpeg->height, 1);
++
++    if (m_ffmpegHandler->avio_open(&m_ffmpeg->formatCtx->pb, fileName.c_str(), AVIO_FLAG_WRITE) < 0) {
++        LOGE() << "failed open file: " << fileName;
++        return false;
++    }
++
++    int ret = m_ffmpegHandler->avformat_write_header(m_ffmpeg->formatCtx, NULL);
++    if (ret < 0) {
++        LOGE() << "failed write AV header";
++        return false;
++    }
++
++    //av_dump_format(m_ffmpeg->formatCtx, 0, fileName.c_str(), 1);
++
++    m_ffmpeg->opened = true;
++    m_outputPath = fileName;
++
++    return true;
++}
++
++void VideoEncoder::finishEncode()
++{
++    if (!m_ffmpeg->opened || m_ffmpeg->finished) {
++        return;
++    }
++
++    int ret = m_ffmpegHandler->avcodec_send_frame(m_ffmpeg->codecCtx, NULL);
++    if (ret < 0) {
++        LOGE() << "failed to flush encoder buffer";
++        return;
++    }
++
++    while (true) {
++        m_ffmpeg->pkt = m_ffmpegHandler->av_packet_alloc();
++        ret = m_ffmpegHandler->avcodec_receive_packet(m_ffmpeg->codecCtx, m_ffmpeg->pkt);
++        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
++            m_ffmpegHandler->av_packet_free(&m_ffmpeg->pkt);
++            break;
++        } else if (ret < 0) {
++            m_ffmpegHandler->av_packet_free(&m_ffmpeg->pkt);
++            LOGE() << "error during encoding";
++            return;
++        }
++
++        m_ffmpeg->pkt->pts = m_ffmpegHandler->av_rescale_q(m_ffmpeg->ptsCounter, m_ffmpeg->codecCtx->time_base,
++                                                           m_ffmpeg->videoStream->time_base);
++        m_ffmpeg->pkt->dts = m_ffmpegHandler->av_rescale_q(m_ffmpeg->ptsCounter, m_ffmpeg->codecCtx->time_base,
++                                                           m_ffmpeg->videoStream->time_base);
++
++        m_ffmpeg->ptsCounter++;
++
++        ret = m_ffmpegHandler->av_interleaved_write_frame(m_ffmpeg->formatCtx, m_ffmpeg->pkt);
++        if (ret < 0) {
++            m_ffmpegHandler->av_packet_free(&m_ffmpeg->pkt);
++            return;
++        }
++        m_ffmpegHandler->av_packet_free(&m_ffmpeg->pkt);
++    }
++
++    m_ffmpegHandler->av_write_trailer(m_ffmpeg->formatCtx);
++
++    if (m_ffmpeg->formatCtx->pb) {
++        m_ffmpegHandler->avio_close(m_ffmpeg->formatCtx->pb);
++        m_ffmpeg->formatCtx->pb = nullptr;
++    }
++
++    m_ffmpeg->finished = true;
++}
++
++void VideoEncoder::close()
++{
++    if (!m_ffmpeg->opened) {
++        return;
++    }
++
++    if (!m_ffmpeg->finished) {
++        finishEncode();
++    }
++
++    m_ffmpegHandler->avcodec_free_context(&m_ffmpeg->codecCtx);
++
++    if (m_ffmpeg->picture_buf) {
++        delete[] m_ffmpeg->picture_buf;
++        m_ffmpeg->picture_buf = 0;
++    }
++
++    if (m_ffmpeg->ppicture) {
++        m_ffmpegHandler->av_frame_free(&m_ffmpeg->ppicture);
++        m_ffmpeg->ppicture = 0;
++    }
++
++    if (m_ffmpeg->img_convert_ctx) {
++        m_ffmpegHandler->sws_freeContext(m_ffmpeg->img_convert_ctx);
++        m_ffmpeg->img_convert_ctx = nullptr;
++    }
++
++    if (m_ffmpeg->formatCtx) {
++        if (m_ffmpeg->formatCtx->pb) {
++            m_ffmpegHandler->avio_close(m_ffmpeg->formatCtx->pb);
++            m_ffmpeg->formatCtx->pb = nullptr;
++        }
++        m_ffmpegHandler->avformat_free_context(m_ffmpeg->formatCtx);
++        m_ffmpeg->formatCtx = nullptr;
++    }
++    m_ffmpeg->opened = false;
++    m_ffmpeg->finished = false;
++
++    m_outputPath = io::path_t();
++}
++
++bool VideoEncoder::encodeImage(const QImage& img)
++{
++    if (!m_ffmpeg->opened) {
++        return false;
++    }
++
++    convertImage_sws(img);
++
++    m_ffmpeg->ppicture->pts = m_ffmpegHandler->av_rescale_q(m_ffmpeg->codecCtx->frame_num, m_ffmpeg->codecCtx->time_base,
++                                                            m_ffmpeg->videoStream->time_base);
++
++    int ret = m_ffmpegHandler->avcodec_send_frame(m_ffmpeg->codecCtx, m_ffmpeg->ppicture);
++    if (ret < 0) {
++        return false;
++    }
++
++    while (ret >= 0) {
++        m_ffmpeg->pkt = m_ffmpegHandler->av_packet_alloc();
++        ret = m_ffmpegHandler->avcodec_receive_packet(m_ffmpeg->codecCtx, m_ffmpeg->pkt);
++        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
++            m_ffmpegHandler->av_packet_free(&m_ffmpeg->pkt);
++            return true;
++        } else if (ret < 0) {
++            m_ffmpegHandler->av_packet_free(&m_ffmpeg->pkt);
++            LOGE() << "error during encoding";
++            return false;
++        }
++
++        m_ffmpeg->pkt->pts = m_ffmpegHandler->av_rescale_q(m_ffmpeg->ptsCounter, m_ffmpeg->codecCtx->time_base,
++                                                           m_ffmpeg->videoStream->time_base);
++        m_ffmpeg->pkt->dts = m_ffmpegHandler->av_rescale_q(m_ffmpeg->ptsCounter, m_ffmpeg->codecCtx->time_base,
++                                                           m_ffmpeg->videoStream->time_base);
++
++        m_ffmpeg->ptsCounter++;
++
++        ret = m_ffmpegHandler->av_interleaved_write_frame(m_ffmpeg->formatCtx, m_ffmpeg->pkt);
++        if (ret < 0) {
++            m_ffmpegHandler->av_packet_free(&m_ffmpeg->pkt);
++            return false;
++        }
++        m_ffmpegHandler->av_packet_free(&m_ffmpeg->pkt);
++    }
++
++    return true;
++}
++
++bool VideoEncoder::encodeVideo(const ByteArray& videoData, int maxFrames)
++{
++    if (!m_ffmpeg->opened) {
++        LOGE() << "encodeVideo: encoder not opened";
++        return false;
++    }
++
++    MemoryReadContext memCtx;
++    memCtx.data = videoData.constData();
++    memCtx.size = static_cast<int64_t>(videoData.size());
++    memCtx.pos = 0;
++
++    static constexpr int AVIO_BUF_SIZE = 4096;
++    unsigned char* avioBuf = static_cast<unsigned char*>(m_ffmpegHandler->av_malloc(AVIO_BUF_SIZE));
++    if (!avioBuf) {
++        LOGE() << "encodeVideo: failed to allocate avio buffer";
++        return false;
++    }
++
++    AVIOContext* avioCtx = m_ffmpegHandler->avio_alloc_context(
++        avioBuf, AVIO_BUF_SIZE, 0, &memCtx, memReadPacket, nullptr, memSeek);
++    if (!avioCtx) {
++        LOGE() << "encodeVideo: failed to allocate AVIOContext";
++        return false;
++    }
++
++    AVFormatContext* inputFmtCtx = m_ffmpegHandler->avformat_alloc_context();
++    if (!inputFmtCtx) {
++        m_ffmpegHandler->avio_context_free(&avioCtx);
++        LOGE() << "encodeVideo: failed to allocate format context";
++        return false;
++    }
++    inputFmtCtx->pb = avioCtx;
++
++    AVCodecContext* decodeCtx = nullptr;
++    AVFrame* decodedFrame = nullptr;
++    AVPacket* packet = nullptr;
++
++    SwsContext* decSwsCtx = nullptr;
++
++    DEFER {
++        if (decSwsCtx) {
++            m_ffmpegHandler->sws_freeContext(decSwsCtx);
++        }
++        if (inputFmtCtx) {
++            m_ffmpegHandler->avformat_close_input(&inputFmtCtx);
++        }
++        if (avioCtx) {
++            m_ffmpegHandler->avio_context_free(&avioCtx);
++        }
++        if (decodeCtx) {
++            m_ffmpegHandler->avcodec_free_context(&decodeCtx);
++        }
++        if (decodedFrame) {
++            m_ffmpegHandler->av_frame_free(&decodedFrame);
++        }
++        if (packet) {
++            m_ffmpegHandler->av_packet_free(&packet);
++        }
++    };
++
++    if (m_ffmpegHandler->avformat_open_input(&inputFmtCtx, nullptr, nullptr, nullptr) < 0) {
++        LOGE() << "encodeVideo: failed to open input from memory";
++        return false;
++    }
++
++    if (m_ffmpegHandler->avformat_find_stream_info(inputFmtCtx, nullptr) < 0) {
++        LOGE() << "encodeVideo: failed to find stream info";
++        return false;
++    }
++
++    int videoStreamIdx = -1;
++    for (unsigned i = 0; i < inputFmtCtx->nb_streams; i++) {
++        if (inputFmtCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
++            videoStreamIdx = static_cast<int>(i);
++            break;
++        }
++    }
++
++    if (videoStreamIdx < 0) {
++        LOGE() << "encodeVideo: no video stream found";
++        return false;
++    }
++
++    AVCodecParameters* codecPar = inputFmtCtx->streams[videoStreamIdx]->codecpar;
++
++    const AVCodec* decoder = m_ffmpegHandler->avcodec_find_decoder(codecPar->codec_id);
++    if (!decoder) {
++        LOGE() << "encodeVideo: decoder not found for codec_id " << codecPar->codec_id;
++        return false;
++    }
++
++    decodeCtx = m_ffmpegHandler->avcodec_alloc_context3(decoder);
++    if (!decodeCtx) {
++        LOGE() << "encodeVideo: failed to allocate decoder context";
++        return false;
++    }
++
++    m_ffmpegHandler->avcodec_parameters_to_context(decodeCtx, codecPar);
++
++    if (m_ffmpegHandler->avcodec_open2(decodeCtx, decoder, nullptr) < 0) {
++        LOGE() << "encodeVideo: failed to open decoder";
++        return false;
++    }
++
++    decSwsCtx = m_ffmpegHandler->sws_getCachedContext(
++        nullptr,
++        decodeCtx->width, decodeCtx->height, decodeCtx->pix_fmt,
++        m_ffmpeg->width, m_ffmpeg->height, AV_PIX_FMT_YUV420P,
++        SWS_BICUBIC, nullptr, nullptr, nullptr);
++
++    if (!decSwsCtx) {
++        LOGE() << "encodeVideo: failed to create sws context";
++        return false;
++    }
++
++    decodedFrame = m_ffmpegHandler->av_frame_alloc();
++    packet = m_ffmpegHandler->av_packet_alloc();
++
++    int framesEncoded = 0;
++    bool done = false;
++
++    auto encodeDecodedFrame = [&]() -> bool {
++        m_ffmpegHandler->sws_scale(decSwsCtx,
++                                   decodedFrame->data, decodedFrame->linesize,
++                                   0, decodedFrame->height,
++                                   m_ffmpeg->ppicture->data, m_ffmpeg->ppicture->linesize);
++
++        m_ffmpeg->ppicture->pts = m_ffmpegHandler->av_rescale_q(
++            m_ffmpeg->codecCtx->frame_num, m_ffmpeg->codecCtx->time_base, m_ffmpeg->videoStream->time_base);
++
++        int ret = m_ffmpegHandler->avcodec_send_frame(m_ffmpeg->codecCtx, m_ffmpeg->ppicture);
++        if (ret < 0) {
++            return false;
++        }
++
++        while (ret >= 0) {
++            AVPacket* outPkt = m_ffmpegHandler->av_packet_alloc();
++            ret = m_ffmpegHandler->avcodec_receive_packet(m_ffmpeg->codecCtx, outPkt);
++            if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
++                m_ffmpegHandler->av_packet_free(&outPkt);
++                break;
++            }
++            if (ret < 0) {
++                m_ffmpegHandler->av_packet_free(&outPkt);
++                return false;
++            }
++
++            outPkt->pts = m_ffmpegHandler->av_rescale_q(m_ffmpeg->ptsCounter, m_ffmpeg->codecCtx->time_base,
++                                                        m_ffmpeg->videoStream->time_base);
++            outPkt->dts = m_ffmpegHandler->av_rescale_q(m_ffmpeg->ptsCounter, m_ffmpeg->codecCtx->time_base,
++                                                        m_ffmpeg->videoStream->time_base);
++            m_ffmpeg->ptsCounter++;
++
++            m_ffmpegHandler->av_interleaved_write_frame(m_ffmpeg->formatCtx, outPkt);
++            m_ffmpegHandler->av_packet_free(&outPkt);
++        }
++
++        framesEncoded++;
++        if (maxFrames > 0 && framesEncoded >= maxFrames) {
++            done = true;
++        }
++
++        return true;
++    };
++
++    while (!done && m_ffmpegHandler->av_read_frame(inputFmtCtx, packet) >= 0) {
++        if (packet->stream_index != videoStreamIdx) {
++            m_ffmpegHandler->av_packet_unref(packet);
++            continue;
++        }
++
++        int ret = m_ffmpegHandler->avcodec_send_packet(decodeCtx, packet);
++        m_ffmpegHandler->av_packet_unref(packet);
++
++        while (!done && ret >= 0) {
++            ret = m_ffmpegHandler->avcodec_receive_frame(decodeCtx, decodedFrame);
++            if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
++                break;
++            }
++            if (ret < 0) {
++                LOGE() << "encodeVideo: error receiving decoded frame";
++                return false;
++            }
++
++            if (!encodeDecodedFrame()) {
++                LOGE() << "encodeVideo: error encoding frame";
++                return false;
++            }
++        }
++    }
++
++    if (!done) {
++        m_ffmpegHandler->avcodec_send_packet(decodeCtx, nullptr);
++        while (true) {
++            int ret = m_ffmpegHandler->avcodec_receive_frame(decodeCtx, decodedFrame);
++            if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
++                break;
++            }
++            if (ret < 0 || !encodeDecodedFrame() || done) {
++                break;
++            }
++        }
++    }
++
++    LOGI() << "encodeVideo: encoded " << framesEncoded << " frames from memory buffer";
++    return true;
++}
++
++bool VideoEncoder::addAudio(const io::path_t& audioPath)
++{
++    if (m_outputPath.empty()) {
++        LOGE() << "addAudio: encoder was not opened or path not set";
++        return false;
++    }
++
++    const io::path_t videoPath = m_outputPath;
++    const io::path_t tmpPath = m_outputPath + ".tmp";
++
++    AVFormatContext* videoFmtCtx = nullptr;
++    AVFormatContext* audioFmtCtx = nullptr;
++    AVFormatContext* outputFmtCtx = nullptr;
++
++    bool cleaned = false;
++    auto cleanup = [&]() {
++        if (cleaned) {
++            return;
++        }
++
++        if (videoFmtCtx) {
++            m_ffmpegHandler->avformat_close_input(&videoFmtCtx);
++        }
++        if (audioFmtCtx) {
++            m_ffmpegHandler->avformat_close_input(&audioFmtCtx);
++        }
++        if (outputFmtCtx) {
++            if (outputFmtCtx->pb) {
++                m_ffmpegHandler->avio_close(outputFmtCtx->pb);
++                outputFmtCtx->pb = nullptr;
++            }
++            m_ffmpegHandler->avformat_free_context(outputFmtCtx);
++        }
++
++        cleaned = true;
++    };
++
++    DEFER {
++        cleanup();
++    };
++
++    if (m_ffmpegHandler->avformat_open_input(&videoFmtCtx, videoPath.c_str(), nullptr, nullptr) < 0) {
++        LOGE() << "addAudio: failed to open video input: " << videoPath;
++        return false;
++    }
++    if (m_ffmpegHandler->avformat_find_stream_info(videoFmtCtx, nullptr) < 0) {
++        LOGE() << "addAudio: failed to find video stream info";
++        return false;
++    }
++
++    if (m_ffmpegHandler->avformat_open_input(&audioFmtCtx, audioPath.c_str(), nullptr, nullptr) < 0) {
++        LOGE() << "addAudio: failed to open audio input: " << audioPath;
++        return false;
++    }
++    if (m_ffmpegHandler->avformat_find_stream_info(audioFmtCtx, nullptr) < 0) {
++        LOGE() << "addAudio: failed to find audio stream info";
++        return false;
++    }
++
++    if (m_ffmpegHandler->avformat_alloc_output_context2(&outputFmtCtx, nullptr, "mp4", tmpPath.c_str()) < 0 || !outputFmtCtx) {
++        LOGE() << "addAudio: failed to allocate output context";
++        return false;
++    }
++
++    int videoInIdx = -1;
++    int audioInIdx = -1;
++    int outVideoIdx = -1;
++    int outAudioIdx = -1;
++
++    for (unsigned i = 0; i < videoFmtCtx->nb_streams; i++) {
++        if (videoFmtCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
++            videoInIdx = static_cast<int>(i);
++            AVStream* outStream = m_ffmpegHandler->avformat_new_stream(outputFmtCtx, nullptr);
++            if (!outStream) {
++                LOGE() << "addAudio: failed to create output video stream";
++                return false;
++            }
++            m_ffmpegHandler->avcodec_parameters_copy(outStream->codecpar, videoFmtCtx->streams[i]->codecpar);
++            outStream->codecpar->codec_tag = 0;
++            outStream->time_base = videoFmtCtx->streams[i]->time_base;
++            outVideoIdx = outStream->index;
++            break;
++        }
++    }
++
++    for (unsigned i = 0; i < audioFmtCtx->nb_streams; i++) {
++        if (audioFmtCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
++            audioInIdx = static_cast<int>(i);
++            AVStream* outStream = m_ffmpegHandler->avformat_new_stream(outputFmtCtx, nullptr);
++            if (!outStream) {
++                LOGE() << "addAudio: failed to create output audio stream";
++                return false;
++            }
++            m_ffmpegHandler->avcodec_parameters_copy(outStream->codecpar, audioFmtCtx->streams[i]->codecpar);
++            outStream->codecpar->codec_tag = 0;
++            outStream->time_base = audioFmtCtx->streams[i]->time_base;
++            outAudioIdx = outStream->index;
++            break;
++        }
++    }
++
++    if (videoInIdx < 0 || audioInIdx < 0) {
++        LOGE() << "addAudio: could not find video or audio stream";
++        return false;
++    }
++
++    if (m_ffmpegHandler->avio_open(&outputFmtCtx->pb, tmpPath.c_str(), AVIO_FLAG_WRITE) < 0) {
++        LOGE() << "addAudio: failed to open output file: " << tmpPath;
++        return false;
++    }
++
++    if (m_ffmpegHandler->avformat_write_header(outputFmtCtx, nullptr) < 0) {
++        LOGE() << "addAudio: failed to write header";
++        return false;
++    }
++
++    AVPacket* pkt = m_ffmpegHandler->av_packet_alloc();
++
++    while (m_ffmpegHandler->av_read_frame(videoFmtCtx, pkt) >= 0) {
++        if (pkt->stream_index == videoInIdx) {
++            pkt->stream_index = outVideoIdx;
++            m_ffmpegHandler->av_packet_rescale_ts(pkt, videoFmtCtx->streams[videoInIdx]->time_base,
++                                                  outputFmtCtx->streams[outVideoIdx]->time_base);
++            pkt->pos = -1;
++            m_ffmpegHandler->av_interleaved_write_frame(outputFmtCtx, pkt);
++        }
++        m_ffmpegHandler->av_packet_unref(pkt);
++    }
++
++    while (m_ffmpegHandler->av_read_frame(audioFmtCtx, pkt) >= 0) {
++        if (pkt->stream_index == audioInIdx) {
++            pkt->stream_index = outAudioIdx;
++            m_ffmpegHandler->av_packet_rescale_ts(pkt, audioFmtCtx->streams[audioInIdx]->time_base,
++                                                  outputFmtCtx->streams[outAudioIdx]->time_base);
++            pkt->pos = -1;
++            m_ffmpegHandler->av_interleaved_write_frame(outputFmtCtx, pkt);
++        }
++        m_ffmpegHandler->av_packet_unref(pkt);
++    }
++
++    m_ffmpegHandler->av_packet_free(&pkt);
++    m_ffmpegHandler->av_write_trailer(outputFmtCtx);
++
++    cleanup();
++
++    if (!io::File::copy(tmpPath, videoPath, true)) {
++        LOGE() << "addAudio: failed to replace with muxed file";
++        return false;
++    }
++
++    io::File::remove(tmpPath);
++
++    return true;
++}
++
++bool VideoEncoder::convertImage_sws(const QImage& img)
++{
++    // Check if the image matches the size
++    if (img.width() != m_ffmpeg->width || img.height() != m_ffmpeg->height) {
++        LOGE() << "wrong image size!";
++        return false;
++    }
++
++    if (img.format() != QImage::Format_RGB32 && img.format() != QImage::Format_ARGB32) {
++        LOGE() << "wrong image format";
++        return false;
++    }
++
++    m_ffmpeg->img_convert_ctx = m_ffmpegHandler->sws_getCachedContext(m_ffmpeg->img_convert_ctx, m_ffmpeg->width, m_ffmpeg->height,
++                                                                      AV_PIX_FMT_BGRA,
++                                                                      m_ffmpeg->width, m_ffmpeg->height, AV_PIX_FMT_YUV420P, SWS_BICUBIC,
++                                                                      NULL, NULL, NULL);
++
++    if (!m_ffmpeg->img_convert_ctx) {
++        LOGE() << "failed initialize the conversion context";
++        return false;
++    }
++
++    uint8_t* srcplanes[3];
++    srcplanes[0] = (uint8_t*)img.bits();
++    srcplanes[1] = 0;
++    srcplanes[2] = 0;
++
++    int srcstride[3];
++    srcstride[0] = img.bytesPerLine();
++    srcstride[1] = 0;
++    srcstride[2 ]= 0;
++
++    m_ffmpegHandler->sws_scale(m_ffmpeg->img_convert_ctx, srcplanes, srcstride, 0, m_ffmpeg->height, m_ffmpeg->ppicture->data,
++                               m_ffmpeg->ppicture->linesize);
++
++    return true;
++}
++}
+diff -up MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/videoencoder.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/videoencoder.h
+--- MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/videoencoder.h.ffmpeg9	2026-09-07 12:23:47.680560144 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/ffmpeg/v9/videoencoder.h	2026-09-07 12:23:47.680542424 +0200
+@@ -0,0 +1,57 @@
++/*
++ * SPDX-License-Identifier: GPL-3.0-only
++ * MuseScore-Studio-CLA-applies
++ *
++ * MuseScore Studio
++ * Music Composition & Notation
++ *
++ * Copyright (C) 2025 MuseScore Limited
++ *
++ * This program is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 3 as
++ * published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
++ */
++
++#pragma once
++
++#include "media/ivideoencoder.h"
++
++#include "internal/ffmpegutils.h"
++
++namespace muse::media::ffmpeg::v9 {
++class FFmpegLibHandler;
++struct FFmpeg;
++class VideoEncoder : public IVideoEncoder
++{
++public:
++    VideoEncoder();
++    ~VideoEncoder() override;
++
++    bool load(const FFmpegLibPaths& paths);
++
++    bool open(const muse::io::path_t& fileName, const Options& options) override;
++    void close() override;
++
++    bool encodeImage(const QImage& img) override;
++    void finishEncode() override;
++
++    bool encodeVideo(const muse::ByteArray& videoData, int maxFrames = -1) override;
++
++    bool addAudio(const muse::io::path_t& audioPath) override;
++
++private:
++    bool convertImage_sws(const QImage& img);
++
++    std::shared_ptr<FFmpegLibHandler> m_ffmpegHandler = nullptr;
++    FFmpeg* m_ffmpeg = nullptr;
++    muse::io::path_t m_outputPath;
++};
++}
+diff -up MuseScore-4.7.4/src/framework/media/internal/videoencoderresolver.cpp.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/videoencoderresolver.cpp
+--- MuseScore-4.7.4/src/framework/media/internal/videoencoderresolver.cpp.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/videoencoderresolver.cpp	2026-09-07 12:23:47.681341358 +0200
+@@ -26,6 +26,7 @@
+ #include "io/path.h"
+ #include "log.h"
+ 
++#include "internal/ffmpeg/v9/videoencoder.h"
+ #include "internal/ffmpeg/v8/videoencoder.h"
+ #include "internal/ffmpeg/v7/videoencoder.h"
+ #include "internal/ffmpeg/v6/videoencoder.h"
+@@ -38,13 +39,13 @@ using namespace muse::media;
+ 
+ void VideoEncoderResolver::init()
+ {
+-    loadFFmpeg(configuration()->ffmpegLibsDir());
++    loadFFmpeg(configuration()->ffmpegLibsDir(), false);
+ 
+     //! NOTE: We need to search for and reload the FFmpeg libraries with a delay,
+     //!       because this is a resource-intensive operation.
+     m_reloadFfmpegTimer = std::make_shared<Timer>(std::chrono::seconds(1));
+     m_reloadFfmpegTimer->onTimeout(this, [this](){
+-        loadFFmpeg(configuration()->ffmpegLibsDir());
++        loadFFmpeg(configuration()->ffmpegLibsDir(), false);
+ 
+         m_reloadFfmpegTimer->stop();
+     });
+@@ -67,24 +68,37 @@ void VideoEncoderResolver::deinit()
+ 
+ void VideoEncoderResolver::loadFFmpeg(const io::path_t& ffmpegLibsDir)
+ {
+-    const FFmpegLibPaths paths = findLibraryPaths(ffmpegLibsDir);
+-    if (paths.avFormatPath.empty()) {
+-        resetFFmpegSettings();
+-        return;
+-    }
++    loadFFmpeg(ffmpegLibsDir, true);
++}
+ 
+-    EncoderInfo encoderInfo = makeEncoder(paths);
+-    if (!encoderInfo.encoder) {
+-        resetFFmpegSettings();
+-        return;
+-    }
++void VideoEncoderResolver::loadFFmpeg(const io::path_t& ffmpegLibsDir, bool persistRequestedPath)
++{
++    const FFmpegLibPathsList libraryPaths = findLibraryPaths(ffmpegLibsDir);
++    for (const FFmpegLibPaths& paths : libraryPaths) {
++        EncoderInfo encoderInfo = makeEncoder(paths);
++        if (!encoderInfo.encoder) {
++            continue;
++        }
+ 
+-    setCurrentVideoEncoder(encoderInfo.encoder);
++        setCurrentVideoEncoder(encoderInfo.encoder);
++        m_loadedFFmpegDir = encoderInfo.ffmpegLibsDir;
++        m_currentEncoderFFmpegVersion = encoderInfo.ffmpegVersion;
++
++        if (persistRequestedPath) {
++            const std::optional<io::path_t> pathToPersist = configuredPathToPersist(ffmpegLibsDir, paths);
++            if (pathToPersist.has_value()) {
++                configuration()->setFFmpegLibsDir(pathToPersist.value());
++            }
++        }
+ 
+-    configuration()->setFFmpegLibsDir(encoderInfo.ffmpegLibsDir);
++        m_loadedFFmpegChanged.notify();
++        return;
++    }
+ 
+-    m_currentEncoderFFmpegVersion = encoderInfo.ffmpegVersion;
+-    m_loadedFFmpegChanged.notify();
++    if (persistRequestedPath && ffmpegLibsDir.empty()) {
++        configuration()->setFFmpegLibsDir({});
++    }
++    resetFFmpegSettings();
+ }
+ 
+ void VideoEncoderResolver::setIsSettingMode(bool arg)
+@@ -112,7 +126,7 @@ void VideoEncoderResolver::startWatching
+ 
+ muse::io::path_t VideoEncoderResolver::loadedFFmpegDir() const
+ {
+-    return configuration()->ffmpegLibsDir();
++    return m_loadedFFmpegDir;
+ }
+ 
+ FFmpegVersion VideoEncoderResolver::loadedFFmpegVersion() const
+@@ -137,8 +151,9 @@ void VideoEncoderResolver::setCurrentVid
+ 
+ void VideoEncoderResolver::resetFFmpegSettings()
+ {
++    setCurrentVideoEncoder(nullptr);
+     m_currentEncoderFFmpegVersion = FFMPEG_INVALID_VERSION;
+-    configuration()->setFFmpegLibsDir({});
++    m_loadedFFmpegDir = io::path_t();
+ 
+     m_loadedFFmpegChanged.notify();
+ }
+@@ -157,8 +172,11 @@ VideoEncoderResolver::EncoderInfo VideoE
+ {
+     EncoderInfo result;
+ 
+-    const FFmpegVersion version = versionFromAVFormatPath(ffmpegLibsPaths.avFormatPath);
++    const FFmpegVersion version = ffmpegLibsPaths.ffmpegVersion;
+     switch (version) {
++    case FFMPEG_V9:
++        result.encoder = tryCreateEncoder<ffmpeg::v9::VideoEncoder>(ffmpegLibsPaths);
++        break;
+     case FFMPEG_V8:
+         result.encoder = tryCreateEncoder<ffmpeg::v8::VideoEncoder>(ffmpegLibsPaths);
+         break;
+@@ -179,7 +197,7 @@ VideoEncoderResolver::EncoderInfo VideoE
+     }
+ 
+     if (result.encoder) {
+-        result.ffmpegLibsDir = io::dirpath(ffmpegLibsPaths.avFormatPath);
++        result.ffmpegLibsDir = ffmpegLibsPaths.searchDir;
+         result.ffmpegVersion = version;
+ 
+         LOGD() << "FFmpeg loaded, version: " << version;
+diff -up MuseScore-4.7.4/src/framework/media/internal/videoencoderresolver.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/internal/videoencoderresolver.h
+--- MuseScore-4.7.4/src/framework/media/internal/videoencoderresolver.h.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/internal/videoencoderresolver.h	2026-09-07 12:23:47.681391345 +0200
+@@ -55,6 +55,7 @@ public:
+     void setIsSettingMode(bool arg) override;
+ 
+ private:
++    void loadFFmpeg(const muse::io::path_t& ffmpegLibsDir, bool persistRequestedPath);
+     void resetFFmpegSettings();
+     void startWatchingFfmpegsDirs();
+ 
+@@ -68,6 +69,7 @@ private:
+ 
+     IVideoEncoderPtr m_encoder;
+     FFmpegVersion m_currentEncoderFFmpegVersion = FFMPEG_INVALID_VERSION;
++    io::path_t m_loadedFFmpegDir;
+ 
+     async::Notification m_loadedFFmpegChanged;
+ 
+diff -up MuseScore-4.7.4/src/framework/media/tests/CMakeLists.txt.ffmpeg9 MuseScore-4.7.4/src/framework/media/tests/CMakeLists.txt
+--- MuseScore-4.7.4/src/framework/media/tests/CMakeLists.txt.ffmpeg9	2026-09-07 12:23:47.680860293 +0200
++++ MuseScore-4.7.4/src/framework/media/tests/CMakeLists.txt	2026-09-07 12:23:47.680856780 +0200
+@@ -0,0 +1,31 @@
++# SPDX-License-Identifier: GPL-3.0-only
++# MuseScore-Studio-CLA-applies
++#
++# MuseScore Studio
++# Music Composition & Notation
++#
++# Copyright (C) 2026 MuseScore Limited
++#
++# This program is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License version 3 as
++# published by the Free Software Foundation.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program.  If not, see <https://www.gnu.org/licenses/>.
++
++set(MODULE_TEST muse_media_tests)
++
++set(MODULE_TEST_SRC
++    ${CMAKE_CURRENT_LIST_DIR}/ffmpegutils_tests.cpp
++)
++
++set(MODULE_TEST_LINK
++    muse::media
++)
++
++include(SetupGTest)
+diff -up MuseScore-4.7.4/src/framework/media/tests/ffmpegutils_tests.cpp.ffmpeg9 MuseScore-4.7.4/src/framework/media/tests/ffmpegutils_tests.cpp
+--- MuseScore-4.7.4/src/framework/media/tests/ffmpegutils_tests.cpp.ffmpeg9	2026-09-07 12:23:47.680939935 +0200
++++ MuseScore-4.7.4/src/framework/media/tests/ffmpegutils_tests.cpp	2026-09-07 12:23:47.681438513 +0200
+@@ -0,0 +1,201 @@
++/*
++ * SPDX-License-Identifier: GPL-3.0-only
++ * MuseScore-Studio-CLA-applies
++ *
++ * MuseScore Studio
++ * Music Composition & Notation
++ *
++ * Copyright (C) 2026 MuseScore Limited
++ *
++ * This program is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 3 as
++ * published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
++ */
++
++#include <gtest/gtest.h>
++
++#include <algorithm>
++
++#include <QDir>
++#include <QFile>
++#include <QFileInfo>
++#include <QTemporaryDir>
++
++#include "media/internal/ffmpegutils.h"
++
++using namespace muse;
++using namespace muse::media;
++
++namespace {
++QString libraryFileName(const QString& component, int version)
++{
++#if defined(Q_OS_MAC)
++    return QStringLiteral("lib%1.%2.dylib").arg(component).arg(version);
++#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
++    return QStringLiteral("lib%1.so.%2").arg(component).arg(version);
++#elif defined(Q_OS_WIN)
++    return QStringLiteral("%1-%2.dll").arg(component).arg(version);
++#endif
++}
++
++void createFile(const QString& path)
++{
++    QFile file(path);
++    ASSERT_TRUE(file.open(QIODevice::WriteOnly));
++    file.close();
++}
++
++void createLibraries(const QString& dirPath, FFmpegVersion version, bool complete = true)
++{
++    ASSERT_TRUE(QDir().mkpath(dirPath));
++
++    const auto versionIt = std::find_if(FFMPEG_COMPONENTS_VERSIONS.cbegin(), FFMPEG_COMPONENTS_VERSIONS.cend(),
++                                        [version](const auto& item) { return item.first == version; });
++    ASSERT_NE(versionIt, FFMPEG_COMPONENTS_VERSIONS.cend());
++
++    const FFmpegVersionInfo& components = versionIt->second;
++    const QDir dir(dirPath);
++    createFile(dir.filePath(libraryFileName(QStringLiteral("avutil"), components.avUtilVersion)));
++    createFile(dir.filePath(libraryFileName(QStringLiteral("avcodec"), components.avCodecVersion)));
++    createFile(dir.filePath(libraryFileName(QStringLiteral("avformat"), components.avFormatVersion)));
++    createFile(dir.filePath(libraryFileName(QStringLiteral("swscale"), components.swScaleVersion)));
++    if (complete) {
++        createFile(dir.filePath(libraryFileName(QStringLiteral("swresample"), components.swResampleVersion)));
++    }
++}
++
++QString canonicalPath(const QString& path)
++{
++    return QFileInfo(path).canonicalFilePath();
++}
++}
++
++TEST(FFmpegUtilsTests, RecognizesFFmpeg9FromAVFormatPath)
++{
++    const QString fileName = libraryFileName(QStringLiteral("avformat"), 63);
++    EXPECT_EQ(versionFromAVFormatPath(io::path_t(fileName)), FFMPEG_V9);
++}
++
++TEST(FFmpegUtilsTests, AutomaticCandidatesPreferNewestVersion)
++{
++    QTemporaryDir tempDir;
++    ASSERT_TRUE(tempDir.isValid());
++    const QString ffmpeg8Dir = tempDir.filePath(QStringLiteral("ffmpeg8"));
++    const QString ffmpeg9Dir = tempDir.filePath(QStringLiteral("ffmpeg9"));
++    createLibraries(ffmpeg8Dir, FFMPEG_V8);
++    createLibraries(ffmpeg9Dir, FFMPEG_V9);
++
++    const FFmpegLibPathsList candidates = findLibraryPaths({}, { io::path_t(ffmpeg8Dir), io::path_t(ffmpeg9Dir) });
++
++    ASSERT_EQ(candidates.size(), 2u);
++    EXPECT_EQ(candidates[0].ffmpegVersion, FFMPEG_V9);
++    EXPECT_EQ(candidates[0].origin, FFmpegCandidateOrigin::Automatic);
++    EXPECT_EQ(candidates[1].ffmpegVersion, FFMPEG_V8);
++    EXPECT_EQ(candidates[1].origin, FFmpegCandidateOrigin::Automatic);
++}
++
++TEST(FFmpegUtilsTests, CustomPathRetainsPriority)
++{
++    QTemporaryDir tempDir;
++    ASSERT_TRUE(tempDir.isValid());
++    const QString customDir = tempDir.filePath(QStringLiteral("custom"));
++    const QString automaticDir = tempDir.filePath(QStringLiteral("automatic"));
++    createLibraries(customDir, FFMPEG_V8);
++    createLibraries(automaticDir, FFMPEG_V9);
++
++    const FFmpegLibPathsList candidates = findLibraryPaths(io::path_t(customDir), { io::path_t(automaticDir) });
++
++    ASSERT_EQ(candidates.size(), 2u);
++    EXPECT_EQ(candidates[0].ffmpegVersion, FFMPEG_V8);
++    EXPECT_EQ(candidates[0].origin, FFmpegCandidateOrigin::Configured);
++    EXPECT_EQ(candidates[0].searchDir.toQString(), canonicalPath(customDir));
++    EXPECT_EQ(candidates[1].ffmpegVersion, FFMPEG_V9);
++    EXPECT_EQ(candidates[1].origin, FFmpegCandidateOrigin::Automatic);
++}
++
++TEST(FFmpegUtilsTests, RegisteredConfiguredPathRemainsAutomatic)
++{
++    QTemporaryDir tempDir;
++    ASSERT_TRUE(tempDir.isValid());
++    const QString ffmpeg8Dir = tempDir.filePath(QStringLiteral("ffmpeg8"));
++    const QString ffmpeg9Dir = tempDir.filePath(QStringLiteral("ffmpeg9"));
++    createLibraries(ffmpeg8Dir, FFMPEG_V8);
++    createLibraries(ffmpeg9Dir, FFMPEG_V9);
++
++    const FFmpegLibPathsList candidates = findLibraryPaths(io::path_t(ffmpeg8Dir),
++                                                           { io::path_t(ffmpeg8Dir), io::path_t(ffmpeg9Dir) });
++
++    ASSERT_EQ(candidates.size(), 2u);
++    EXPECT_EQ(candidates[0].ffmpegVersion, FFMPEG_V9);
++    EXPECT_EQ(candidates[0].origin, FFmpegCandidateOrigin::Automatic);
++    EXPECT_EQ(candidates[1].ffmpegVersion, FFMPEG_V8);
++    EXPECT_EQ(candidates[1].origin, FFmpegCandidateOrigin::Automatic);
++}
++
++TEST(FFmpegUtilsTests, IncompleteCandidateIsSkipped)
++{
++    QTemporaryDir tempDir;
++    ASSERT_TRUE(tempDir.isValid());
++    const QString incompleteDir = tempDir.filePath(QStringLiteral("incomplete"));
++    const QString completeDir = tempDir.filePath(QStringLiteral("complete"));
++    createLibraries(incompleteDir, FFMPEG_V9, false);
++    createLibraries(completeDir, FFMPEG_V8);
++
++    const FFmpegLibPathsList candidates = findLibraryPaths({}, { io::path_t(incompleteDir), io::path_t(completeDir) });
++
++    ASSERT_EQ(candidates.size(), 1u);
++    EXPECT_EQ(candidates[0].ffmpegVersion, FFMPEG_V8);
++}
++
++TEST(FFmpegUtilsTests, SameVersionCandidatesUseStablePathOrder)
++{
++    QTemporaryDir tempDir;
++    ASSERT_TRUE(tempDir.isValid());
++    const QString secondDir = tempDir.filePath(QStringLiteral("z-provider"));
++    const QString firstDir = tempDir.filePath(QStringLiteral("a-provider"));
++    createLibraries(secondDir, FFMPEG_V9);
++    createLibraries(firstDir, FFMPEG_V9);
++
++    const FFmpegLibPathsList candidates = findLibraryPaths({}, { io::path_t(secondDir), io::path_t(firstDir) });
++
++    ASSERT_EQ(candidates.size(), 2u);
++    EXPECT_EQ(candidates[0].searchDir.toQString(), canonicalPath(firstDir));
++    EXPECT_EQ(candidates[1].searchDir.toQString(), canonicalPath(secondDir));
++}
++
++TEST(FFmpegUtilsTests, PersistsOnlyRequestedLoadedPath)
++{
++    QTemporaryDir tempDir;
++    ASSERT_TRUE(tempDir.isValid());
++    const QString requestedDir = tempDir.filePath(QStringLiteral("requested"));
++    const QString fallbackDir = tempDir.filePath(QStringLiteral("fallback"));
++    createLibraries(requestedDir, FFMPEG_V8);
++    createLibraries(fallbackDir, FFMPEG_V9);
++
++    const FFmpegLibPathsList candidates = findLibraryPaths(io::path_t(requestedDir), { io::path_t(fallbackDir) });
++    ASSERT_EQ(candidates.size(), 2u);
++
++    const std::optional<io::path_t> requestedUpdate = configuredPathToPersist(io::path_t(requestedDir), candidates[0]);
++    ASSERT_TRUE(requestedUpdate.has_value());
++    EXPECT_EQ(requestedUpdate->toQString(), canonicalPath(requestedDir));
++
++    EXPECT_FALSE(configuredPathToPersist(io::path_t(requestedDir), candidates[1]).has_value());
++}
++
++TEST(FFmpegUtilsTests, EmptyRequestedPathClearsConfiguration)
++{
++    FFmpegLibPaths automaticCandidate;
++    automaticCandidate.searchDir = io::path_t("/automatic");
++
++    const std::optional<io::path_t> update = configuredPathToPersist({}, automaticCandidate);
++    ASSERT_TRUE(update.has_value());
++    EXPECT_TRUE(update->empty());
++}
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/download_ffmpeg_headers.sh.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/download_ffmpeg_headers.sh
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/download_ffmpeg_headers.sh.ffmpeg9	2026-07-06 09:52:32.000000000 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/download_ffmpeg_headers.sh	2026-09-07 12:23:47.669547107 +0200
+@@ -1,5 +1,5 @@
+ #!/bin/bash
+-# Download FFmpeg headers for MuseScore (versions 4, 5, 6, 7, 8)
++# Download FFmpeg headers for MuseScore (versions 4, 5, 6, 7, 8, 9)
+ # Run from MuseScore repository root
+ set -e
+ 
+@@ -14,6 +14,7 @@ VERSIONS=(
+   "6:n6.1"
+   "7:n7.0"
+   "8:n8.0"
++  "9:n9.0"
+ )
+ 
+ write_avconfig() {
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/avcodec.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/avcodec.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/avcodec.h.ffmpeg9	2026-09-07 12:23:47.672034725 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/avcodec.h	2026-09-07 12:23:47.671547119 +0200
+@@ -0,0 +1,2961 @@
++/*
++ * copyright (c) 2001 Fabrice Bellard
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVCODEC_AVCODEC_H
++#define AVCODEC_AVCODEC_H
++
++/**
++ * @file
++ * @ingroup libavc
++ * Libavcodec external API header
++ */
++
++#include "libavutil/samplefmt.h"
++#include "libavutil/attributes.h"
++#include "libavutil/avutil.h"
++#include "libavutil/buffer.h"
++#include "libavutil/channel_layout.h"
++#include "libavutil/dict.h"
++#include "libavutil/frame.h"
++#include "libavutil/log.h"
++#include "libavutil/pixfmt.h"
++#include "libavutil/rational.h"
++
++#include "codec.h"
++#include "codec_id.h"
++#include "defs.h"
++#include "packet.h"
++#include "version_major.h"
++#ifndef HAVE_AV_CONFIG_H
++/* When included as part of the ffmpeg build, only include the major version
++ * to avoid unnecessary rebuilds. When included externally, keep including
++ * the full version information. */
++#include "version.h"
++
++#include "codec_desc.h"
++#include "codec_par.h"
++#endif
++
++struct AVCodecParameters;
++
++/**
++ * @defgroup libavc libavcodec
++ * Encoding/Decoding Library
++ *
++ * @{
++ *
++ * @defgroup lavc_decoding Decoding
++ * @{
++ * @}
++ *
++ * @defgroup lavc_encoding Encoding
++ * @{
++ * @}
++ *
++ * @defgroup lavc_codec Codecs
++ * @{
++ * @defgroup lavc_codec_native Native Codecs
++ * @{
++ * @}
++ * @defgroup lavc_codec_wrappers External library wrappers
++ * @{
++ * @}
++ * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge
++ * @{
++ * @}
++ * @}
++ * @defgroup lavc_internal Internal
++ * @{
++ * @}
++ * @}
++ */
++
++/**
++ * @ingroup libavc
++ * @defgroup lavc_encdec send/receive encoding and decoding API overview
++ * @{
++ *
++ * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/
++ * avcodec_receive_packet() functions provide an encode/decode API, which
++ * decouples input and output.
++ *
++ * The API is very similar for encoding/decoding and audio/video, and works as
++ * follows:
++ * - Set up and open the AVCodecContext as usual.
++ * - Send valid input:
++ *   - For decoding, call avcodec_send_packet() to give the decoder raw
++ *     compressed data in an AVPacket.
++ *   - For encoding, call avcodec_send_frame() to give the encoder an AVFrame
++ *     containing uncompressed audio or video.
++ *
++ *   In both cases, it is recommended that AVPackets and AVFrames are
++ *   refcounted, or libavcodec might have to copy the input data. (libavformat
++ *   always returns refcounted AVPackets, and av_frame_get_buffer() allocates
++ *   refcounted AVFrames.)
++ * - Receive output in a loop. Periodically call one of the avcodec_receive_*()
++ *   functions and process their output:
++ *   - For decoding, call avcodec_receive_frame(). On success, it will return
++ *     an AVFrame containing uncompressed audio or video data.
++ *   - For encoding, call avcodec_receive_packet(). On success, it will return
++ *     an AVPacket with a compressed frame.
++ *
++ *   Repeat this call until it returns AVERROR(EAGAIN) or an error. The
++ *   AVERROR(EAGAIN) return value means that new input data is required to
++ *   return new output. In this case, continue with sending input. For each
++ *   input frame/packet, the codec will typically return 1 output frame/packet,
++ *   but it can also be 0 or more than 1.
++ *
++ * At the beginning of decoding or encoding, the codec might accept multiple
++ * input frames/packets without returning a frame, until its internal buffers
++ * are filled. This situation is handled transparently if you follow the steps
++ * outlined above.
++ *
++ * In theory, sending input can result in EAGAIN - this should happen only if
++ * not all output was received. You can use this to structure alternative decode
++ * or encode loops other than the one suggested above. For example, you could
++ * try sending new input on each iteration, and try to receive output if that
++ * returns EAGAIN.
++ *
++ * End of stream situations. These require "flushing" (aka draining) the codec,
++ * as the codec might buffer multiple frames or packets internally for
++ * performance or out of necessity (consider B-frames).
++ * This is handled as follows:
++ * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding)
++ *   or avcodec_send_frame() (encoding) functions. This will enter draining
++ *   mode.
++ * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet()
++ *   (encoding) in a loop until AVERROR_EOF is returned. The functions will
++ *   not return AVERROR(EAGAIN), unless you forgot to enter draining mode.
++ * - Before decoding can be resumed again, the codec has to be reset with
++ *   avcodec_flush_buffers().
++ *
++ * Using the API as outlined above is highly recommended. But it is also
++ * possible to call functions outside of this rigid schema. For example, you can
++ * call avcodec_send_packet() repeatedly without calling
++ * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed
++ * until the codec's internal buffer has been filled up (which is typically of
++ * size 1 per output frame, after initial input), and then reject input with
++ * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to
++ * read at least some output.
++ *
++ * Not all codecs will follow a rigid and predictable dataflow; the only
++ * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on
++ * one end implies that a receive/send call on the other end will succeed, or
++ * at least will not fail with AVERROR(EAGAIN). In general, no codec will
++ * permit unlimited buffering of input or output.
++ *
++ * A codec is not allowed to return AVERROR(EAGAIN) for both sending and receiving. This
++ * would be an invalid state, which could put the codec user into an endless
++ * loop. The API has no concept of time either: it cannot happen that trying to
++ * do avcodec_send_packet() results in AVERROR(EAGAIN), but a repeated call 1 second
++ * later accepts the packet (with no other receive/flush API calls involved).
++ * The API is a strict state machine, and the passage of time is not supposed
++ * to influence it. Some timing-dependent behavior might still be deemed
++ * acceptable in certain cases. But it must never result in both send/receive
++ * returning EAGAIN at the same time at any point. It must also absolutely be
++ * avoided that the current state is "unstable" and can "flip-flop" between
++ * the send/receive APIs allowing progress. For example, it's not allowed that
++ * the codec randomly decides that it actually wants to consume a packet now
++ * instead of returning a frame, after it just returned AVERROR(EAGAIN) on an
++ * avcodec_send_packet() call.
++ * @}
++ */
++
++/**
++ * @defgroup lavc_core Core functions/structures.
++ * @ingroup libavc
++ *
++ * Basic definitions, functions for querying libavcodec capabilities,
++ * allocating core structures, etc.
++ * @{
++ */
++
++/**
++ * @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)
++/**
++ * Request the encoder to output reconstructed frames, i.e.\ frames that would
++ * be produced by decoding the encoded bitstream. These frames may be retrieved
++ * by calling avcodec_receive_frame() immediately after a successful call to
++ * avcodec_receive_packet().
++ *
++ * Should only be used with encoders flagged with the
++ * @ref AV_CODEC_CAP_ENCODER_RECON_FRAME capability.
++ *
++ * @note
++ * Each reconstructed frame returned by the encoder corresponds to the last
++ * encoded packet, i.e. the frames are returned in coded order rather than
++ * presentation order.
++ *
++ * @note
++ * Frame parameters (like pixel format or dimensions) do not have to match the
++ * AVCodecContext values. Make sure to use the values from the returned frame.
++ */
++#define AV_CODEC_FLAG_RECON_FRAME     (1 <<  6)
++/**
++ * @par decoding
++ * Request the decoder to propagate each packet's AVPacket.opaque and
++ * AVPacket.opaque_ref to its corresponding output AVFrame.
++ *
++ * @par encoding:
++ * Request the encoder to propagate each frame's AVFrame.opaque and
++ * AVFrame.opaque_ref values to its corresponding output AVPacket.
++ *
++ * @par
++ * May only be set on encoders that have the
++ * @ref AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability flag.
++ *
++ * @note
++ * While in typical cases one input frame produces exactly one output packet
++ * (perhaps after a delay), in general the mapping of frames to packets is
++ * M-to-N, so
++ * - Any number of input frames may be associated with any given output packet.
++ *   This includes zero - e.g. some encoders may output packets that carry only
++ *   metadata about the whole stream.
++ * - A given input frame may be associated with any number of output packets.
++ *   Again this includes zero - e.g. some encoders may drop frames under certain
++ *   conditions.
++ * .
++ * This implies that when using this flag, the caller must NOT assume that
++ * - a given input frame's opaques will necessarily appear on some output packet;
++ * - every output packet will have some non-NULL opaque value.
++ * .
++ * When an output packet contains multiple frames, the opaque values will be
++ * taken from the first of those.
++ *
++ * @note
++ * The converse holds for decoders, with frames and packets switched.
++ */
++#define AV_CODEC_FLAG_COPY_OPAQUE     (1 <<  7)
++/**
++ * Signal to the encoder that the values of AVFrame.duration are valid and
++ * should be used (typically for transferring them to output packets).
++ *
++ * If this flag is not set, frame durations are ignored.
++ */
++#define AV_CODEC_FLAG_FRAME_DURATION  (1 <<  8)
++/**
++ * Use internal 2pass ratecontrol in first pass mode.
++ */
++#define AV_CODEC_FLAG_PASS1           (1 <<  9)
++/**
++ * Use internal 2pass ratecontrol in second pass mode.
++ */
++#define AV_CODEC_FLAG_PASS2           (1 << 10)
++/**
++ * loop filter.
++ */
++#define AV_CODEC_FLAG_LOOP_FILTER     (1 << 11)
++/**
++ * Only decode/encode grayscale.
++ */
++#define AV_CODEC_FLAG_GRAY            (1 << 13)
++/**
++ * error[?] variables will be set during encoding.
++ */
++#define AV_CODEC_FLAG_PSNR            (1 << 15)
++/**
++ * Use interlaced DCT.
++ */
++#define AV_CODEC_FLAG_INTERLACED_DCT  (1 << 18)
++/**
++ * Force low delay.
++ */
++#define AV_CODEC_FLAG_LOW_DELAY       (1 << 19)
++/**
++ * Place global headers in extradata instead of every keyframe.
++ */
++#define AV_CODEC_FLAG_GLOBAL_HEADER   (1 << 22)
++/**
++ * Use only bitexact stuff (except (I)DCT).
++ */
++#define AV_CODEC_FLAG_BITEXACT        (1 << 23)
++/* Fx : Flag for H.263+ extra options */
++/**
++ * H.263 advanced intra coding / MPEG-4 AC prediction
++ */
++#define AV_CODEC_FLAG_AC_PRED         (1 << 24)
++/**
++ * interlaced motion estimation
++ */
++#define AV_CODEC_FLAG_INTERLACED_ME   (1 << 29)
++#define AV_CODEC_FLAG_CLOSED_GOP      (1U << 31)
++
++/**
++ * Allow non spec compliant speedup tricks.
++ */
++#define AV_CODEC_FLAG2_FAST           (1 <<  0)
++/**
++ * Skip bitstream encoding.
++ */
++#define AV_CODEC_FLAG2_NO_OUTPUT      (1 <<  2)
++/**
++ * Place global headers at every keyframe instead of in extradata.
++ */
++#define AV_CODEC_FLAG2_LOCAL_HEADER   (1 <<  3)
++
++/**
++ * Input bitstream might be truncated at a packet boundaries
++ * instead of only at frame boundaries.
++ */
++#define AV_CODEC_FLAG2_CHUNKS         (1 << 15)
++/**
++ * Discard cropping information from SPS.
++ */
++#define AV_CODEC_FLAG2_IGNORE_CROP    (1 << 16)
++/**
++ * Force audio encoders to use a fixed frame size.
++ */
++#define AV_CODEC_FLAG2_FIXED_FRAME_SIZE (1 << 17)
++
++/**
++ * 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)
++
++/**
++ * Decoding only.
++ * Do not apply picture enhancement layers, export them instead.
++ */
++#define AV_CODEC_EXPORT_DATA_ENHANCEMENTS (1 << 4)
++
++/**
++ * 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)
++
++/**
++ * The decoder will bypass frame threading and return the next frame as soon as
++ * possible. Note that this may deliver frames earlier than the advertised
++ * `AVCodecContext.delay`. No effect when frame threading is disabled, or on
++ * encoding.
++ */
++#define AV_CODEC_RECEIVE_FRAME_FLAG_SYNCHRONOUS (1 << 0)
++
++/**
++ * main external API structure.
++ * New fields can be added to the end with minor version bumps.
++ * Removal, reordering and changes to existing fields require a major
++ * version bump.
++ * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user
++ * applications.
++ * The name string for AVOptions options matches the associated command line
++ * parameter name and can be found in libavcodec/options_table.h
++ * The AVOption/command line parameter names differ in some cases from the C
++ * structure field names for historic reasons or brevity.
++ * sizeof(AVCodecContext) must not be used outside libav*.
++ */
++typedef struct AVCodecContext {
++    /**
++     * information on struct for av_log
++     * - set by avcodec_alloc_context3
++     */
++    const AVClass *av_class;
++    int log_level_offset;
++
++    enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */
++    const struct AVCodec  *codec;
++    enum AVCodecID     codec_id; /* see AV_CODEC_ID_xxx */
++
++    /**
++     * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
++     * This is used to work around some encoder bugs.
++     * A demuxer should set this to what is stored in the field used to identify the codec.
++     * If there are multiple such fields in a container then the demuxer should choose the one
++     * which maximizes the information about the used codec.
++     * If the codec tag field in a container is larger than 32 bits then the demuxer should
++     * remap the longer ID to 32 bits with a table or other structure. Alternatively a new
++     * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated
++     * first.
++     * - encoding: Set by user, if not then the default based on codec_id will be used.
++     * - decoding: Set by user, will be converted to uppercase by libavcodec during init.
++     */
++    unsigned int codec_tag;
++
++    void *priv_data;
++
++    /**
++     * Private context used for internal data.
++     *
++     * Unlike priv_data, this is not codec-specific. It is used in general
++     * libavcodec functions.
++     */
++    struct AVCodecInternal *internal;
++
++    /**
++     * Private data of the user, can be used to carry app specific stuff.
++     * - encoding: Set by user.
++     * - decoding: Set by user.
++     */
++    void *opaque;
++
++    /**
++     * the average bitrate
++     * - encoding: Set by user; unused for constant quantizer encoding.
++     * - decoding: Set by user, may be overwritten by libavcodec
++     *             if this info is available in the stream
++     */
++    int64_t bit_rate;
++
++    /**
++     * AV_CODEC_FLAG_*.
++     * - encoding: Set by user.
++     * - decoding: Set by user.
++     */
++    int flags;
++
++    /**
++     * AV_CODEC_FLAG2_*
++     * - encoding: Set by user.
++     * - decoding: Set by user.
++     */
++    int flags2;
++
++    /**
++     * Out-of-band global headers that may be used by some codecs.
++     *
++     * - decoding: Should be set by the caller when available (typically from a
++     *   demuxer) before opening the decoder; some decoders require this to be
++     *   set and will fail to initialize otherwise.
++     *
++     *   The array must be allocated with the av_malloc() family of functions;
++     *   allocated size must be at least AV_INPUT_BUFFER_PADDING_SIZE bytes
++     *   larger than extradata_size.
++     *
++     * - encoding: May be set by the encoder in avcodec_open2() (possibly
++     *   depending on whether the AV_CODEC_FLAG_GLOBAL_HEADER flag is set).
++     *
++     * After being set, the array is owned by the codec and freed in
++     * avcodec_free_context().
++     */
++    uint8_t *extradata;
++    int extradata_size;
++
++    /**
++     * This is the fundamental unit of time (in seconds) in terms
++     * of which frame timestamps are represented. For fixed-fps content,
++     * timebase should be 1/framerate and timestamp increments should be
++     * identically 1.
++     * This often, but not always is the inverse of the frame rate or field rate
++     * for video. 1/time_base is not the average frame rate if the frame rate is not
++     * constant.
++     *
++     * Like containers, elementary streams also can store timestamps, 1/time_base
++     * is the unit in which these timestamps are specified.
++     * As example of such codec time base see ISO/IEC 14496-2:2001(E)
++     * vop_time_increment_resolution and fixed_vop_rate
++     * (fixed_vop_rate == 0 implies that it is different from the framerate)
++     *
++     * - encoding: MUST be set by user.
++     * - decoding: unused.
++     */
++    AVRational time_base;
++
++    /**
++     * Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
++     * - encoding: unused.
++     * - decoding: set by user.
++     */
++    AVRational pkt_timebase;
++
++    /**
++     * - decoding: For codecs that store a framerate value in the compressed
++     *             bitstream, the decoder may export it here. { 0, 1} when
++     *             unknown.
++     * - encoding: May be used to signal the framerate of CFR content to an
++     *             encoder.
++     */
++    AVRational framerate;
++
++    /**
++     * Codec delay.
++     *
++     * Encoding: Number of frames delay there will be from the encoder input to
++     *           the decoder output. (we assume the decoder matches the spec)
++     * Decoding: Number of frames delay in addition to what a standard decoder
++     *           as specified in the spec would produce.
++     *
++     * Video:
++     *   Number of frames the decoded output will be delayed relative to the
++     *   encoded input.
++     *
++     * Audio:
++     *   For encoding, this field is unused (see initial_padding).
++     *
++     *   For decoding, this is the number of samples the decoder needs to
++     *   output before the decoder's output is valid. When seeking, you should
++     *   start decoding this many samples prior to your desired seek point.
++     *
++     * - encoding: Set by libavcodec.
++     * - decoding: Set by libavcodec.
++     */
++    int delay;
++
++
++    /* video only */
++    /**
++     * picture width / height.
++     *
++     * @note Those fields may not match the values of the last
++     * AVFrame output by avcodec_receive_frame() due frame
++     * reordering.
++     *
++     * - encoding: MUST be set by user.
++     * - decoding: May be set by the user before opening the decoder if known e.g.
++     *             from the container. Some decoders will require the dimensions
++     *             to be set by the caller. During decoding, the decoder may
++     *             overwrite those values as required while parsing the data.
++     */
++    int width, height;
++
++    /**
++     * Bitstream width / height, may be different from width/height e.g. when
++     * the decoded frame is cropped before being output or lowres is enabled.
++     *
++     * @note Those field may not match the value of the last
++     * AVFrame output by avcodec_receive_frame() due frame
++     * reordering.
++     *
++     * - encoding: unused
++     * - decoding: May be set by the user before opening the decoder if known
++     *             e.g. from the container. During decoding, the decoder may
++     *             overwrite those values as required while parsing the data.
++     */
++    int coded_width, coded_height;
++
++    /**
++     * sample aspect ratio (0 if unknown)
++     * That is the width of a pixel divided by the height of the pixel.
++     * Numerator and denominator must be relatively prime and smaller than 256 for some video standards.
++     * - encoding: Set by user.
++     * - decoding: Set by libavcodec.
++     */
++    AVRational sample_aspect_ratio;
++
++    /**
++     * Pixel format, see AV_PIX_FMT_xxx.
++     * May be set by the demuxer if known from headers.
++     * May be overridden by the decoder if it knows better.
++     *
++     * @note This field may not match the value of the last
++     * AVFrame output by avcodec_receive_frame() due frame
++     * reordering.
++     *
++     * - encoding: Set by user.
++     * - decoding: Set by user if known, overridden by libavcodec while
++     *             parsing the data.
++     */
++    enum AVPixelFormat pix_fmt;
++
++    /**
++     * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
++     * - encoding: unused.
++     * - decoding: Set by libavcodec before calling get_format()
++     */
++    enum AVPixelFormat sw_pix_fmt;
++
++    /**
++     * Chromaticity coordinates of the source primaries.
++     * - encoding: Set by user
++     * - decoding: Set by libavcodec
++     */
++    enum AVColorPrimaries color_primaries;
++
++    /**
++     * Color Transfer Characteristic.
++     * - encoding: Set by user
++     * - decoding: Set by libavcodec
++     */
++    enum AVColorTransferCharacteristic color_trc;
++
++    /**
++     * YUV colorspace type.
++     * - encoding: Set by user
++     * - decoding: Set by libavcodec
++     */
++    enum AVColorSpace colorspace;
++
++    /**
++     * MPEG vs JPEG YUV range.
++     * - encoding: Set by user to override the default output color range value,
++     *   If not specified, libavcodec sets the color range depending on the
++     *   output format.
++     * - decoding: Set by libavcodec, can be set by the user to propagate the
++     *   color range to components reading from the decoder context.
++     */
++    enum AVColorRange color_range;
++
++    /**
++     * This defines the location of chroma samples.
++     * - encoding: Set by user
++     * - decoding: Set by libavcodec
++     */
++    enum AVChromaLocation chroma_sample_location;
++
++    /** Field order
++     * - encoding: set by libavcodec
++     * - decoding: Set by user.
++     */
++    enum AVFieldOrder field_order;
++
++    /**
++     * number of reference frames
++     * - encoding: Set by user.
++     * - decoding: Set by lavc.
++     */
++    int refs;
++
++    /**
++     * Size of the frame reordering buffer in the decoder.
++     * For MPEG-2 it is 1 IPB or 0 low delay IP.
++     * - encoding: Set by libavcodec.
++     * - decoding: Set by libavcodec.
++     */
++    int has_b_frames;
++
++    /**
++     * slice flags
++     * - encoding: unused
++     * - decoding: Set by user.
++     */
++    int slice_flags;
++#define SLICE_FLAG_CODED_ORDER    0x0001 ///< draw_horiz_band() is called in coded order instead of display
++#define SLICE_FLAG_ALLOW_FIELD    0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics)
++#define SLICE_FLAG_ALLOW_PLANE    0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1)
++
++    /**
++     * If non NULL, 'draw_horiz_band' is called by the libavcodec
++     * decoder to draw a horizontal band. It improves cache usage. Not
++     * all codecs can do that. You must check the codec capabilities
++     * beforehand.
++     * When multithreading is used, it may be called from multiple threads
++     * at the same time; threads might draw different parts of the same AVFrame,
++     * or multiple AVFrames, and there is no guarantee that slices will be drawn
++     * in order.
++     * The function is also used by hardware acceleration APIs.
++     * It is called at least once during frame decoding to pass
++     * the data needed for hardware render.
++     * In that mode instead of pixel data, AVFrame points to
++     * a structure specific to the acceleration API. The application
++     * reads the structure and can change some fields to indicate progress
++     * or mark state.
++     * - encoding: unused
++     * - decoding: Set by user.
++     * @param height the height of the slice
++     * @param y the y position of the slice
++     * @param type 1->top field, 2->bottom field, 3->frame
++     * @param offset offset into the AVFrame.data from which the slice should be read
++     */
++    void (*draw_horiz_band)(struct AVCodecContext *s,
++                            const AVFrame *src, int offset[AV_NUM_DATA_POINTERS],
++                            int y, int type, int height);
++
++    /**
++     * Callback to negotiate the pixel format. Decoding only, may be set by the
++     * caller before avcodec_open2().
++     *
++     * Called by some decoders to select the pixel format that will be used for
++     * the output frames. This is mainly used to set up hardware acceleration,
++     * then the provided format list contains the corresponding hwaccel pixel
++     * formats alongside the "software" one. The software pixel format may also
++     * be retrieved from \ref sw_pix_fmt.
++     *
++     * This callback will be called when the coded frame properties (such as
++     * resolution, pixel format, etc.) change and more than one output format is
++     * supported for those new properties. If a hardware pixel format is chosen
++     * and initialization for it fails, the callback may be called again
++     * immediately.
++     *
++     * This callback may be called from different threads if the decoder is
++     * multi-threaded, but not from more than one thread simultaneously.
++     *
++     * @param fmt list of formats which may be used in the current
++     *            configuration, terminated by AV_PIX_FMT_NONE.
++     * @warning Behavior is undefined if the callback returns a value other
++     *          than one of the formats in fmt or AV_PIX_FMT_NONE.
++     * @return the chosen format or AV_PIX_FMT_NONE
++     */
++    enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt);
++
++    /**
++     * maximum number of B-frames between non-B-frames
++     * Note: The output will be delayed by max_b_frames+1 relative to the input.
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int max_b_frames;
++
++    /**
++     * qscale factor between IP and B-frames
++     * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset).
++     * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    float b_quant_factor;
++
++    /**
++     * qscale offset between IP and B-frames
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    float b_quant_offset;
++
++    /**
++     * qscale factor between P- and I-frames
++     * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset).
++     * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    float i_quant_factor;
++
++    /**
++     * qscale offset between P and I-frames
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    float i_quant_offset;
++
++    /**
++     * luminance masking (0-> disabled)
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    float lumi_masking;
++
++    /**
++     * temporary complexity masking (0-> disabled)
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    float temporal_cplx_masking;
++
++    /**
++     * spatial complexity masking (0-> disabled)
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    float spatial_cplx_masking;
++
++    /**
++     * p block masking (0-> disabled)
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    float p_masking;
++
++    /**
++     * darkness masking (0-> disabled)
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    float dark_masking;
++
++    /**
++     * noise vs. sse weight for the nsse comparison function
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++     int nsse_weight;
++
++    /**
++     * motion estimation comparison function
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int me_cmp;
++    /**
++     * subpixel motion estimation comparison function
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int me_sub_cmp;
++    /**
++     * macroblock comparison function (not supported yet)
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int mb_cmp;
++    /**
++     * interlaced DCT comparison function
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int ildct_cmp;
++#define FF_CMP_SAD          0
++#define FF_CMP_SSE          1
++#define FF_CMP_SATD         2
++#define FF_CMP_DCT          3
++#define FF_CMP_PSNR         4
++#define FF_CMP_BIT          5
++#define FF_CMP_RD           6
++#define FF_CMP_ZERO         7
++#define FF_CMP_VSAD         8
++#define FF_CMP_VSSE         9
++#define FF_CMP_NSSE         10
++#define FF_CMP_W53          11
++#define FF_CMP_W97          12
++#define FF_CMP_DCTMAX       13
++#define FF_CMP_DCT264       14
++#define FF_CMP_MEDIAN_SAD   15
++#define FF_CMP_CHROMA       256
++
++    /**
++     * ME diamond size & shape
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int dia_size;
++
++    /**
++     * amount of previous MV predictors (2a+1 x 2a+1 square)
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int last_predictor_count;
++
++    /**
++     * motion estimation prepass comparison function
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int me_pre_cmp;
++
++    /**
++     * ME prepass diamond size & shape
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int pre_dia_size;
++
++    /**
++     * subpel ME quality
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int me_subpel_quality;
++
++    /**
++     * maximum motion estimation search range in subpel units
++     * If 0 then no limit.
++     *
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int me_range;
++
++    /**
++     * macroblock decision mode
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int mb_decision;
++#define FF_MB_DECISION_SIMPLE 0        ///< uses mb_cmp
++#define FF_MB_DECISION_BITS   1        ///< chooses the one which needs the fewest bits
++#define FF_MB_DECISION_RD     2        ///< rate distortion
++
++    /**
++     * custom intra quantization matrix
++     * Must be allocated with the av_malloc() family of functions, and will be freed in
++     * avcodec_free_context().
++     * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL.
++     * - decoding: Set/allocated/freed by libavcodec.
++     */
++    uint16_t *intra_matrix;
++
++    /**
++     * custom inter quantization matrix
++     * Must be allocated with the av_malloc() family of functions, and will be freed in
++     * avcodec_free_context().
++     * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL.
++     * - decoding: Set/allocated/freed by libavcodec.
++     */
++    uint16_t *inter_matrix;
++
++    /**
++     * custom intra quantization matrix
++     * - encoding: Set by user, can be NULL.
++     * - decoding: unused.
++     */
++    uint16_t *chroma_intra_matrix;
++
++#if FF_API_INTRA_DC_PRECISION
++    /**
++     * precision of the intra DC coefficient - 8
++     * - encoding: Set by user.
++     * - decoding: Set by libavcodec
++     * @deprecated Use the MPEG-2 encoder's private option "intra_dc_precision" instead.
++     */
++    attribute_deprecated
++    int intra_dc_precision;
++#endif
++
++    /**
++     * minimum MB Lagrange multiplier
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int mb_lmin;
++
++    /**
++     * maximum MB Lagrange multiplier
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int mb_lmax;
++
++    /**
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int bidir_refine;
++
++    /**
++     * minimum GOP size
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int keyint_min;
++
++    /**
++     * the number of pictures in a group of pictures, or 0 for intra_only
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int gop_size;
++
++    /**
++     * Note: Value depends upon the compare function used for fullpel ME.
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int mv0_threshold;
++
++    /**
++     * Number of slices.
++     * Indicates number of picture subdivisions. Used for parallelized
++     * decoding.
++     * - encoding: Set by user
++     * - decoding: unused
++     */
++    int slices;
++
++    /* audio only */
++    int sample_rate; ///< samples per second
++
++    /**
++     * audio sample format
++     * - encoding: Set by user.
++     * - decoding: Set by libavcodec.
++     */
++    enum AVSampleFormat sample_fmt;  ///< sample format
++
++    /**
++     * Audio channel layout.
++     * - encoding: must be set by the caller, to one of AVCodec.ch_layouts.
++     * - decoding: may be set by the caller if known e.g. from the container.
++     *             The decoder can then override during decoding as needed.
++     */
++    AVChannelLayout ch_layout;
++
++    /**
++     * Number of samples per channel in an audio frame.
++     *
++     * - encoding: may be set by the user before calling avcodec_open2(), and
++     *   libavcodec may then overwrite it if needed. 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, except
++     *   when AV_CODEC_FLAG2_FIXED_FRAME_SIZE is requested, then the
++     *   frame size is not restricted.
++     * - decoding: may be set by some decoders to indicate constant frame size
++     */
++    int frame_size;
++
++    /* The following data should not be initialized. */
++    /**
++     * number of bytes per packet if constant and known or 0
++     * Used by some WAV based audio codecs.
++     */
++    int block_align;
++
++    /**
++     * Audio cutoff bandwidth (0 means "automatic")
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int cutoff;
++
++    /**
++     * Type of service that the audio stream conveys.
++     * - encoding: Set by user.
++     * - decoding: Set by libavcodec.
++     */
++    enum AVAudioServiceType audio_service_type;
++
++    /**
++     * desired sample format
++     * - encoding: Not used.
++     * - decoding: Set by user.
++     * Decoder will decode to this format if it can.
++     */
++    enum AVSampleFormat request_sample_fmt;
++
++    /**
++     * Audio only. The number of "priming" samples (padding) inserted by the
++     * encoder at the beginning of the audio. I.e. this number of leading
++     * decoded samples must be discarded by the caller to get the original audio
++     * without leading padding.
++     *
++     * - decoding: unused
++     * - encoding: Set by libavcodec. The timestamps on the output packets are
++     *             adjusted by the encoder so that they always refer to the
++     *             first sample of the data actually contained in the packet,
++     *             including any added padding.  E.g. if the timebase is
++     *             1/samplerate and the timestamp of the first input sample is
++     *             0, the timestamp of the first output packet will be
++     *             -initial_padding.
++     */
++    int initial_padding;
++
++    /**
++     * Audio only. The amount of padding (in samples) appended by the encoder to
++     * the end of the audio. I.e. this number of decoded samples must be
++     * discarded by the caller from the end of the stream to get the original
++     * audio without any trailing padding.
++     *
++     * - decoding: unused
++     * - encoding: unused
++     */
++    int trailing_padding;
++
++    /**
++     * Number of samples to skip after a discontinuity
++     * - decoding: unused
++     * - encoding: set by libavcodec
++     */
++    int seek_preroll;
++
++    /**
++     * This callback is called at the beginning of each frame to get data
++     * buffer(s) for it. There may be one contiguous buffer for all the data or
++     * there may be a buffer per each data plane or anything in between. What
++     * this means is, you may set however many entries in buf[] you feel necessary.
++     * Each buffer must be reference-counted using the AVBuffer API (see description
++     * of buf[] below).
++     *
++     * The following fields will be set in the frame before this callback is
++     * called:
++     * - format
++     * - width, height (video only)
++     * - sample_rate, channel_layout, nb_samples (audio only)
++     * Their values may differ from the corresponding values in
++     * AVCodecContext. This callback must use the frame values, not the codec
++     * context values, to calculate the required buffer size.
++     *
++     * This callback must fill the following fields in the frame:
++     * - data[]
++     * - linesize[]
++     * - extended_data:
++     *   * if the data is planar audio with more than 8 channels, then this
++     *     callback must allocate and fill extended_data to contain all pointers
++     *     to all data planes. data[] must hold as many pointers as it can.
++     *     extended_data must be allocated with av_malloc() and will be freed in
++     *     av_frame_unref().
++     *   * otherwise extended_data must point to data
++     * - buf[] must contain one or more pointers to AVBufferRef structures. Each of
++     *   the frame's data and extended_data pointers must be contained in these. That
++     *   is, one AVBufferRef for each allocated chunk of memory, not necessarily one
++     *   AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(),
++     *   and av_buffer_ref().
++     * - extended_buf and nb_extended_buf must be allocated with av_malloc() by
++     *   this callback and filled with the extra buffers if there are more
++     *   buffers than buf[] can hold. extended_buf will be freed in
++     *   av_frame_unref().
++     *   Decoders will generally initialize the whole buffer before it is output
++     *   but it can in rare error conditions happen that uninitialized data is passed
++     *   through. \important The buffers returned by get_buffer* should thus not contain sensitive
++     *   data.
++     *
++     * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call
++     * avcodec_default_get_buffer2() instead of providing buffers allocated by
++     * some other means.
++     *
++     * Each data plane must be aligned to the maximum required by the target
++     * CPU.
++     *
++     * @see avcodec_default_get_buffer2()
++     *
++     * Video:
++     *
++     * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused
++     * (read and/or written to if it is writable) later by libavcodec.
++     *
++     * avcodec_align_dimensions2() should be used to find the required width and
++     * height, as they normally need to be rounded up to the next multiple of 16.
++     *
++     * Some decoders do not support linesizes changing between frames.
++     *
++     * If frame multithreading is used, this callback may be called from a
++     * different thread, but not from more than one at once. Does not need to be
++     * reentrant.
++     *
++     * @see avcodec_align_dimensions2()
++     *
++     * Audio:
++     *
++     * Decoders request a buffer of a particular size by setting
++     * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may,
++     * however, utilize only part of the buffer by setting AVFrame.nb_samples
++     * to a smaller value in the output frame.
++     *
++     * As a convenience, av_samples_get_buffer_size() and
++     * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2()
++     * functions to find the required data size and to fill data pointers and
++     * linesize. In AVFrame.linesize, only linesize[0] may be set for audio
++     * since all planes must be the same size.
++     *
++     * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
++     *
++     * - encoding: unused
++     * - decoding: Set by libavcodec, user can override.
++     */
++    int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags);
++
++    /* - encoding parameters */
++    /**
++     * number of bits the bitstream is allowed to diverge from the reference.
++     *           the reference can be CBR (for CBR pass1) or VBR (for pass2)
++     * - encoding: Set by user; unused for constant quantizer encoding.
++     * - decoding: unused
++     */
++    int bit_rate_tolerance;
++
++    /**
++     * Global quality for codecs which cannot change it per frame.
++     * This should be proportional to MPEG-1/2/4 qscale.
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int global_quality;
++
++    /**
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int compression_level;
++#define FF_COMPRESSION_DEFAULT -1
++
++    float qcompress;  ///< amount of qscale change between easy & hard scenes (0.0-1.0)
++    float qblur;      ///< amount of qscale smoothing over time (0.0-1.0)
++
++    /**
++     * minimum quantizer
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int qmin;
++
++    /**
++     * maximum quantizer
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int qmax;
++
++    /**
++     * maximum quantizer difference between frames
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int max_qdiff;
++
++    /**
++     * decoder bitstream buffer size
++     * - encoding: Set by user.
++     * - decoding: May be set by libavcodec.
++     */
++    int rc_buffer_size;
++
++    /**
++     * ratecontrol override, see RcOverride
++     * - encoding: Allocated/set/freed by user.
++     * - decoding: unused
++     */
++    int rc_override_count;
++    RcOverride *rc_override;
++
++    /**
++     * maximum bitrate
++     * - encoding: Set by user.
++     * - decoding: Set by user, may be overwritten by libavcodec.
++     */
++    int64_t rc_max_rate;
++
++    /**
++     * minimum bitrate
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int64_t rc_min_rate;
++
++    /**
++     * Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow.
++     * - encoding: Set by user.
++     * - decoding: unused.
++     */
++    float rc_max_available_vbv_use;
++
++    /**
++     * Ratecontrol attempt to use, at least, <value> times the amount needed to prevent a vbv overflow.
++     * - encoding: Set by user.
++     * - decoding: unused.
++     */
++    float rc_min_vbv_overflow_use;
++
++    /**
++     * Number of bits which should be loaded into the rc buffer before decoding starts.
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int rc_initial_buffer_occupancy;
++
++    /**
++     * trellis RD quantization
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int trellis;
++
++    /**
++     * pass1 encoding statistics output buffer
++     * - encoding: Set by libavcodec.
++     * - decoding: unused
++     */
++    char *stats_out;
++
++    /**
++     * pass2 encoding statistics input buffer
++     * Concatenated stuff from stats_out of pass1 should be placed here.
++     * - encoding: Allocated/set/freed by user.
++     * - decoding: unused
++     */
++    char *stats_in;
++
++    /**
++     * Work around bugs in encoders which sometimes cannot be detected automatically.
++     * - encoding: Set by user
++     * - decoding: Set by user
++     */
++    int workaround_bugs;
++#define FF_BUG_AUTODETECT       1  ///< autodetection
++#define FF_BUG_XVID_ILACE       4
++#define FF_BUG_UMP4             8
++#define FF_BUG_NO_PADDING       16
++#define FF_BUG_AMV              32
++#define FF_BUG_QPEL_CHROMA      64
++#define FF_BUG_STD_QPEL         128
++#define FF_BUG_QPEL_CHROMA2     256
++#define FF_BUG_DIRECT_BLOCKSIZE 512
++#define FF_BUG_EDGE             1024
++#define FF_BUG_HPEL_CHROMA      2048
++#define FF_BUG_DC_CLIP          4096
++#define FF_BUG_MS               8192 ///< Work around various bugs in Microsoft's broken decoders.
++#define FF_BUG_TRUNCATED       16384
++#define FF_BUG_IEDGE           32768
++
++    /**
++     * strictly follow the standard (MPEG-4, ...).
++     * - encoding: Set by user.
++     * - decoding: Set by user.
++     * Setting this to STRICT or higher means the encoder and decoder will
++     * generally do stupid things, whereas setting it to unofficial or lower
++     * will mean the encoder might produce output that is not supported by all
++     * spec-compliant decoders. Decoders don't differentiate between normal,
++     * unofficial and experimental (that is, they always try to decode things
++     * when they can) unless they are explicitly asked to behave stupidly
++     * (=strictly conform to the specs)
++     * This may only be set to one of the FF_COMPLIANCE_* values in defs.h.
++     */
++    int strict_std_compliance;
++
++    /**
++     * error concealment flags
++     * - encoding: unused
++     * - decoding: Set by user.
++     */
++    int error_concealment;
++#define FF_EC_GUESS_MVS   1
++#define FF_EC_DEBLOCK     2
++#define FF_EC_FAVOR_INTER 256
++
++    /**
++     * debug
++     * - encoding: Set by user.
++     * - decoding: Set by user.
++     */
++    int debug;
++#define FF_DEBUG_PICT_INFO   1
++#define FF_DEBUG_RC          2
++#define FF_DEBUG_BITSTREAM   4
++#define FF_DEBUG_MB_TYPE     8
++#define FF_DEBUG_QP          16
++#define FF_DEBUG_DCT_COEFF   0x00000040
++#define FF_DEBUG_SKIP        0x00000080
++#define FF_DEBUG_STARTCODE   0x00000100
++#define FF_DEBUG_ER          0x00000400
++#define FF_DEBUG_MMCO        0x00000800
++#define FF_DEBUG_BUGS        0x00001000
++#define FF_DEBUG_BUFFERS     0x00008000
++#define FF_DEBUG_THREADS     0x00010000
++#define FF_DEBUG_GREEN_MD    0x00800000
++#define FF_DEBUG_NOMC        0x01000000
++
++    /**
++     * Error recognition; may misdetect some more or less valid parts as errors.
++     * This is a bitfield of the AV_EF_* values defined in defs.h.
++     *
++     * - encoding: Set by user.
++     * - decoding: Set by user.
++     */
++    int err_recognition;
++
++    /**
++     * Hardware accelerator in use
++     * - encoding: unused.
++     * - decoding: Set by libavcodec
++     */
++    const struct AVHWAccel *hwaccel;
++
++    /**
++     * Legacy hardware accelerator context.
++     *
++     * For some hardware acceleration methods, the caller may use this field to
++     * signal hwaccel-specific data to the codec. The struct pointed to by this
++     * pointer is hwaccel-dependent and defined in the respective header. Please
++     * refer to the FFmpeg HW accelerator documentation to know how to fill
++     * this.
++     *
++     * In most cases this field is optional - the necessary information may also
++     * be provided to libavcodec through @ref hw_frames_ctx or @ref
++     * hw_device_ctx (see avcodec_get_hw_config()). However, in some cases it
++     * may be the only method of signalling some (optional) information.
++     *
++     * The struct and its contents are owned by the caller.
++     *
++     * - encoding: May be set by the caller before avcodec_open2(). Must remain
++     *             valid until avcodec_free_context().
++     * - decoding: May be set by the caller in the get_format() callback.
++     *             Must remain valid until the next get_format() call,
++     *             or avcodec_free_context() (whichever comes first).
++     */
++    void *hwaccel_context;
++
++    /**
++     * A reference to the AVHWFramesContext describing the input (for encoding)
++     * or output (decoding) frames. The reference is set by the caller and
++     * afterwards owned (and freed) by libavcodec - it should never be read by
++     * the caller after being set.
++     *
++     * - decoding: This field should be set by the caller from the get_format()
++     *             callback. The previous reference (if any) will always be
++     *             unreffed by libavcodec before the get_format() call.
++     *
++     *             If the default get_buffer2() is used with a hwaccel pixel
++     *             format, then this AVHWFramesContext will be used for
++     *             allocating the frame buffers.
++     *
++     * - encoding: For hardware encoders configured to use a hwaccel pixel
++     *             format, this field should be set by the caller to a reference
++     *             to the AVHWFramesContext describing input frames.
++     *             AVHWFramesContext.format must be equal to
++     *             AVCodecContext.pix_fmt.
++     *
++     *             This field should be set before avcodec_open2() is called.
++     */
++    AVBufferRef *hw_frames_ctx;
++
++    /**
++     * A reference to the AVHWDeviceContext describing the device which will
++     * be used by a hardware encoder/decoder.  The reference is set by the
++     * caller and afterwards owned (and freed) by libavcodec.
++     *
++     * This should be used if either the codec device does not require
++     * hardware frames or any that are used are to be allocated internally by
++     * libavcodec.  If the user wishes to supply any of the frames used as
++     * encoder input or decoder output then hw_frames_ctx should be used
++     * instead.  When hw_frames_ctx is set in get_format() for a decoder, this
++     * field will be ignored while decoding the associated stream segment, but
++     * may again be used on a following one after another get_format() call.
++     *
++     * For both encoders and decoders this field should be set before
++     * avcodec_open2() is called and must not be written to thereafter.
++     *
++     * Note that some decoders may require this field to be set initially in
++     * order to support hw_frames_ctx at all - in that case, all frames
++     * contexts used must be created on the same device.
++     */
++    AVBufferRef *hw_device_ctx;
++
++    /**
++     * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated
++     * decoding (if active).
++     * - encoding: unused
++     * - decoding: Set by user (either before avcodec_open2(), or in the
++     *             AVCodecContext.get_format callback)
++     */
++    int hwaccel_flags;
++
++    /**
++     * Video decoding only.  Sets the number of extra hardware frames which
++     * the decoder will allocate for use by the caller.  This must be set
++     * before avcodec_open2() is called.
++     *
++     * Some hardware decoders require all frames that they will use for
++     * output to be defined in advance before decoding starts.  For such
++     * decoders, the hardware frame pool must therefore be of a fixed size.
++     * The extra frames set here are on top of any number that the decoder
++     * needs internally in order to operate normally (for example, frames
++     * used as reference pictures).
++     */
++    int extra_hw_frames;
++
++    /**
++     * error
++     * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR.
++     * - decoding: unused
++     */
++    uint64_t error[AV_NUM_DATA_POINTERS];
++
++    /**
++     * DCT algorithm, see FF_DCT_* below
++     * - encoding: Set by user.
++     * - decoding: unused
++     */
++    int dct_algo;
++#define FF_DCT_AUTO    0
++#define FF_DCT_FASTINT 1
++#define FF_DCT_INT     2
++#define FF_DCT_MMX     3
++#define FF_DCT_ALTIVEC 5
++#define FF_DCT_FAAN    6
++#define FF_DCT_NEON    7
++
++    /**
++     * IDCT algorithm, see FF_IDCT_* below.
++     * - encoding: Set by user.
++     * - decoding: Set by user.
++     */
++    int idct_algo;
++#define FF_IDCT_AUTO          0
++#define FF_IDCT_INT           1
++#define FF_IDCT_SIMPLE        2
++#define FF_IDCT_SIMPLEMMX     3
++#define FF_IDCT_ARM           7
++#define FF_IDCT_ALTIVEC       8
++#define FF_IDCT_SIMPLEARM     10
++#define FF_IDCT_XVID          14
++#define FF_IDCT_SIMPLEARMV5TE 16
++#define FF_IDCT_SIMPLEARMV6   17
++#define FF_IDCT_FAAN          20
++#define FF_IDCT_SIMPLENEON    22
++#define FF_IDCT_SIMPLEAUTO    128
++
++    /**
++     * bits per sample/pixel from the demuxer (needed for huffyuv).
++     * - encoding: Set by libavcodec.
++     * - decoding: Set by user.
++     */
++     int bits_per_coded_sample;
++
++    /**
++     * Bits per sample/pixel of internal libavcodec pixel/sample format.
++     * - encoding: set by user.
++     * - decoding: set by libavcodec.
++     */
++    int bits_per_raw_sample;
++
++    /**
++     * thread count
++     * is used to decide how many independent tasks should be passed to execute()
++     * - encoding: Set by user.
++     * - decoding: Set by user.
++     */
++    int thread_count;
++
++    /**
++     * Which multithreading methods to use.
++     * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread,
++     * so clients which cannot provide future frames should not use it.
++     *
++     * - encoding: Set by user, otherwise the default is used.
++     * - decoding: Set by user, otherwise the default is used.
++     */
++    int thread_type;
++#define FF_THREAD_FRAME   1 ///< Decode more than one frame at once
++#define FF_THREAD_SLICE   2 ///< Decode more than one part of a single frame at once
++
++    /**
++     * Which multithreading methods are in use by the codec.
++     * - encoding: Set by libavcodec.
++     * - decoding: Set by libavcodec.
++     */
++    int active_thread_type;
++
++    /**
++     * The codec may call this to execute several independent things.
++     * It will return only after finishing all tasks.
++     * The user may replace this with some multithreaded implementation,
++     * the default implementation will execute the parts serially.
++     * @param count the number of things to execute
++     * - encoding: Set by libavcodec, user can override.
++     * - decoding: Set by libavcodec, user can override.
++     */
++    int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size);
++
++    /**
++     * The codec may call this to execute several independent things.
++     * It will return only after finishing all tasks.
++     * The user may replace this with some multithreaded implementation,
++     * the default implementation will execute the parts serially.
++     * @param c context passed also to func
++     * @param count the number of things to execute
++     * @param arg2 argument passed unchanged to func
++     * @param ret return values of executed functions, must have space for "count" values. May be NULL.
++     * @param func function that will be called count times, with jobnr from 0 to count-1.
++     *             threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no
++     *             two instances of func executing at the same time will have the same threadnr.
++     * @return always 0 currently, but code should handle a future improvement where when any call to func
++     *         returns < 0 no further calls to func may be done and < 0 is returned.
++     * - encoding: Set by libavcodec, user can override.
++     * - decoding: Set by libavcodec, user can override.
++     */
++    int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count);
++
++    /**
++     * profile
++     * - encoding: Set by user.
++     * - decoding: Set by libavcodec.
++     * See the AV_PROFILE_* defines in defs.h.
++     */
++     int profile;
++
++    /**
++     * Encoding level descriptor.
++     * - encoding: Set by user, corresponds to a specific level defined by the
++     *   codec, usually corresponding to the profile level, if not specified it
++     *   is set to AV_LEVEL_UNKNOWN.
++     * - decoding: Set by libavcodec.
++     * See AV_LEVEL_* in defs.h.
++     */
++     int level;
++
++    /**
++     * Skip loop filtering for selected frames.
++     * - encoding: unused
++     * - decoding: Set by user.
++     */
++    enum AVDiscard skip_loop_filter;
++
++    /**
++     * Skip IDCT/dequantization for selected frames.
++     * - encoding: unused
++     * - decoding: Set by user.
++     */
++    enum AVDiscard skip_idct;
++
++    /**
++     * Skip decoding for selected frames.
++     * - encoding: unused
++     * - decoding: Set by user.
++     */
++    enum AVDiscard skip_frame;
++
++    /**
++     * Skip processing alpha if supported by codec.
++     * Note that if the format uses pre-multiplied alpha (common with VP6,
++     * and recommended due to better video quality/compression)
++     * the image will look as if alpha-blended onto a black background.
++     * However for formats that do not use pre-multiplied alpha
++     * there might be serious artefacts (though e.g. libswscale currently
++     * assumes pre-multiplied alpha anyway).
++     *
++     * - decoding: set by user
++     * - encoding: unused
++     */
++    int skip_alpha;
++
++    /**
++     * Number of macroblock rows at the top which are skipped.
++     * - encoding: unused
++     * - decoding: Set by user.
++     */
++    int skip_top;
++
++    /**
++     * Number of macroblock rows at the bottom which are skipped.
++     * - encoding: unused
++     * - decoding: Set by user.
++     */
++    int skip_bottom;
++
++    /**
++     * low resolution decoding, 1-> 1/2 size, 2->1/4 size
++     * - encoding: unused
++     * - decoding: Set by user.
++     */
++     int lowres;
++
++    /**
++     * AVCodecDescriptor
++     * - encoding: unused.
++     * - decoding: set by libavcodec.
++     */
++    const struct AVCodecDescriptor *codec_descriptor;
++
++    /**
++     * Character encoding of the input subtitles file.
++     * - decoding: set by user
++     * - encoding: unused
++     */
++    char *sub_charenc;
++
++    /**
++     * Subtitles character encoding mode. Formats or codecs might be adjusting
++     * this setting (if they are doing the conversion themselves for instance).
++     * - decoding: set by libavcodec
++     * - encoding: unused
++     */
++    int sub_charenc_mode;
++#define FF_SUB_CHARENC_MODE_DO_NOTHING  -1  ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance)
++#define FF_SUB_CHARENC_MODE_AUTOMATIC    0  ///< libavcodec will select the mode itself
++#define FF_SUB_CHARENC_MODE_PRE_DECODER  1  ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv
++#define FF_SUB_CHARENC_MODE_IGNORE       2  ///< neither convert the subtitles, nor check them for valid UTF-8
++
++    /**
++     * Header containing style information for text subtitles.
++     * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
++     * [Script Info] and [V4+ Styles] section, plus the [Events] line and
++     * the Format line following. It shouldn't include any Dialogue line.
++     *
++     * - encoding: May be set by the caller before avcodec_open2() to an array
++     *   allocated with the av_malloc() family of functions.
++     * - decoding: May be set by libavcodec in avcodec_open2().
++     *
++     * After being set, the array is owned by the codec and freed in
++     * avcodec_free_context().
++     */
++    int subtitle_header_size;
++    uint8_t *subtitle_header;
++
++    /**
++     * dump format separator.
++     * can be ", " or "\n      " or anything else
++     * - encoding: Set by user.
++     * - decoding: Set by user.
++     */
++    uint8_t *dump_separator;
++
++    /**
++     * ',' separated list of allowed decoders.
++     * If NULL then all are allowed
++     * - encoding: unused
++     * - decoding: set by user
++     */
++    char *codec_whitelist;
++
++    /**
++     * Additional data associated with the entire coded stream.
++     *
++     * - decoding: may be set by user before calling avcodec_open2().
++     * - encoding: may be set by libavcodec after avcodec_open2().
++     */
++    AVPacketSideData *coded_side_data;
++    int            nb_coded_side_data;
++
++    /**
++     * Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of
++     * metadata exported in frame, packet, or coded stream side data by
++     * decoders and encoders.
++     *
++     * - decoding: set by user
++     * - encoding: set by user
++     */
++    int export_side_data;
++
++    /**
++     * The number of pixels per image to maximally accept.
++     *
++     * - decoding: set by user
++     * - encoding: set by user
++     */
++    int64_t max_pixels;
++
++    /**
++     * Video decoding only. Certain video codecs support cropping, meaning that
++     * only a sub-rectangle of the decoded frame is intended for display.  This
++     * option controls how cropping is handled by libavcodec.
++     *
++     * When set to 1 (the default), libavcodec will apply cropping internally.
++     * I.e. it will modify the output frame width/height fields and offset the
++     * data pointers (only by as much as possible while preserving alignment, or
++     * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that
++     * the frames output by the decoder refer only to the cropped area. The
++     * crop_* fields of the output frames will be zero.
++     *
++     * When set to 0, the width/height fields of the output frames will be set
++     * to the coded dimensions and the crop_* fields will describe the cropping
++     * rectangle. Applying the cropping is left to the caller.
++     *
++     * @warning When hardware acceleration with opaque output frames is used,
++     * libavcodec is unable to apply cropping from the top/left border.
++     *
++     * @note when this option is set to zero, the width/height fields of the
++     * AVCodecContext and output AVFrames have different meanings. The codec
++     * context fields store display dimensions (with the coded dimensions in
++     * coded_width/height), while the frame fields store the coded dimensions
++     * (with the display dimensions being determined by the crop_* fields).
++     */
++    int apply_cropping;
++
++    /**
++     * The percentage of damaged samples to discard a frame.
++     *
++     * - decoding: set by user
++     * - encoding: unused
++     */
++    int discard_damaged_percentage;
++
++    /**
++     * The number of samples per frame to maximally accept.
++     *
++     * - decoding: set by user
++     * - encoding: set by user
++     */
++    int64_t max_samples;
++
++    /**
++     * This callback is called at the beginning of each packet to get a data
++     * buffer for it.
++     *
++     * The following field will be set in the packet before this callback is
++     * called:
++     * - size
++     * This callback must use the above value to calculate the required buffer size,
++     * which must padded by at least AV_INPUT_BUFFER_PADDING_SIZE bytes.
++     *
++     * In some specific cases, the encoder may not use the entire buffer allocated by this
++     * callback. This will be reflected in the size value in the packet once returned by
++     * avcodec_receive_packet().
++     *
++     * This callback must fill the following fields in the packet:
++     * - data: alignment requirements for AVPacket apply, if any. Some architectures and
++     *   encoders may benefit from having aligned data.
++     * - buf: must contain a pointer to an AVBufferRef structure. The packet's
++     *   data pointer must be contained in it. See: av_buffer_create(), av_buffer_alloc(),
++     *   and av_buffer_ref().
++     *
++     * If AV_CODEC_CAP_DR1 is not set then get_encode_buffer() must call
++     * avcodec_default_get_encode_buffer() instead of providing a buffer allocated by
++     * some other means.
++     *
++     * The flags field may contain a combination of AV_GET_ENCODE_BUFFER_FLAG_ flags.
++     * They may be used for example to hint what use the buffer may get after being
++     * created.
++     * Implementations of this callback may ignore flags they don't understand.
++     * If AV_GET_ENCODE_BUFFER_FLAG_REF is set in flags then the packet may be reused
++     * (read and/or written to if it is writable) later by libavcodec.
++     *
++     * This callback must be thread-safe, as when frame threading is used, it may
++     * be called from multiple threads simultaneously.
++     *
++     * @see avcodec_default_get_encode_buffer()
++     *
++     * - encoding: Set by libavcodec, user can override.
++     * - decoding: unused
++     */
++    int (*get_encode_buffer)(struct AVCodecContext *s, AVPacket *pkt, int flags);
++
++    /**
++     * Frame counter, set by libavcodec.
++     *
++     * - decoding: total number of frames returned from the decoder so far.
++     * - encoding: total number of frames passed to the encoder so far.
++     *
++     *   @note the counter is not incremented if encoding/decoding resulted in
++     *   an error.
++     */
++    int64_t frame_num;
++
++    /**
++     * Decoding only. May be set by the caller before avcodec_open2() to an
++     * av_malloc()'ed array (or via AVOptions). Owned and freed by the decoder
++     * afterwards.
++     *
++     * Side data attached to decoded frames may come from several sources:
++     * 1. coded_side_data, which the decoder will for certain types translate
++     *    from packet-type to frame-type and attach to frames;
++     * 2. side data attached to an AVPacket sent for decoding (same
++     *    considerations as above);
++     * 3. extracted from the coded bytestream.
++     * The first two cases are supplied by the caller and typically come from a
++     * container.
++     *
++     * This array configures decoder behaviour in cases when side data of the
++     * same type is present both in the coded bytestream and in the
++     * user-supplied side data (items 1. and 2. above). In all cases, at most
++     * one instance of each side data type will be attached to output frames. By
++     * default it will be the bytestream side data. Adding an
++     * AVPacketSideDataType value to this array will flip the preference for
++     * this type, thus making the decoder prefer user-supplied side data over
++     * bytestream. In case side data of the same type is present both in
++     * coded_data and attacked to a packet, the packet instance always has
++     * priority.
++     *
++     * The array may also contain a single -1, in which case the preference is
++     * switched for all side data types.
++     */
++    int        *side_data_prefer_packet;
++    /**
++     * Number of entries in side_data_prefer_packet.
++     */
++    unsigned nb_side_data_prefer_packet;
++
++    /**
++     * Array containing static side data, such as HDR10 CLL / MDCV structures.
++     * Side data entries should be allocated by usage of helpers defined in
++     * libavutil/frame.h.
++     *
++     * - encoding: may be set by user before calling avcodec_open2() for
++     *             encoder configuration. Afterwards owned and freed by the
++     *             encoder.
++     * - decoding: may be set by libavcodec in avcodec_open2().
++     */
++    AVFrameSideData  **decoded_side_data;
++    int             nb_decoded_side_data;
++
++    /**
++     * Indicates how the alpha channel of the video is represented.
++     * - encoding: Set by user
++     * - decoding: Set by libavcodec
++     */
++    enum AVAlphaMode alpha_mode;
++} AVCodecContext;
++
++/**
++ * @defgroup lavc_hwaccel AVHWAccel
++ *
++ * @note  Nothing in this structure should be accessed by the user.  At some
++ *        point in future it will not be externally visible at all.
++ *
++ * @{
++ */
++typedef struct AVHWAccel {
++    /**
++     * Name of the hardware accelerated codec.
++     * The name is globally unique among encoders and among decoders (but an
++     * encoder and a decoder can share the same name).
++     */
++    const char *name;
++
++    /**
++     * Type of codec implemented by the hardware accelerator.
++     *
++     * See AVMEDIA_TYPE_xxx
++     */
++    enum AVMediaType type;
++
++    /**
++     * Codec implemented by the hardware accelerator.
++     *
++     * See AV_CODEC_ID_xxx
++     */
++    enum AVCodecID id;
++
++    /**
++     * Supported pixel format.
++     *
++     * Only hardware accelerated formats are supported here.
++     */
++    enum AVPixelFormat pix_fmt;
++
++    /**
++     * Hardware accelerated codec capabilities.
++     * see AV_HWACCEL_CODEC_CAP_*
++     */
++    int capabilities;
++} AVHWAccel;
++
++/**
++ * HWAccel is experimental and is thus avoided in favor of non experimental
++ * codecs
++ */
++#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200
++
++/**
++ * Hardware acceleration should be used for decoding even if the codec level
++ * used is unknown or higher than the maximum supported level reported by the
++ * hardware driver.
++ *
++ * It's generally a good idea to pass this flag unless you have a specific
++ * reason not to, as hardware tends to under-report supported levels.
++ */
++#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0)
++
++/**
++ * Hardware acceleration can output YUV pixel formats with a different chroma
++ * sampling than 4:2:0 and/or other than 8 bits per component.
++ */
++#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1)
++
++/**
++ * Hardware acceleration should still be attempted for decoding when the
++ * codec profile does not match the reported capabilities of the hardware.
++ *
++ * For example, this can be used to try to decode baseline profile H.264
++ * streams in hardware - it will often succeed, because many streams marked
++ * as baseline profile actually conform to constrained baseline profile.
++ *
++ * @warning If the stream is actually not supported then the behaviour is
++ *          undefined, and may include returning entirely incorrect output
++ *          while indicating success.
++ */
++#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2)
++
++/**
++ * Some hardware decoders (namely nvdec) can either output direct decoder
++ * surfaces, or make an on-device copy and return said copy.
++ * There is a hard limit on how many decoder surfaces there can be, and it
++ * cannot be accurately guessed ahead of time.
++ * For some processing chains, this can be okay, but others will run into the
++ * limit and in turn produce very confusing errors that require fine tuning of
++ * more or less obscure options by the user, or in extreme cases cannot be
++ * resolved at all without inserting an avfilter that forces a copy.
++ *
++ * Thus, the hwaccel will by default make a copy for safety and resilience.
++ * If a users really wants to minimize the amount of copies, they can set this
++ * flag and ensure their processing chain does not exhaust the surface pool.
++ */
++#define AV_HWACCEL_FLAG_UNSAFE_OUTPUT (1 << 3)
++
++/**
++ * @}
++ */
++
++enum AVSubtitleType {
++    SUBTITLE_NONE,
++
++    SUBTITLE_BITMAP,                ///< A bitmap, pict will be set
++
++    /**
++     * Plain text, the text field must be set by the decoder and is
++     * authoritative. ass and pict fields may contain approximations.
++     */
++    SUBTITLE_TEXT,
++
++    /**
++     * Formatted text, the ass field must be set by the decoder and is
++     * authoritative. pict and text fields may contain approximations.
++     */
++    SUBTITLE_ASS,
++};
++
++#define AV_SUBTITLE_FLAG_FORCED 0x00000001
++
++typedef struct AVSubtitleRect {
++    int x;         ///< top left corner  of pict, undefined when pict is not set
++    int y;         ///< top left corner  of pict, undefined when pict is not set
++    int w;         ///< width            of pict, undefined when pict is not set
++    int h;         ///< height           of pict, undefined when pict is not set
++    int nb_colors; ///< number of colors in pict, undefined when pict is not set
++
++    /**
++     * data+linesize for the bitmap of this subtitle.
++     * Can be set for text/ass as well once they are rendered.
++     */
++    uint8_t *data[4];
++    int linesize[4];
++
++    int flags;
++    enum AVSubtitleType type;
++
++    char *text;                     ///< 0 terminated plain UTF-8 text
++
++    /**
++     * 0 terminated ASS/SSA compatible event line.
++     * The presentation of this is unaffected by the other values in this
++     * struct.
++     */
++    char *ass;
++} AVSubtitleRect;
++
++typedef struct AVSubtitle {
++    uint16_t format; /* 0 = graphics */
++    uint32_t start_display_time; /* relative to packet pts, in ms */
++    uint32_t end_display_time; /* relative to packet pts, in ms */
++    unsigned num_rects;
++    AVSubtitleRect **rects;
++    int64_t pts;    ///< Same as packet pts, in AV_TIME_BASE
++} AVSubtitle;
++
++/**
++ * Return the LIBAVCODEC_VERSION_INT constant.
++ */
++unsigned avcodec_version(void);
++
++/**
++ * Return the libavcodec build-time configuration.
++ */
++const char *avcodec_configuration(void);
++
++/**
++ * Return the libavcodec license.
++ */
++const char *avcodec_license(void);
++
++/**
++ * Allocate an AVCodecContext and set its fields to default values. The
++ * resulting struct should be freed with avcodec_free_context().
++ *
++ * @param codec if non-NULL, allocate private data and initialize defaults
++ *              for the given codec. It is illegal to then call avcodec_open2()
++ *              with a different codec.
++ *              If NULL, then the codec-specific defaults won't be initialized,
++ *              which may result in suboptimal default settings (this is
++ *              important mainly for encoders, e.g. libx264).
++ *
++ * @return An AVCodecContext filled with default values or NULL on failure.
++ */
++AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
++
++/**
++ * Free the codec context and everything associated with it and write NULL to
++ * the provided pointer.
++ */
++void avcodec_free_context(AVCodecContext **avctx);
++
++/**
++ * Get the AVClass for AVCodecContext. It can be used in combination with
++ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
++ *
++ * @see av_opt_find().
++ */
++const AVClass *avcodec_get_class(void);
++
++/**
++ * Get the AVClass for AVSubtitleRect. It can be used in combination with
++ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
++ *
++ * @see av_opt_find().
++ */
++const AVClass *avcodec_get_subtitle_rect_class(void);
++
++/**
++ * Fill the parameters struct based on the values from the supplied codec
++ * context. Any allocated fields in par are freed and replaced with duplicates
++ * of the corresponding fields in codec.
++ *
++ * @return >= 0 on success, a negative AVERROR code on failure
++ *
++ * @relates AVCodecParameters
++ */
++int avcodec_parameters_from_context(struct AVCodecParameters *par,
++                                    const AVCodecContext *codec);
++
++/**
++ * Fill the codec context based on the values from the supplied codec
++ * parameters. Any allocated fields in codec that have a corresponding field in
++ * par are freed and replaced with duplicates of the corresponding field in par.
++ * Fields in codec that do not have a counterpart in par are not touched.
++ *
++ * @return >= 0 on success, a negative AVERROR code on failure.
++ *
++ * @relates AVCodecParameters
++ */
++int avcodec_parameters_to_context(AVCodecContext *codec,
++                                  const struct AVCodecParameters *par);
++
++/**
++ * Initialize the AVCodecContext to use the given AVCodec. Prior to using this
++ * function the context has to be allocated with avcodec_alloc_context3().
++ *
++ * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
++ * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
++ * retrieving a codec.
++ *
++ * Depending on the codec, you might need to set options in the codec context
++ * also for decoding (e.g. width, height, or the pixel or audio sample format in
++ * the case the information is not available in the bitstream, as when decoding
++ * raw audio or video).
++ *
++ * Options in the codec context can be set either by setting them in the options
++ * AVDictionary, or by setting the values in the context itself, directly or by
++ * using the av_opt_set() API before calling this function.
++ *
++ * Example:
++ * @code
++ * av_dict_set(&opts, "b", "2.5M", 0);
++ * codec = avcodec_find_decoder(AV_CODEC_ID_H264);
++ * if (!codec)
++ *     exit(1);
++ *
++ * context = avcodec_alloc_context3(codec);
++ *
++ * if (avcodec_open2(context, codec, opts) < 0)
++ *     exit(1);
++ * @endcode
++ *
++ * In the case AVCodecParameters are available (e.g. when demuxing a stream
++ * using libavformat, and accessing the AVStream contained in the demuxer), the
++ * codec parameters can be copied to the codec context using
++ * avcodec_parameters_to_context(), as in the following example:
++ *
++ * @code
++ * AVStream *stream = ...;
++ * context = avcodec_alloc_context3(codec);
++ * if (avcodec_parameters_to_context(context, stream->codecpar) < 0)
++ *     exit(1);
++ * if (avcodec_open2(context, codec, NULL) < 0)
++ *     exit(1);
++ * @endcode
++ *
++ * @note Always call this function before using decoding routines (such as
++ * @ref avcodec_receive_frame()).
++ *
++ * @param avctx The context to initialize.
++ * @param codec The codec to open this context for. If a non-NULL codec has been
++ *              previously passed to avcodec_alloc_context3() or
++ *              for this context, then this parameter MUST be either NULL or
++ *              equal to the previously passed codec.
++ * @param options A dictionary filled with AVCodecContext and codec-private
++ *                options, which are set on top of the options already set in
++ *                avctx, can be NULL. On return this object will be filled with
++ *                options that were not found in the avctx codec context.
++ *
++ * @return zero on success, a negative value on error
++ * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
++ *      av_dict_set(), av_opt_set(), av_opt_find(), avcodec_parameters_to_context()
++ */
++int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
++
++/**
++ * Free all allocated data in the given subtitle struct.
++ *
++ * @param sub AVSubtitle to free.
++ */
++void avsubtitle_free(AVSubtitle *sub);
++
++/**
++ * @}
++ */
++
++/**
++ * @addtogroup lavc_decoding
++ * @{
++ */
++
++/**
++ * The default callback for AVCodecContext.get_buffer2(). It is made public so
++ * it can be called by custom get_buffer2() implementations for decoders without
++ * AV_CODEC_CAP_DR1 set.
++ */
++int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags);
++
++/**
++ * The default callback for AVCodecContext.get_encode_buffer(). It is made public so
++ * it can be called by custom get_encode_buffer() implementations for encoders without
++ * AV_CODEC_CAP_DR1 set.
++ */
++int avcodec_default_get_encode_buffer(AVCodecContext *s, AVPacket *pkt, int flags);
++
++/**
++ * Modify width and height values so that they will result in a memory
++ * buffer that is acceptable for the codec if you do not use any horizontal
++ * padding.
++ *
++ * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened.
++ */
++void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height);
++
++/**
++ * Modify width and height values so that they will result in a memory
++ * buffer that is acceptable for the codec if you also ensure that all
++ * line sizes are a multiple of the respective linesize_align[i].
++ *
++ * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened.
++ */
++void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
++                               int linesize_align[AV_NUM_DATA_POINTERS]);
++
++/**
++ * Decode a subtitle message.
++ * Return a negative value on error, otherwise return the number of bytes used.
++ * If no subtitle could be decompressed, got_sub_ptr is zero.
++ * Otherwise, the subtitle is stored in *sub.
++ * Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for
++ * simplicity, because the performance difference is expected to be negligible
++ * and reusing a get_buffer written for video codecs would probably perform badly
++ * due to a potentially very different allocation pattern.
++ *
++ * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input
++ * and output. This means that for some packets they will not immediately
++ * produce decoded output and need to be flushed at the end of decoding to get
++ * all the decoded data. Flushing is done by calling this function with packets
++ * with avpkt->data set to NULL and avpkt->size set to 0 until it stops
++ * returning subtitles. It is safe to flush even those decoders that are not
++ * marked with AV_CODEC_CAP_DELAY, then no subtitles will be returned.
++ *
++ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2()
++ * before packets may be fed to the decoder.
++ *
++ * @param avctx the codec context
++ * @param[out] sub The preallocated AVSubtitle in which the decoded subtitle will be stored,
++ *                 must be freed with avsubtitle_free if *got_sub_ptr is set.
++ * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero.
++ * @param[in] avpkt The input AVPacket containing the input buffer.
++ */
++int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
++                             int *got_sub_ptr, const AVPacket *avpkt);
++
++/**
++ * Supply raw packet data as input to a decoder.
++ *
++ * Internally, this call will copy relevant AVCodecContext fields, which can
++ * influence decoding per-packet, and apply them when the packet is actually
++ * decoded. (For example AVCodecContext.skip_frame, which might direct the
++ * decoder to drop the frame contained by the packet sent with this function.)
++ *
++ * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE
++ *          larger than the actual read bytes because some optimized bitstream
++ *          readers read 32 or 64 bits at once and could read over the end.
++ *
++ * @note The AVCodecContext MUST have been opened with @ref avcodec_open2()
++ *       before packets may be fed to the decoder.
++ *
++ * @param avctx codec context
++ * @param[in] avpkt The input AVPacket. Usually, this will be a single video
++ *                  frame, or several complete audio frames.
++ *                  Ownership of the packet remains with the caller, and the
++ *                  decoder will not write to the packet. The decoder may create
++ *                  a reference to the packet data (or copy it if the packet is
++ *                  not reference-counted).
++ *                  Unlike with older APIs, the packet is always fully consumed,
++ *                  and if it contains multiple frames (e.g. some audio codecs),
++ *                  will require you to call avcodec_receive_frame() multiple
++ *                  times afterwards before you can send a new packet.
++ *                  It can be NULL (or an AVPacket with data set to NULL and
++ *                  size set to 0); in this case, it is considered a flush
++ *                  packet, which signals the end of the stream. Sending the
++ *                  first flush packet will return success. Subsequent ones are
++ *                  unnecessary and will return AVERROR_EOF. If the decoder
++ *                  still has frames buffered, it will return them after sending
++ *                  a flush packet.
++ *
++ * @retval 0                 success
++ * @retval AVERROR(EAGAIN)   input is not accepted in the current state - user
++ *                           must read output with avcodec_receive_frame() (once
++ *                           all output is read, the packet should be resent,
++ *                           and the call will not fail with EAGAIN).
++ * @retval AVERROR_EOF       the decoder has been flushed, and no new packets can be
++ *                           sent to it (also returned if more than 1 flush
++ *                           packet is sent)
++ * @retval AVERROR(EINVAL)   codec not opened, it is an encoder, or requires flush
++ * @retval AVERROR(ENOMEM)   failed to add packet to internal queue, or similar
++ * @retval "another negative error code" legitimate decoding errors
++ */
++int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
++
++/**
++ * Return decoded output data from a decoder or encoder (when the
++ * @ref AV_CODEC_FLAG_RECON_FRAME flag is used).
++ *
++ * @param avctx codec context
++ * @param frame This will be set to a reference-counted video or audio
++ *              frame (depending on the decoder type) allocated by the
++ *              codec. Note that the function will always call
++ *              av_frame_unref(frame) before doing anything else.
++ * @param flags Combination of AV_CODEC_RECEIVE_FRAME_FLAG_* flags.
++ *
++ * @retval 0                success, a frame was returned
++ * @retval AVERROR(EAGAIN)  output is not available in this state - user must
++ *                          try to send new input
++ * @retval AVERROR_EOF      the codec has been fully flushed, and there will be
++ *                          no more output frames
++ * @retval AVERROR(EINVAL)  codec not opened, or it is an encoder without the
++ *                          @ref AV_CODEC_FLAG_RECON_FRAME flag enabled
++ * @retval "other negative error code" legitimate decoding errors
++ */
++int avcodec_receive_frame_flags(AVCodecContext *avctx, AVFrame *frame, unsigned flags);
++
++/**
++ * Alias for `avcodec_receive_frame_flags(avctx, frame, 0)`.
++ */
++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, or AV_CODEC_FLAG2_FIXED_FRAME_SIZE was
++ *                  requested, then 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);
++
++enum AVCodecConfig {
++    AV_CODEC_CONFIG_PIX_FORMAT,     ///< AVPixelFormat, terminated by AV_PIX_FMT_NONE
++    AV_CODEC_CONFIG_FRAME_RATE,     ///< AVRational, terminated by {0, 0}
++    AV_CODEC_CONFIG_SAMPLE_RATE,    ///< int, terminated by 0
++    AV_CODEC_CONFIG_SAMPLE_FORMAT,  ///< AVSampleFormat, terminated by AV_SAMPLE_FMT_NONE
++    AV_CODEC_CONFIG_CHANNEL_LAYOUT, ///< AVChannelLayout, terminated by {0}
++    AV_CODEC_CONFIG_COLOR_RANGE,    ///< AVColorRange, terminated by AVCOL_RANGE_UNSPECIFIED
++    AV_CODEC_CONFIG_COLOR_SPACE,    ///< AVColorSpace, terminated by AVCOL_SPC_UNSPECIFIED
++    AV_CODEC_CONFIG_ALPHA_MODE,     ///< AVAlphaMode, terminated by AVALPHA_MODE_UNSPECIFIED
++};
++
++/**
++ * Retrieve a list of all supported values for a given configuration type.
++ *
++ * @param avctx An optional context to use. Values such as
++ *              `strict_std_compliance` may affect the result. If NULL,
++ *              default values are used.
++ * @param codec The codec to query, or NULL to use avctx->codec.
++ * @param config The configuration to query.
++ * @param flags Currently unused; should be set to zero.
++ * @param out_configs On success, set to a list of configurations, terminated
++ *                    by a config-specific terminator, or NULL if all
++ *                    possible values are supported.
++ * @param out_num_configs On success, set to the number of elements in
++                          *out_configs, excluding the terminator. Optional.
++ */
++int avcodec_get_supported_config(const AVCodecContext *avctx,
++                                 const AVCodec *codec, enum AVCodecConfig config,
++                                 unsigned flags, const void **out_configs,
++                                 int *out_num_configs);
++
++
++
++/**
++ * @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 {
++    enum AVCodecID codec_ids[7]; /* several codec IDs are permitted */
++} 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(enum AVCodecID 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 reused 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),
++ * 0 otherwise.
++ */
++int avcodec_is_open(AVCodecContext *s);
++
++/**
++ * @}
++ */
++
++#endif /* AVCODEC_AVCODEC_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_desc.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_desc.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_desc.h.ffmpeg9	2026-09-07 12:23:47.672740456 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_desc.h	2026-09-07 12:23:47.672616941 +0200
+@@ -0,0 +1,142 @@
++/*
++ * Codec descriptors public API
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVCODEC_CODEC_DESC_H
++#define AVCODEC_CODEC_DESC_H
++
++#include "libavutil/avutil.h"
++
++#include "codec_id.h"
++
++/**
++ * @addtogroup lavc_core
++ * @{
++ */
++
++/**
++ * This struct describes the properties of a single codec described by an
++ * AVCodecID.
++ * @see avcodec_descriptor_get()
++ */
++typedef struct AVCodecDescriptor {
++    enum AVCodecID     id;
++    enum AVMediaType type;
++    /**
++     * Name of the codec described by this descriptor. It is non-empty and
++     * unique for each codec descriptor. It should contain alphanumeric
++     * characters and '_' only.
++     */
++    const char      *name;
++    /**
++     * A more descriptive name for this codec. May be NULL.
++     */
++    const char *long_name;
++    /**
++     * Codec properties, a combination of AV_CODEC_PROP_* flags.
++     */
++    int             props;
++    /**
++     * MIME type(s) associated with the codec.
++     * May be NULL; if not, a NULL-terminated array of MIME types.
++     * The first item is always non-NULL and is the preferred MIME type.
++     */
++    const char *const *mime_types;
++    /**
++     * If non-NULL, an array of profiles recognized for this codec.
++     * Terminated with AV_PROFILE_UNKNOWN.
++     */
++    const struct AVProfile *profiles;
++} AVCodecDescriptor;
++
++/**
++ * Codec uses only intra compression.
++ * Video and audio codecs only.
++ */
++#define AV_CODEC_PROP_INTRA_ONLY    (1 << 0)
++/**
++ * Codec supports lossy compression. Audio and video codecs only.
++ * @note a codec may support both lossy and lossless
++ * compression modes
++ */
++#define AV_CODEC_PROP_LOSSY         (1 << 1)
++/**
++ * Codec supports lossless compression. Audio and video codecs only.
++ */
++#define AV_CODEC_PROP_LOSSLESS      (1 << 2)
++/**
++ * Codec supports frame reordering. That is, the coded order (the order in which
++ * the encoded packets are output by the encoders / stored / input to the
++ * decoders) may be different from the presentation order of the corresponding
++ * frames.
++ *
++ * For codecs that do not have this property set, PTS and DTS should always be
++ * equal.
++ */
++#define AV_CODEC_PROP_REORDER       (1 << 3)
++
++/**
++ * Video codec supports separate coding of fields in interlaced frames.
++ */
++#define AV_CODEC_PROP_FIELDS        (1 << 4)
++
++/**
++ * Video codec contains enhancement information meant to be applied to other
++ * existing frames, and can't generate usable image data on its own.
++ * A standalone decoder is unlikely to be available for it and should not
++ * be expected.
++ */
++#define AV_CODEC_PROP_ENHANCEMENT   (1 << 5)
++
++/**
++ * Subtitle codec is bitmap based
++ * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field.
++ */
++#define AV_CODEC_PROP_BITMAP_SUB    (1 << 16)
++/**
++ * Subtitle codec is text based.
++ * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field.
++ */
++#define AV_CODEC_PROP_TEXT_SUB      (1 << 17)
++
++/**
++ * @return descriptor for given codec ID or NULL if no descriptor exists.
++ */
++const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id);
++
++/**
++ * Iterate over all codec descriptors known to libavcodec.
++ *
++ * @param prev previous descriptor. NULL to get the first descriptor.
++ *
++ * @return next descriptor or NULL after the last descriptor
++ */
++const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev);
++
++/**
++ * @return codec descriptor with the given name or NULL if no such descriptor
++ *         exists.
++ */
++const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name);
++
++/**
++ * @}
++ */
++
++#endif // AVCODEC_CODEC_DESC_H
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec.h.ffmpeg9	2026-09-07 12:23:47.672474280 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec.h	2026-09-07 12:23:47.672238541 +0200
+@@ -0,0 +1,345 @@
++/*
++ * AVCodec public API
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVCODEC_CODEC_H
++#define AVCODEC_CODEC_H
++
++#include <stdint.h>
++
++#include "libavutil/avutil.h"
++#include "libavutil/hwcontext.h"
++#include "libavutil/log.h"
++#include "libavutil/pixfmt.h"
++
++#include "libavcodec/codec_id.h"
++
++/**
++ * @addtogroup lavc_core
++ * @{
++ */
++
++/**
++ * Decoder can use draw_horiz_band callback.
++ */
++#define AV_CODEC_CAP_DRAW_HORIZ_BAND     (1 <<  0)
++/**
++ * Codec uses get_buffer() or get_encode_buffer() for allocating buffers and
++ * supports custom allocators.
++ * If not set, it might not use get_buffer() or get_encode_buffer() at all, or
++ * use operations that assume the buffer was allocated by
++ * avcodec_default_get_buffer2 or avcodec_default_get_encode_buffer.
++ */
++#define AV_CODEC_CAP_DR1                 (1 <<  1)
++/**
++ * Encoder or decoder requires flushing with NULL input at the end in order to
++ * give the complete and correct output.
++ *
++ * NOTE: If this flag is not set, the codec is guaranteed to never be fed with
++ *       with NULL data. The user can still send NULL data to the public encode
++ *       or decode function, but libavcodec will not pass it along to the codec
++ *       unless this flag is set.
++ *
++ * Decoders:
++ * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL,
++ * avpkt->size=0 at the end to get the delayed data until the decoder no longer
++ * returns frames.
++ *
++ * Encoders:
++ * The encoder needs to be fed with NULL data at the end of encoding until the
++ * encoder no longer returns data.
++ *
++ * NOTE: For encoders implementing the AVCodec.encode2() function, setting this
++ *       flag also means that the encoder must set the pts and duration for
++ *       each output packet. If this flag is not set, the pts and duration will
++ *       be determined by libavcodec from the input frame.
++ */
++#define AV_CODEC_CAP_DELAY               (1 <<  5)
++/**
++ * Codec can be fed a final frame with a smaller size.
++ * This can be used to prevent truncation of the last audio samples.
++ */
++#define AV_CODEC_CAP_SMALL_LAST_FRAME    (1 <<  6)
++
++/**
++ * Codec is experimental and is thus avoided in favor of non experimental
++ * encoders
++ */
++#define AV_CODEC_CAP_EXPERIMENTAL        (1 <<  9)
++/**
++ * Codec should fill in channel configuration and samplerate instead of container
++ */
++#define AV_CODEC_CAP_CHANNEL_CONF        (1 << 10)
++/**
++ * Codec supports frame-level multithreading.
++ */
++#define AV_CODEC_CAP_FRAME_THREADS       (1 << 12)
++/**
++ * Codec supports slice-based (or partition-based) multithreading.
++ */
++#define AV_CODEC_CAP_SLICE_THREADS       (1 << 13)
++/**
++ * Codec supports changed parameters at any point.
++ */
++#define AV_CODEC_CAP_PARAM_CHANGE        (1 << 14)
++/**
++ * Codec supports multithreading through a method other than slice- or
++ * frame-level multithreading. Typically this marks wrappers around
++ * multithreading-capable external libraries.
++ */
++#define AV_CODEC_CAP_OTHER_THREADS       (1 << 15)
++/**
++ * Audio encoder supports receiving a different number of samples in each call.
++ */
++#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16)
++/**
++ * Decoder is not a preferred choice for probing.
++ * This indicates that the decoder is not a good choice for probing.
++ * It could for example be an expensive to spin up hardware decoder,
++ * or it could simply not provide a lot of useful information about
++ * the stream.
++ * A decoder marked with this flag should only be used as last resort
++ * choice for probing.
++ */
++#define AV_CODEC_CAP_AVOID_PROBING       (1 << 17)
++
++/**
++ * Codec is backed by a hardware implementation. Typically used to
++ * identify a non-hwaccel hardware decoder. For information about hwaccels, use
++ * avcodec_get_hw_config() instead.
++ */
++#define AV_CODEC_CAP_HARDWARE            (1 << 18)
++
++/**
++ * Codec is potentially backed by a hardware implementation, but not
++ * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the
++ * implementation provides some sort of internal fallback.
++ */
++#define AV_CODEC_CAP_HYBRID              (1 << 19)
++
++/**
++ * This encoder can reorder user opaque values from input AVFrames and return
++ * them with corresponding output packets.
++ * @see AV_CODEC_FLAG_COPY_OPAQUE
++ */
++#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20)
++
++/**
++ * This encoder can be flushed using avcodec_flush_buffers(). If this flag is
++ * not set, the encoder must be closed and reopened to ensure that no frames
++ * remain pending.
++ */
++#define AV_CODEC_CAP_ENCODER_FLUSH   (1 << 21)
++
++/**
++ * The encoder is able to output reconstructed frame data, i.e. raw frames that
++ * would be produced by decoding the encoded bitstream.
++ *
++ * Reconstructed frame output is enabled by the AV_CODEC_FLAG_RECON_FRAME flag.
++ */
++#define AV_CODEC_CAP_ENCODER_RECON_FRAME (1 << 22)
++
++/**
++ * AVProfile.
++ */
++typedef struct AVProfile {
++    int profile;
++    const char *name; ///< short name for the profile
++} AVProfile;
++
++/**
++ * AVCodec.
++ */
++typedef struct AVCodec {
++    /**
++     * Name of the codec implementation.
++     * The name is globally unique among encoders and among decoders (but an
++     * encoder and a decoder can share the same name).
++     * This is the primary way to find a codec from the user perspective.
++     */
++    const char *name;
++    /**
++     * Descriptive name for the codec, meant to be more human readable than name.
++     * You should use the NULL_IF_CONFIG_SMALL() macro to define it.
++     */
++    const char *long_name;
++    enum AVMediaType type;
++    enum AVCodecID id;
++    /**
++     * Codec capabilities.
++     * see AV_CODEC_CAP_*
++     */
++    int capabilities;
++    uint8_t max_lowres;                     ///< maximum value for lowres supported by the decoder
++
++    const AVClass *priv_class;              ///< AVClass for the private context
++    const AVProfile *profiles;              ///< array of recognized profiles, or NULL if unknown, array is terminated by {AV_PROFILE_UNKNOWN}
++
++    /**
++     * Group name of the codec implementation.
++     * This is a short symbolic name of the wrapper backing this codec. A
++     * wrapper uses some kind of external implementation for the codec, such
++     * as an external library, or a codec implementation provided by the OS or
++     * the hardware.
++     * If this field is NULL, this is a builtin, libavcodec native codec.
++     * If non-NULL, this will be the suffix in AVCodec.name in most cases
++     * (usually AVCodec.name will be of the form "<codec_name>_<wrapper_name>").
++     */
++    const char *wrapper_name;
++} AVCodec;
++
++/**
++ * Iterate over all registered codecs.
++ *
++ * @param opaque a pointer where libavcodec will store the iteration state. Must
++ *               point to NULL to start the iteration.
++ *
++ * @return the next registered codec or NULL when the iteration is
++ *         finished
++ */
++const AVCodec *av_codec_iterate(void **opaque);
++
++/**
++ * Find a registered decoder with a matching codec ID.
++ *
++ * @param id AVCodecID of the requested decoder
++ * @return A decoder if one was found, NULL otherwise.
++ */
++const AVCodec *avcodec_find_decoder(enum AVCodecID id);
++
++/**
++ * Find a registered decoder with the specified name.
++ *
++ * @param name name of the requested decoder
++ * @return A decoder if one was found, NULL otherwise.
++ */
++const AVCodec *avcodec_find_decoder_by_name(const char *name);
++
++/**
++ * Find a registered encoder with a matching codec ID.
++ *
++ * @param id AVCodecID of the requested encoder
++ * @return An encoder if one was found, NULL otherwise.
++ */
++const AVCodec *avcodec_find_encoder(enum AVCodecID id);
++
++/**
++ * Find a registered encoder with the specified name.
++ *
++ * @param name name of the requested encoder
++ * @return An encoder if one was found, NULL otherwise.
++ */
++const AVCodec *avcodec_find_encoder_by_name(const char *name);
++/**
++ * @return a non-zero number if codec is an encoder, zero otherwise
++ */
++int av_codec_is_encoder(const AVCodec *codec);
++
++/**
++ * @return a non-zero number if codec is a decoder, zero otherwise
++ */
++int av_codec_is_decoder(const AVCodec *codec);
++
++/**
++ * Return a name for the specified profile, if available.
++ *
++ * @param codec the codec that is searched for the given profile
++ * @param profile the profile value for which a name is requested
++ * @return A name for the profile if found, NULL otherwise.
++ */
++const char *av_get_profile_name(const AVCodec *codec, int profile);
++
++enum {
++    /**
++     * The codec supports this format via the hw_device_ctx interface.
++     *
++     * When selecting this format, AVCodecContext.hw_device_ctx should
++     * have been set to a device of the specified type before calling
++     * avcodec_open2().
++     */
++    AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX = 0x01,
++    /**
++     * The codec supports this format via the hw_frames_ctx interface.
++     *
++     * When selecting this format for a decoder,
++     * AVCodecContext.hw_frames_ctx should be set to a suitable frames
++     * context inside the get_format() callback.  The frames context
++     * must have been created on a device of the specified type.
++     *
++     * When selecting this format for an encoder,
++     * AVCodecContext.hw_frames_ctx should be set to the context which
++     * will be used for the input frames before calling avcodec_open2().
++     */
++    AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02,
++    /**
++     * The codec supports this format by some internal method.
++     *
++     * This format can be selected without any additional configuration -
++     * no device or frames context is required.
++     */
++    AV_CODEC_HW_CONFIG_METHOD_INTERNAL      = 0x04,
++    /**
++     * The codec supports this format by some ad-hoc method.
++     *
++     * Additional settings and/or function calls are required.  See the
++     * codec-specific documentation for details.  (Methods requiring
++     * this sort of configuration are deprecated and others should be
++     * used in preference.)
++     */
++    AV_CODEC_HW_CONFIG_METHOD_AD_HOC        = 0x08,
++};
++
++typedef struct AVCodecHWConfig {
++    /**
++     * For decoders, a hardware pixel format which that decoder may be
++     * able to decode to if suitable hardware is available.
++     *
++     * For encoders, a pixel format which the encoder may be able to
++     * accept.  If set to AV_PIX_FMT_NONE, this applies to all pixel
++     * formats supported by the codec.
++     */
++    enum AVPixelFormat pix_fmt;
++    /**
++     * Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible
++     * setup methods which can be used with this configuration.
++     */
++    int methods;
++    /**
++     * The device type associated with the configuration.
++     *
++     * Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and
++     * AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused.
++     */
++    enum AVHWDeviceType device_type;
++} AVCodecHWConfig;
++
++/**
++ * Retrieve supported hardware configurations for a codec.
++ *
++ * Values of index from zero to some maximum return the indexed configuration
++ * descriptor; all other values return NULL.  If the codec does not support
++ * any hardware configurations then it will always return NULL.
++ */
++const AVCodecHWConfig *avcodec_get_hw_config(const AVCodec *codec, int index);
++
++/**
++ * @}
++ */
++
++#endif /* AVCODEC_CODEC_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_id.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_id.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_id.h.ffmpeg9	2026-09-07 12:23:47.673280471 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_id.h	2026-09-07 12:23:47.672950355 +0200
+@@ -0,0 +1,686 @@
++/*
++ * 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"
++
++/**
++ * @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_XWD,
++    AV_CODEC_ID_CDXL,
++    AV_CODEC_ID_XBM,
++    AV_CODEC_ID_ZEROCODEC,
++    AV_CODEC_ID_MSS1,
++    AV_CODEC_ID_MSA1,
++    AV_CODEC_ID_TSCC2,
++    AV_CODEC_ID_MTS2,
++    AV_CODEC_ID_CLLC,
++    AV_CODEC_ID_MSS2,
++    AV_CODEC_ID_VP9,
++    AV_CODEC_ID_AIC,
++    AV_CODEC_ID_ESCAPE130,
++    AV_CODEC_ID_G2M,
++    AV_CODEC_ID_WEBP,
++    AV_CODEC_ID_HNM4_VIDEO,
++    AV_CODEC_ID_HEVC,
++#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC
++    AV_CODEC_ID_FIC,
++    AV_CODEC_ID_ALIAS_PIX,
++    AV_CODEC_ID_BRENDER_PIX,
++    AV_CODEC_ID_PAF_VIDEO,
++    AV_CODEC_ID_EXR,
++    AV_CODEC_ID_VP7,
++    AV_CODEC_ID_SANM,
++    AV_CODEC_ID_SGIRLE,
++    AV_CODEC_ID_MVC1,
++    AV_CODEC_ID_MVC2,
++    AV_CODEC_ID_HQX,
++    AV_CODEC_ID_TDSC,
++    AV_CODEC_ID_HQ_HQA,
++    AV_CODEC_ID_HAP,
++    AV_CODEC_ID_DDS,
++    AV_CODEC_ID_DXV,
++    AV_CODEC_ID_SCREENPRESSO,
++    AV_CODEC_ID_RSCC,
++    AV_CODEC_ID_AVS2,
++    AV_CODEC_ID_PGX,
++    AV_CODEC_ID_AVS3,
++    AV_CODEC_ID_MSP2,
++    AV_CODEC_ID_VVC,
++#define AV_CODEC_ID_H266 AV_CODEC_ID_VVC
++    AV_CODEC_ID_Y41P,
++    AV_CODEC_ID_AVRP,
++    AV_CODEC_ID_012V,
++    AV_CODEC_ID_AVUI,
++    AV_CODEC_ID_TARGA_Y216,
++    AV_CODEC_ID_YUV4,
++    AV_CODEC_ID_AVRN,
++    AV_CODEC_ID_CPIA,
++    AV_CODEC_ID_XFACE,
++    AV_CODEC_ID_SNOW,
++    AV_CODEC_ID_SMVJPEG,
++    AV_CODEC_ID_APNG,
++    AV_CODEC_ID_DAALA,
++    AV_CODEC_ID_CFHD,
++    AV_CODEC_ID_TRUEMOTION2RT,
++    AV_CODEC_ID_M101,
++    AV_CODEC_ID_MAGICYUV,
++    AV_CODEC_ID_SHEERVIDEO,
++    AV_CODEC_ID_YLC,
++    AV_CODEC_ID_PSD,
++    AV_CODEC_ID_PIXLET,
++    AV_CODEC_ID_SPEEDHQ,
++    AV_CODEC_ID_FMVC,
++    AV_CODEC_ID_SCPR,
++    AV_CODEC_ID_CLEARVIDEO,
++    AV_CODEC_ID_XPM,
++    AV_CODEC_ID_AV1,
++    AV_CODEC_ID_BITPACKED,
++    AV_CODEC_ID_MSCC,
++    AV_CODEC_ID_SRGC,
++    AV_CODEC_ID_SVG,
++    AV_CODEC_ID_GDV,
++    AV_CODEC_ID_FITS,
++    AV_CODEC_ID_IMM4,
++    AV_CODEC_ID_PROSUMER,
++    AV_CODEC_ID_MWSC,
++    AV_CODEC_ID_WCMV,
++    AV_CODEC_ID_RASC,
++    AV_CODEC_ID_HYMT,
++    AV_CODEC_ID_ARBC,
++    AV_CODEC_ID_AGM,
++    AV_CODEC_ID_LSCR,
++    AV_CODEC_ID_VP4,
++    AV_CODEC_ID_IMM5,
++    AV_CODEC_ID_MVDV,
++    AV_CODEC_ID_MVHA,
++    AV_CODEC_ID_CDTOONS,
++    AV_CODEC_ID_MV30,
++    AV_CODEC_ID_NOTCHLC,
++    AV_CODEC_ID_PFM,
++    AV_CODEC_ID_MOBICLIP,
++    AV_CODEC_ID_PHOTOCD,
++    AV_CODEC_ID_IPU,
++    AV_CODEC_ID_ARGO,
++    AV_CODEC_ID_CRI,
++    AV_CODEC_ID_SIMBIOSIS_IMX,
++    AV_CODEC_ID_SGA_VIDEO,
++    AV_CODEC_ID_GEM,
++    AV_CODEC_ID_VBN,
++    AV_CODEC_ID_JPEGXL,
++    AV_CODEC_ID_QOI,
++    AV_CODEC_ID_PHM,
++    AV_CODEC_ID_RADIANCE_HDR,
++    AV_CODEC_ID_WBMP,
++    AV_CODEC_ID_MEDIA100,
++    AV_CODEC_ID_VQC,
++    AV_CODEC_ID_PDV,
++    AV_CODEC_ID_EVC,
++    AV_CODEC_ID_RTV1,
++    AV_CODEC_ID_VMIX,
++    AV_CODEC_ID_LEAD,
++    AV_CODEC_ID_DNXUC,
++    AV_CODEC_ID_RV60,
++    AV_CODEC_ID_JPEGXL_ANIM,
++    AV_CODEC_ID_APV,
++    AV_CODEC_ID_PRORES_RAW,
++    AV_CODEC_ID_JPEGXS,
++    AV_CODEC_ID_WEBP_ANIM,
++
++    /* 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,
++    AV_CODEC_ID_ADPCM_IMA_XBOX,
++    AV_CODEC_ID_ADPCM_SANYO,
++    AV_CODEC_ID_ADPCM_IMA_HVQM4,
++    AV_CODEC_ID_ADPCM_IMA_PDA,
++    AV_CODEC_ID_ADPCM_N64,
++    AV_CODEC_ID_ADPCM_IMA_HVQM2,
++    AV_CODEC_ID_ADPCM_IMA_MAGIX,
++    AV_CODEC_ID_ADPCM_PSXC,
++    AV_CODEC_ID_ADPCM_CIRCUS,
++    AV_CODEC_ID_ADPCM_IMA_ESCAPE,
++
++    /* AMR */
++    AV_CODEC_ID_AMR_NB = 0x12000,
++    AV_CODEC_ID_AMR_WB,
++
++    /* RealAudio codecs*/
++    AV_CODEC_ID_RA_144 = 0x13000,
++    AV_CODEC_ID_RA_288,
++
++    /* various DPCM codecs */
++    AV_CODEC_ID_ROQ_DPCM = 0x14000,
++    AV_CODEC_ID_INTERPLAY_DPCM,
++    AV_CODEC_ID_XAN_DPCM,
++    AV_CODEC_ID_SOL_DPCM,
++    AV_CODEC_ID_SDX2_DPCM,
++    AV_CODEC_ID_GREMLIN_DPCM,
++    AV_CODEC_ID_DERF_DPCM,
++    AV_CODEC_ID_WADY_DPCM,
++    AV_CODEC_ID_CBD2_DPCM,
++
++    /* audio codecs */
++    AV_CODEC_ID_MP2 = 0x15000,
++    AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
++    AV_CODEC_ID_AAC,
++    AV_CODEC_ID_AC3,
++    AV_CODEC_ID_DTS,
++    AV_CODEC_ID_VORBIS,
++    AV_CODEC_ID_DVAUDIO,
++    AV_CODEC_ID_WMAV1,
++    AV_CODEC_ID_WMAV2,
++    AV_CODEC_ID_MACE3,
++    AV_CODEC_ID_MACE6,
++    AV_CODEC_ID_VMDAUDIO,
++    AV_CODEC_ID_FLAC,
++    AV_CODEC_ID_MP3ADU,
++    AV_CODEC_ID_MP3ON4,
++    AV_CODEC_ID_SHORTEN,
++    AV_CODEC_ID_ALAC,
++    AV_CODEC_ID_WESTWOOD_SND1,
++    AV_CODEC_ID_GSM, ///< as in Berlin toast format
++    AV_CODEC_ID_QDM2,
++    AV_CODEC_ID_COOK,
++    AV_CODEC_ID_TRUESPEECH,
++    AV_CODEC_ID_TTA,
++    AV_CODEC_ID_SMACKAUDIO,
++    AV_CODEC_ID_QCELP,
++    AV_CODEC_ID_WAVPACK,
++    AV_CODEC_ID_DSICINAUDIO,
++    AV_CODEC_ID_IMC,
++    AV_CODEC_ID_MUSEPACK7,
++    AV_CODEC_ID_MLP,
++    AV_CODEC_ID_GSM_MS, /* as found in WAV */
++    AV_CODEC_ID_ATRAC3,
++    AV_CODEC_ID_APE,
++    AV_CODEC_ID_NELLYMOSER,
++    AV_CODEC_ID_MUSEPACK8,
++    AV_CODEC_ID_SPEEX,
++    AV_CODEC_ID_WMAVOICE,
++    AV_CODEC_ID_WMAPRO,
++    AV_CODEC_ID_WMALOSSLESS,
++    AV_CODEC_ID_ATRAC3P,
++    AV_CODEC_ID_EAC3,
++    AV_CODEC_ID_SIPR,
++    AV_CODEC_ID_MP1,
++    AV_CODEC_ID_TWINVQ,
++    AV_CODEC_ID_TRUEHD,
++    AV_CODEC_ID_MP4ALS,
++    AV_CODEC_ID_ATRAC1,
++    AV_CODEC_ID_BINKAUDIO_RDFT,
++    AV_CODEC_ID_BINKAUDIO_DCT,
++    AV_CODEC_ID_AAC_LATM,
++    AV_CODEC_ID_QDMC,
++    AV_CODEC_ID_CELT,
++    AV_CODEC_ID_G723_1,
++    AV_CODEC_ID_G729,
++    AV_CODEC_ID_8SVX_EXP,
++    AV_CODEC_ID_8SVX_FIB,
++    AV_CODEC_ID_BMV_AUDIO,
++    AV_CODEC_ID_RALF,
++    AV_CODEC_ID_IAC,
++    AV_CODEC_ID_ILBC,
++    AV_CODEC_ID_OPUS,
++    AV_CODEC_ID_COMFORT_NOISE,
++    AV_CODEC_ID_TAK,
++    AV_CODEC_ID_METASOUND,
++    AV_CODEC_ID_PAF_AUDIO,
++    AV_CODEC_ID_ON2AVC,
++    AV_CODEC_ID_DSS_SP,
++    AV_CODEC_ID_CODEC2,
++    AV_CODEC_ID_FFWAVESYNTH,
++    AV_CODEC_ID_SONIC,
++    AV_CODEC_ID_SONIC_LS,
++    AV_CODEC_ID_EVRC,
++    AV_CODEC_ID_SMV,
++    AV_CODEC_ID_DSD_LSBF,
++    AV_CODEC_ID_DSD_MSBF,
++    AV_CODEC_ID_DSD_LSBF_PLANAR,
++    AV_CODEC_ID_DSD_MSBF_PLANAR,
++    AV_CODEC_ID_4GV,
++    AV_CODEC_ID_INTERPLAY_ACM,
++    AV_CODEC_ID_XMA1,
++    AV_CODEC_ID_XMA2,
++    AV_CODEC_ID_DST,
++    AV_CODEC_ID_ATRAC3AL,
++    AV_CODEC_ID_ATRAC3PAL,
++    AV_CODEC_ID_DOLBY_E,
++    AV_CODEC_ID_APTX,
++    AV_CODEC_ID_APTX_HD,
++    AV_CODEC_ID_SBC,
++    AV_CODEC_ID_ATRAC9,
++    AV_CODEC_ID_HCOM,
++    AV_CODEC_ID_ACELP_KELVIN,
++    AV_CODEC_ID_MPEGH_3D_AUDIO,
++    AV_CODEC_ID_SIREN,
++    AV_CODEC_ID_HCA,
++    AV_CODEC_ID_FASTAUDIO,
++    AV_CODEC_ID_MSNSIREN,
++    AV_CODEC_ID_DFPWM,
++    AV_CODEC_ID_BONK,
++    AV_CODEC_ID_MISC4,
++    AV_CODEC_ID_APAC,
++    AV_CODEC_ID_FTR,
++    AV_CODEC_ID_WAVARC,
++    AV_CODEC_ID_RKA,
++    AV_CODEC_ID_AC4,
++    AV_CODEC_ID_OSQ,
++    AV_CODEC_ID_QOA,
++    AV_CODEC_ID_LC3,
++    AV_CODEC_ID_G728,
++    AV_CODEC_ID_AHX,
++    AV_CODEC_ID_APPLE_APAC,
++
++    /* 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,
++    AV_CODEC_ID_IVTV_VBI,
++
++    /* other specific kind of codecs (generally used for attachments) */
++    AV_CODEC_ID_FIRST_UNKNOWN = 0x18000,           ///< A dummy ID pointing at the start of various fake codecs.
++    AV_CODEC_ID_TTF = 0x18000,
++
++    AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream.
++    AV_CODEC_ID_EPG,
++    AV_CODEC_ID_BINTEXT,
++    AV_CODEC_ID_XBIN,
++    AV_CODEC_ID_IDF,
++    AV_CODEC_ID_OTF,
++    AV_CODEC_ID_SMPTE_KLV,
++    AV_CODEC_ID_DVD_NAV,
++    AV_CODEC_ID_TIMED_ID3,
++    AV_CODEC_ID_BIN_DATA,
++    AV_CODEC_ID_SMPTE_2038,
++    AV_CODEC_ID_LCEVC,
++    AV_CODEC_ID_SMPTE_436M_ANC,
++
++
++    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 -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_par.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_par.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_par.h.ffmpeg9	2026-09-07 12:23:47.673598832 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/codec_par.h	2026-09-07 12:23:47.673417396 +0200
+@@ -0,0 +1,302 @@
++/*
++ * Codec parameters public API
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVCODEC_CODEC_PAR_H
++#define AVCODEC_CODEC_PAR_H
++
++#include <stdint.h>
++
++#include "libavutil/avutil.h"
++#include "libavutil/channel_layout.h"
++#include "libavutil/rational.h"
++#include "libavutil/pixfmt.h"
++
++#include "codec_id.h"
++#include "defs.h"
++#include "packet.h"
++
++/**
++ * @defgroup lavc_codec_params Codec parameters
++ * @ingroup lavc_core
++ * @{
++ */
++
++/**
++ * This struct describes the properties of an encoded stream.
++ *
++ * @note
++ * The `sizeof(AVCodecParameters)` is not a part of the public ABI,
++ * therefore this struct must be allocated with ::avcodec_parameters_alloc()
++ * and freed with ::avcodec_parameters_free().
++ */
++typedef struct AVCodecParameters {
++    /**
++     * General type of the encoded data.
++     */
++    enum AVMediaType codec_type;
++    /**
++     * Specific type of the encoded data (the codec used).
++     */
++    enum AVCodecID   codec_id;
++    /**
++     * Additional information about the codec (corresponds to the AVI FOURCC).
++     */
++    uint32_t         codec_tag;
++
++    /**
++     * Extra binary data needed for initializing the decoder, codec-dependent.
++     *
++     * Must be allocated with ::av_malloc() and will be freed by
++     * ::avcodec_parameters_free(). The allocated size of extradata must be at
++     * least #extradata_size + ::AV_INPUT_BUFFER_PADDING_SIZE, with the padding
++     * bytes zeroed.
++     */
++    uint8_t *extradata;
++    /**
++     * Size of the extradata content in bytes.
++     */
++    int      extradata_size;
++
++    /**
++     * Additional data associated with the entire stream.
++     *
++     * Should be allocated with ::av_packet_side_data_new() or
++     * ::av_packet_side_data_add(), and will be freed by ::avcodec_parameters_free().
++     */
++    AVPacketSideData *coded_side_data;
++
++    /**
++     * Amount of entries in #coded_side_data.
++     */
++    int nb_coded_side_data;
++
++    /**
++     * - Video: the pixel format, the value corresponds to enum ::AVPixelFormat.
++     * - Audio: the sample format, the value corresponds to enum ::AVSampleFormat.
++     */
++    int format;
++
++    /**
++     * The average bitrate of the encoded data (in bits per second).
++     */
++    int64_t bit_rate;
++
++    /**
++     * The number of bits per sample in the codedwords.
++     *
++     * This is basically the bitrate per sample. It is mandatory for a bunch of
++     * formats to actually decode them. It's the number of bits for one sample in
++     * the actual coded bitstream.
++     *
++     * This could be, for example, 4, for ADPCM.
++     * For PCM formats this matches #bits_per_raw_sample.
++     *
++     * Can be 0.
++     */
++    int bits_per_coded_sample;
++
++    /**
++     * 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;
++
++    /**
++     * The width of the video frame in pixels.
++     *
++     * Video only.
++     */
++    int width;
++
++    /**
++     * The height of the video frame in pixels.
++     *
++     * Video only.
++     */
++    int height;
++
++    /**
++     * The aspect ratio (width/height) which a single pixel
++     * should have when displayed.
++     *
++     * When the aspect ratio is unknown or undefined, the numerator should be
++     * set to 0 (the denominator may have any value).
++     *
++     * Video only.
++     */
++    AVRational sample_aspect_ratio;
++
++    /**
++     * Number of frames per second, for streams with constant frame
++     * durations. Should be set to `{ 0, 1 }` when some frames have differing
++     * durations or if the value is not known.
++     *
++     * @note This field corresponds to values that are stored in codec-level
++     * headers and is typically overridden by container/transport-layer
++     * timestamps, when available. It should thus be used only as a last resort,
++     * when no higher-level timing information is available.
++     *
++     * Video only.
++     */
++    AVRational framerate;
++
++    /**
++     * The order of the fields in interlaced video.
++     *
++     * Video only.
++     */
++    enum AVFieldOrder                  field_order;
++
++    /**
++     * Additional colorspace characteristics.
++     *
++     * Video only.
++     */
++    enum AVColorRange                  color_range;
++    enum AVColorPrimaries              color_primaries;
++    enum AVColorTransferCharacteristic color_trc;
++    enum AVColorSpace                  color_space;
++    enum AVChromaLocation              chroma_location;
++
++    /**
++     * Number of delayed frames.
++     *
++     * Video only.
++     */
++    int video_delay;
++
++    /**
++     * The channel layout and number of channels.
++     *
++     * Audio only.
++     */
++    AVChannelLayout ch_layout;
++    /**
++     * The number of audio samples per second.
++     *
++     * Audio only.
++     */
++    int      sample_rate;
++    /**
++     * The number of bytes per coded audio frame, required by some formats.
++     *
++     * Audio only.
++     *
++     * Corresponds to nBlockAlign in WAVEFORMATEX.
++     */
++    int      block_align;
++    /**
++     * Audio frame size, if known. Required by some formats to be static.
++     *
++     * Audio only.
++     */
++    int      frame_size;
++
++    /**
++     * Number of padding audio samples at the start.
++     *
++     * 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 to get the original audio without leading
++     * padding.
++     *
++     * Audio only.
++     */
++    int initial_padding;
++    /**
++     * Number of padding audio samples at the end.
++     *
++     * 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 from the end of the stream to get the original
++     * audio without any trailing padding.
++     *
++     * Audio only.
++     */
++    int trailing_padding;
++    /**
++     * Number of audio samples to skip after a discontinuity.
++     *
++     * Audio only.
++     */
++    int seek_preroll;
++
++    /**
++     * Video with alpha channel only. Alpha channel handling
++     */
++    enum AVAlphaMode alpha_mode;
++} AVCodecParameters;
++
++/**
++ * @relates 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 \p src to \p 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 -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/defs.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/defs.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/defs.h.ffmpeg9	2026-09-07 12:23:47.673997200 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/defs.h	2026-09-07 12:23:47.673753235 +0200
+@@ -0,0 +1,362 @@
++/*
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVCODEC_DEFS_H
++#define AVCODEC_DEFS_H
++
++/**
++ * @file
++ * @ingroup libavc
++ * Misc types and constants that do not belong anywhere else.
++ */
++
++#include <stdint.h>
++#include <stdlib.h>
++
++/**
++ * @ingroup lavc_decoding
++ * Required number of additionally allocated bytes at the end of the input bitstream for decoding.
++ * This is mainly needed because some optimized bitstream readers read
++ * 32 or 64 bit at once and could read over the end.<br>
++ * Note: If the first 23 bits of the additional bytes are not 0, then damaged
++ * MPEG bitstreams could cause overread and segfault.
++ */
++#define AV_INPUT_BUFFER_PADDING_SIZE 64
++
++/**
++ * Verify checksums embedded in the bitstream (could be of either encoded or
++ * decoded data, depending on the format) and print an error message on mismatch.
++ * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the
++ * decoder/demuxer returning an error.
++ */
++#define AV_EF_CRCCHECK       (1<<0)
++#define AV_EF_BITSTREAM      (1<<1)   ///< detect bitstream specification deviations
++#define AV_EF_BUFFER         (1<<2)   ///< detect improper bitstream length
++#define AV_EF_EXPLODE        (1<<3)   ///< abort decoding on minor error detection
++
++#define AV_EF_IGNORE_ERR     (1<<15)  ///< ignore errors and continue
++#define AV_EF_CAREFUL        (1<<16)  ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors
++#define AV_EF_COMPLIANT      (1<<17)  ///< consider all spec non compliances as errors
++#define AV_EF_AGGRESSIVE     (1<<18)  ///< consider things that a sane encoder/muxer should not do as an error
++
++#define FF_COMPLIANCE_VERY_STRICT   2 ///< Strictly conform to an older more strict version of the spec or reference software.
++#define FF_COMPLIANCE_STRICT        1 ///< Strictly conform to all the things in the spec no matter what consequences.
++#define FF_COMPLIANCE_NORMAL        0
++#define FF_COMPLIANCE_UNOFFICIAL   -1 ///< Allow unofficial extensions
++#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things.
++
++
++#define AV_PROFILE_UNKNOWN        -99
++#define AV_PROFILE_RESERVED      -100
++
++#define AV_PROFILE_AAC_MAIN         0
++#define AV_PROFILE_AAC_LOW          1
++#define AV_PROFILE_AAC_SSR          2
++#define AV_PROFILE_AAC_LTP          3
++#define AV_PROFILE_AAC_HE           4
++#define AV_PROFILE_AAC_HE_V2       28
++#define AV_PROFILE_AAC_LD          22
++#define AV_PROFILE_AAC_ELD         38
++#define AV_PROFILE_AAC_USAC        41
++#define AV_PROFILE_MPEG2_AAC_LOW  128
++#define AV_PROFILE_MPEG2_AAC_HE   131
++
++#define AV_PROFILE_DNXHD         0
++#define AV_PROFILE_DNXHR_LB      1
++#define AV_PROFILE_DNXHR_SQ      2
++#define AV_PROFILE_DNXHR_HQ      3
++#define AV_PROFILE_DNXHR_HQX     4
++#define AV_PROFILE_DNXHR_444     5
++
++#define AV_PROFILE_DTS                20
++#define AV_PROFILE_DTS_ES             30
++#define AV_PROFILE_DTS_96_24          40
++#define AV_PROFILE_DTS_HD_HRA         50
++#define AV_PROFILE_DTS_HD_MA          60
++#define AV_PROFILE_DTS_EXPRESS        70
++#define AV_PROFILE_DTS_HD_MA_X        61
++#define AV_PROFILE_DTS_HD_MA_X_IMAX   62
++
++#define AV_PROFILE_EAC3_DDP_ATMOS         30
++
++#define AV_PROFILE_TRUEHD_ATMOS           30
++
++#define AV_PROFILE_MPEG2_422           0
++#define AV_PROFILE_MPEG2_HIGH          1
++#define AV_PROFILE_MPEG2_SS            2
++#define AV_PROFILE_MPEG2_SNR_SCALABLE  3
++#define AV_PROFILE_MPEG2_MAIN          4
++#define AV_PROFILE_MPEG2_SIMPLE        5
++
++#define AV_PROFILE_H264_CONSTRAINED  (1<<9)  // 8+1; constraint_set1_flag
++#define AV_PROFILE_H264_INTRA        (1<<11) // 8+3; constraint_set3_flag
++
++#define AV_PROFILE_H264_BASELINE             66
++#define AV_PROFILE_H264_CONSTRAINED_BASELINE (66|AV_PROFILE_H264_CONSTRAINED)
++#define AV_PROFILE_H264_MAIN                 77
++#define AV_PROFILE_H264_EXTENDED             88
++#define AV_PROFILE_H264_HIGH                 100
++#define AV_PROFILE_H264_HIGH_10              110
++#define AV_PROFILE_H264_HIGH_10_INTRA        (110|AV_PROFILE_H264_INTRA)
++#define AV_PROFILE_H264_MULTIVIEW_HIGH       118
++#define AV_PROFILE_H264_HIGH_422             122
++#define AV_PROFILE_H264_HIGH_422_INTRA       (122|AV_PROFILE_H264_INTRA)
++#define AV_PROFILE_H264_STEREO_HIGH          128
++#define AV_PROFILE_H264_HIGH_444             144
++#define AV_PROFILE_H264_HIGH_444_PREDICTIVE  244
++#define AV_PROFILE_H264_HIGH_444_INTRA       (244|AV_PROFILE_H264_INTRA)
++#define AV_PROFILE_H264_CAVLC_444            44
++
++#define AV_PROFILE_VC1_SIMPLE   0
++#define AV_PROFILE_VC1_MAIN     1
++#define AV_PROFILE_VC1_COMPLEX  2
++#define AV_PROFILE_VC1_ADVANCED 3
++
++#define AV_PROFILE_MPEG4_SIMPLE                     0
++#define AV_PROFILE_MPEG4_SIMPLE_SCALABLE            1
++#define AV_PROFILE_MPEG4_CORE                       2
++#define AV_PROFILE_MPEG4_MAIN                       3
++#define AV_PROFILE_MPEG4_N_BIT                      4
++#define AV_PROFILE_MPEG4_SCALABLE_TEXTURE           5
++#define AV_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION      6
++#define AV_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE     7
++#define AV_PROFILE_MPEG4_HYBRID                     8
++#define AV_PROFILE_MPEG4_ADVANCED_REAL_TIME         9
++#define AV_PROFILE_MPEG4_CORE_SCALABLE             10
++#define AV_PROFILE_MPEG4_ADVANCED_CODING           11
++#define AV_PROFILE_MPEG4_ADVANCED_CORE             12
++#define AV_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
++#define AV_PROFILE_MPEG4_SIMPLE_STUDIO             14
++#define AV_PROFILE_MPEG4_ADVANCED_SIMPLE           15
++
++#define AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0   1
++#define AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1   2
++#define AV_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION  32768
++#define AV_PROFILE_JPEG2000_DCINEMA_2K              3
++#define AV_PROFILE_JPEG2000_DCINEMA_4K              4
++
++#define AV_PROFILE_VP9_0                            0
++#define AV_PROFILE_VP9_1                            1
++#define AV_PROFILE_VP9_2                            2
++#define AV_PROFILE_VP9_3                            3
++
++#define AV_PROFILE_HEVC_MAIN                        1
++#define AV_PROFILE_HEVC_MAIN_10                     2
++#define AV_PROFILE_HEVC_MAIN_STILL_PICTURE          3
++#define AV_PROFILE_HEVC_REXT                        4
++#define AV_PROFILE_HEVC_MULTIVIEW_MAIN              6
++#define AV_PROFILE_HEVC_SCC                         9
++
++#define AV_PROFILE_VVC_MAIN_10                      1
++#define AV_PROFILE_VVC_MAIN_10_444                 33
++
++#define AV_PROFILE_AV1_MAIN                         0
++#define AV_PROFILE_AV1_HIGH                         1
++#define AV_PROFILE_AV1_PROFESSIONAL                 2
++
++#define AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT            0xc0
++#define AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1
++#define AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT         0xc2
++#define AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS                0xc3
++#define AV_PROFILE_MJPEG_JPEG_LS                         0xf7
++
++#define AV_PROFILE_SBC_MSBC                         1
++
++#define AV_PROFILE_PRORES_PROXY     0
++#define AV_PROFILE_PRORES_LT        1
++#define AV_PROFILE_PRORES_STANDARD  2
++#define AV_PROFILE_PRORES_HQ        3
++#define AV_PROFILE_PRORES_4444      4
++#define AV_PROFILE_PRORES_XQ        5
++
++#define AV_PROFILE_PRORES_RAW       0
++#define AV_PROFILE_PRORES_RAW_HQ    1
++
++#define AV_PROFILE_ARIB_PROFILE_A 0
++#define AV_PROFILE_ARIB_PROFILE_C 1
++
++#define AV_PROFILE_KLVA_SYNC  0
++#define AV_PROFILE_KLVA_ASYNC 1
++
++#define AV_PROFILE_EVC_BASELINE             0
++#define AV_PROFILE_EVC_MAIN                 1
++
++#define AV_PROFILE_APV_422_10  33
++#define AV_PROFILE_APV_422_12  44
++#define AV_PROFILE_APV_444_10  55
++#define AV_PROFILE_APV_444_12  66
++#define AV_PROFILE_APV_4444_10 77
++#define AV_PROFILE_APV_4444_12 88
++#define AV_PROFILE_APV_400_10  99
++
++
++#define AV_LEVEL_UNKNOWN                  -99
++
++enum AVFieldOrder {
++    AV_FIELD_UNKNOWN,
++    AV_FIELD_PROGRESSIVE,
++    AV_FIELD_TT,          ///< Top coded_first, top displayed first
++    AV_FIELD_BB,          ///< Bottom coded first, bottom displayed first
++    AV_FIELD_TB,          ///< Top coded first, bottom displayed first
++    AV_FIELD_BT,          ///< Bottom coded first, top displayed first
++};
++
++/**
++ * @ingroup lavc_decoding
++ */
++enum AVDiscard{
++    /* We leave some space between them for extensions (drop some
++     * keyframes for intra-only or drop just some bidir frames). */
++    AVDISCARD_NONE    =-16, ///< discard nothing
++    AVDISCARD_DEFAULT =  0, ///< discard useless packets like 0 size packets in avi
++    AVDISCARD_NONREF  =  8, ///< discard all non reference
++    AVDISCARD_BIDIR   = 16, ///< discard all bidirectional frames
++    AVDISCARD_NONINTRA= 24, ///< discard all non intra frames
++    AVDISCARD_NONKEY  = 32, ///< discard all frames except keyframes
++    AVDISCARD_ALL     = 48, ///< discard all
++};
++
++enum AVAudioServiceType {
++    AV_AUDIO_SERVICE_TYPE_MAIN              = 0,
++    AV_AUDIO_SERVICE_TYPE_EFFECTS           = 1,
++    AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2,
++    AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED  = 3,
++    AV_AUDIO_SERVICE_TYPE_DIALOGUE          = 4,
++    AV_AUDIO_SERVICE_TYPE_COMMENTARY        = 5,
++    AV_AUDIO_SERVICE_TYPE_EMERGENCY         = 6,
++    AV_AUDIO_SERVICE_TYPE_VOICE_OVER        = 7,
++    AV_AUDIO_SERVICE_TYPE_KARAOKE           = 8,
++    AV_AUDIO_SERVICE_TYPE_NB                   , ///< Not part of ABI
++};
++
++/**
++ * Pan Scan area.
++ * This specifies the area which should be displayed.
++ * Note there may be multiple such areas for one frame.
++ */
++typedef struct AVPanScan {
++    /**
++     * id
++     * - encoding: Set by user.
++     * - decoding: Set by libavcodec.
++     */
++    int id;
++
++    /**
++     * width and height in 1/16 pel
++     * - encoding: Set by user.
++     * - decoding: Set by libavcodec.
++     */
++    int width;
++    int height;
++
++    /**
++     * position of the top left corner in 1/16 pel for up to 3 fields/frames
++     * - encoding: Set by user.
++     * - decoding: Set by libavcodec.
++     */
++    int16_t position[3][2];
++} AVPanScan;
++
++/**
++ * This structure describes the bitrate properties of an encoded bitstream. It
++ * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD
++ * parameters for H.264/HEVC.
++ */
++typedef struct AVCPBProperties {
++    /**
++     * Maximum bitrate of the stream, in bits per second.
++     * Zero if unknown or unspecified.
++     */
++    int64_t max_bitrate;
++    /**
++     * Minimum bitrate of the stream, in bits per second.
++     * Zero if unknown or unspecified.
++     */
++    int64_t min_bitrate;
++    /**
++     * Average bitrate of the stream, in bits per second.
++     * Zero if unknown or unspecified.
++     */
++    int64_t avg_bitrate;
++
++    /**
++     * The size of the buffer to which the ratecontrol is applied, in bits.
++     * Zero if unknown or unspecified.
++     */
++    int64_t buffer_size;
++
++    /**
++     * The delay between the time the packet this structure is associated with
++     * is received and the time when it should be decoded, in periods of a 27MHz
++     * clock.
++     *
++     * UINT64_MAX when unknown or unspecified.
++     */
++    uint64_t vbv_delay;
++} AVCPBProperties;
++
++/**
++ * Allocate a CPB properties structure and initialize its fields to default
++ * values.
++ *
++ * @param size if non-NULL, the size of the allocated struct will be written
++ *             here. This is useful for embedding it in side data.
++ *
++ * @return the newly allocated struct or NULL on failure
++ */
++AVCPBProperties *av_cpb_properties_alloc(size_t *size);
++
++/**
++ * This structure supplies correlation between a packet timestamp and a wall clock
++ * production time. The definition follows the Producer Reference Time ('prft')
++ * as defined in ISO/IEC 14496-12
++ */
++typedef struct AVProducerReferenceTime {
++    /**
++     * A UTC timestamp, in microseconds, since Unix epoch (e.g, av_gettime()).
++     */
++    int64_t wallclock;
++    int flags;
++} AVProducerReferenceTime;
++
++/**
++ * RTCP SR (Sender Report) information
++ *
++ * The received sender report information for an RTSP
++ * stream, exposed as AV_PKT_DATA_RTCP_SR side data.
++ */
++typedef struct AVRTCPSenderReport {
++    uint32_t ssrc; ///< Synchronization source identifier
++    uint64_t ntp_timestamp; ///< NTP time when the report was sent
++    uint32_t rtp_timestamp; ///< RTP time when the report was sent
++    uint32_t sender_nb_packets; ///< Total number of packets sent
++    uint32_t sender_nb_bytes; ///< Total number of bytes sent (excluding headers or padding)
++} AVRTCPSenderReport;
++
++/**
++ * 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 -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/packet.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/packet.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/packet.h.ffmpeg9	2026-09-07 12:23:47.674438022 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/packet.h	2026-09-07 12:23:47.674139340 +0200
+@@ -0,0 +1,950 @@
++/*
++ * AVPacket public API
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVCODEC_PACKET_H
++#define AVCODEC_PACKET_H
++
++#include <stddef.h>
++#include <stdint.h>
++
++#include "libavutil/attributes.h"
++#include "libavutil/buffer.h"
++#include "libavutil/dict.h"
++#include "libavutil/rational.h"
++#include "libavutil/version.h"
++
++#include "libavcodec/version_major.h"
++
++/**
++ * @defgroup lavc_packet_side_data AVPacketSideData
++ *
++ * Types and functions for working with AVPacketSideData.
++ * @{
++ */
++enum AVPacketSideDataType {
++    /**
++     * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE
++     * bytes worth of palette. This side data signals that a new palette is
++     * present.
++     */
++    AV_PKT_DATA_PALETTE,
++
++    /**
++     * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format
++     * that the extradata buffer was changed and the receiving side should
++     * act upon it appropriately. The new extradata is embedded in the side
++     * data buffer and should be immediately used for processing the current
++     * frame or packet.
++     */
++    AV_PKT_DATA_NEW_EXTRADATA,
++
++    /**
++     * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
++     * @code
++     * u32le param_flags
++     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_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,
++
++    /**
++     * Recommends skipping the specified number of samples
++     * @code
++     * u32le number of samples to skip from start of this packet
++     * u32le number of samples to skip from end of this packet
++     * u8    reason for start skip
++     * u8    reason for end   skip (0=padding silence, 1=convergence)
++     * @endcode
++     */
++    AV_PKT_DATA_SKIP_SAMPLES,
++
++    /**
++     * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that
++     * the packet may contain "dual mono" audio specific to Japanese DTV
++     * and if it is true, recommends only the selected channel to be used.
++     * @code
++     * u8    selected channels (0=main/left, 1=sub/right, 2=both)
++     * @endcode
++     */
++    AV_PKT_DATA_JP_DUALMONO,
++
++    /**
++     * A list of zero terminated key/value strings. There is no end marker for
++     * the list, so it is required to rely on the side data size to stop.
++     */
++    AV_PKT_DATA_STRINGS_METADATA,
++
++    /**
++     * Subtitle event position
++     * @code
++     * u32le x1
++     * u32le y1
++     * u32le x2
++     * u32le y2
++     * @endcode
++     */
++    AV_PKT_DATA_SUBTITLE_POSITION,
++
++    /**
++     * Data found in BlockAdditional element of matroska container. There is
++     * no end marker for the data, so it is required to rely on the side data
++     * size to recognize the end. 8 byte id (as found in BlockAddId) followed
++     * by data.
++     */
++    AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
++
++    /**
++     * The optional first identifier line of a WebVTT cue.
++     */
++    AV_PKT_DATA_WEBVTT_IDENTIFIER,
++
++    /**
++     * The optional settings (rendering instructions) that immediately
++     * follow the timestamp specifier of a WebVTT cue.
++     */
++    AV_PKT_DATA_WEBVTT_SETTINGS,
++
++    /**
++     * A list of zero terminated key/value strings. There is no end marker for
++     * the list, so it is required to rely on the side data size to stop. This
++     * side data includes updated metadata which appeared in the stream.
++     */
++    AV_PKT_DATA_METADATA_UPDATE,
++
++    /**
++     * MPEGTS stream ID as uint8_t, this is required to pass the stream ID
++     * information from the demuxer to the corresponding muxer.
++     */
++    AV_PKT_DATA_MPEGTS_STREAM_ID,
++
++    /**
++     * Mastering display metadata (based on SMPTE-2086:2014). This metadata
++     * should be associated with a video stream and contains data in the form
++     * of the AVMasteringDisplayMetadata struct.
++     */
++    AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
++
++    /**
++     * This side data should be associated with a video stream and corresponds
++     * to the AVSphericalMapping structure.
++     */
++    AV_PKT_DATA_SPHERICAL,
++
++    /**
++     * Content light level (based on CTA-861.3). This metadata should be
++     * associated with a video stream and contains data in the form of the
++     * AVContentLightMetadata struct.
++     */
++    AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
++
++    /**
++     * ATSC A53 Part 4 Closed Captions. This metadata should be associated with
++     * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data.
++     * The number of bytes of CC data is AVPacketSideData.size.
++     */
++    AV_PKT_DATA_A53_CC,
++
++    /**
++     * This side data is encryption initialization data.
++     * The format is not part of ABI, use av_encryption_init_info_* methods to
++     * access.
++     */
++    AV_PKT_DATA_ENCRYPTION_INIT_INFO,
++
++    /**
++     * This side data contains encryption info for how to decrypt the packet.
++     * The format is not part of ABI, use av_encryption_info_* methods to access.
++     */
++    AV_PKT_DATA_ENCRYPTION_INFO,
++
++    /**
++     * Active Format Description data consisting of a single byte as specified
++     * in ETSI TS 101 154 using AVActiveFormatDescription enum.
++     */
++    AV_PKT_DATA_AFD,
++
++    /**
++     * Producer Reference Time data corresponding to the AVProducerReferenceTime struct,
++     * usually exported by some encoders (on demand through the prft flag set in the
++     * AVCodecContext export_side_data field).
++     */
++    AV_PKT_DATA_PRFT,
++
++    /**
++     * ICC profile data consisting of an opaque octet buffer following the
++     * format described by ISO 15076-1.
++     */
++    AV_PKT_DATA_ICC_PROFILE,
++
++    /**
++     * DOVI configuration
++     * ref:
++     * dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2, section 2.2
++     * dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2, section 3.3
++     * Tags are stored in struct AVDOVIDecoderConfigurationRecord.
++     */
++    AV_PKT_DATA_DOVI_CONF,
++
++    /**
++     * Timecode which conforms to SMPTE ST 12-1:2014. The data is an array of 4 uint32_t
++     * where the first uint32_t describes how many (1-3) of the other timecodes are used.
++     * The timecode format is described in the documentation of av_timecode_get_smpte_from_framenum()
++     * function in libavutil/timecode.h.
++     */
++    AV_PKT_DATA_S12M_TIMECODE,
++
++    /**
++     * HDR10+ dynamic metadata associated with a video frame. The metadata is in
++     * the form of the AVDynamicHDRPlus struct and contains
++     * information for color volume transform - application 4 of
++     * SMPTE 2094-40:2016 standard.
++     */
++    AV_PKT_DATA_DYNAMIC_HDR10_PLUS,
++
++    /**
++     * IAMF Mix Gain Parameter Data associated with the audio frame. This metadata
++     * is in the form of the AVIAMFParamDefinition struct and contains information
++     * defined in sections 3.6.1 and 3.8.1 of the Immersive Audio Model and
++     * Formats standard.
++     */
++    AV_PKT_DATA_IAMF_MIX_GAIN_PARAM,
++
++    /**
++     * IAMF Demixing Info Parameter Data associated with the audio frame. This
++     * metadata is in the form of the AVIAMFParamDefinition struct and contains
++     * information defined in sections 3.6.1 and 3.8.2 of the Immersive Audio Model
++     * and Formats standard.
++     */
++    AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM,
++
++    /**
++     * IAMF Recon Gain Info Parameter Data associated with the audio frame. This
++     * metadata is in the form of the AVIAMFParamDefinition struct and contains
++     * information defined in sections 3.6.1 and 3.8.3 of the Immersive Audio Model
++     * and Formats standard.
++     */
++    AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM,
++
++    /**
++     * Ambient viewing environment metadata, as defined by H.274. This metadata
++     * should be associated with a video stream and contains data in the form
++     * of the AVAmbientViewingEnvironment struct.
++    */
++    AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT,
++
++    /**
++     * The number of pixels to discard from the top/bottom/left/right border of the
++     * decoded frame to obtain the sub-rectangle intended for presentation.
++     *
++     * @code
++     * u32le crop_top
++     * u32le crop_bottom
++     * u32le crop_left
++     * u32le crop_right
++     * @endcode
++     */
++    AV_PKT_DATA_FRAME_CROPPING,
++
++    /**
++     * Raw LCEVC payload data, as a uint8_t array, with NAL emulation
++     * bytes intact.
++     */
++    AV_PKT_DATA_LCEVC,
++
++    /**
++     * This side data contains information about the reference display width(s)
++     * and reference viewing distance(s) as well as information about the
++     * corresponding reference stereo pair(s), i.e., the pair(s) of views to be
++     * displayed for the viewer's left and right eyes on the reference display
++     * at the reference viewing distance.
++     * The payload is the AV3DReferenceDisplaysInfo struct defined in
++     * libavutil/tdrdi.h.
++     */
++    AV_PKT_DATA_3D_REFERENCE_DISPLAYS,
++
++    /**
++     * Contains the last received RTCP SR (Sender Report) information
++     * in the form of the AVRTCPSenderReport struct.
++     */
++    AV_PKT_DATA_RTCP_SR,
++
++    /**
++     * Extensible image file format metadata. The payload is a buffer containing
++     * EXIF metadata, starting with either 49 49 2a 00, or 4d 4d 00 2a.
++     */
++     AV_PKT_DATA_EXIF,
++
++    /**
++     * HDR dynamic metadata associated with a video frame. The payload is an
++     * AVDynamicHDRSmpte2094App5 type and contains information for color volume
++     * transform as specified in the SMPTE 2094-50 standard.
++     */
++    AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5,
++
++    /**
++     * Dolby Vision enhancement-layer HEVC decoder configuration.
++     * Parsed from the @c hvcE box in ISOM-based containers or the
++     * corresponding BlockAdditionMapping in Matroska. The data is a raw
++     * HEVCDecoderConfigurationRecord as defined in ISO 14496-15.
++     */
++    AV_PKT_DATA_HEVC_CONF,
++
++    /**
++     * The number of side data types.
++     * This is not part of the public API/ABI in the sense that it may
++     * change when new side data types are added.
++     * This must stay the last enum value.
++     * If its value becomes huge, some code using it
++     * needs to be updated as it assumes it to be smaller than other limits.
++     */
++    AV_PKT_DATA_NB
++};
++
++/**
++ * This structure stores auxiliary information for decoding, presenting, or
++ * otherwise processing the coded stream. It is typically exported by demuxers
++ * and encoders and can be fed to decoders and muxers either in a per packet
++ * basis, or as global side data (applying to the entire coded stream).
++ *
++ * Global side data is handled as follows:
++ * - During demuxing, it may be exported through
++ *   @ref AVCodecParameters.coded_side_data "AVStream's codec parameters", which can
++ *   then be passed as input to decoders through the
++ *   @ref AVCodecContext.coded_side_data "decoder context's side data", for
++ *   initialization.
++ * - For muxing, it can be fed through @ref AVCodecParameters.coded_side_data
++ *   "AVStream's codec parameters", typically  the output of encoders through
++ *   the @ref AVCodecContext.coded_side_data "encoder context's side data", for
++ *   initialization.
++ *
++ * Packet specific side data is handled as follows:
++ * - During demuxing, it may be exported through @ref AVPacket.side_data
++ *   "AVPacket's side data", which can then be passed as input to decoders.
++ * - For muxing, it can be fed through @ref AVPacket.side_data "AVPacket's
++ *   side data", typically the output of encoders.
++ *
++ * Different modules may accept or export different types of side data
++ * depending on media type and codec. Refer to @ref AVPacketSideDataType for a
++ * list of defined types and where they may be found or used.
++ */
++typedef struct AVPacketSideData {
++    uint8_t *data;
++    size_t   size;
++    enum AVPacketSideDataType type;
++} AVPacketSideData;
++
++/**
++ * Allocate a new packet side data.
++ *
++ * @param sd    pointer to an array of side data to which the side data should
++ *              be added. *sd may be NULL, in which case the array will be
++ *              initialized.
++ * @param nb_sd pointer to an integer containing the number of entries in
++ *              the array. The integer value will be increased by 1 on success.
++ * @param type  side data type
++ * @param size  desired side data size
++ * @param flags currently unused. Must be zero
++ *
++ * @return pointer to freshly allocated side data on success, or NULL otherwise.
++ */
++AVPacketSideData *av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd,
++                                          enum AVPacketSideDataType type,
++                                          size_t size, int flags);
++
++/**
++ * Wrap existing data as packet side data.
++ *
++ * @param sd    pointer to an array of side data to which the side data should
++ *              be added. *sd may be NULL, in which case the array will be
++ *              initialized
++ * @param nb_sd pointer to an integer containing the number of entries in
++ *              the array. The integer value will be increased by 1 on success.
++ * @param type  side data type
++ * @param data  a data array. It must be allocated with the av_malloc() family
++ *              of functions. The ownership of the data is transferred to the
++ *              side data array on success
++ * @param size  size of the data array
++ * @param flags currently unused. Must be zero
++ *
++ * @return pointer to freshly allocated side data on success, or NULL otherwise
++ *         On failure, the side data array is unchanged and the data remains
++ *         owned by the caller.
++ */
++AVPacketSideData *av_packet_side_data_add(AVPacketSideData **sd, int *nb_sd,
++                                          enum AVPacketSideDataType type,
++                                          void *data, size_t size, int flags);
++
++/**
++ * Get side information from a side data array.
++ *
++ * @param sd    the array from which the side data should be fetched
++ * @param nb_sd value containing the number of entries in the array.
++ * @param type  desired side information type
++ *
++ * @return pointer to side data if present or NULL otherwise
++ */
++const AVPacketSideData *av_packet_side_data_get(const AVPacketSideData *sd,
++                                                int nb_sd,
++                                                enum AVPacketSideDataType type);
++
++/**
++ * Remove side data of the given type from a side data array.
++ *
++ * @param sd    the array from which the side data should be removed
++ * @param nb_sd pointer to an integer containing the number of entries in
++ *              the array. Will be reduced by the amount of entries removed
++ *              upon return
++ * @param type  side information type
++ */
++void av_packet_side_data_remove(AVPacketSideData *sd, int *nb_sd,
++                                enum AVPacketSideDataType type);
++
++/**
++ * Convenience function to free all the side data stored in an array, and
++ * the array itself.
++ *
++ * @param sd    pointer to array of side data to free. Will be set to NULL
++ *              upon return.
++ * @param nb_sd pointer to an integer containing the number of entries in
++ *              the array. Will be set to 0 upon return.
++ */
++void av_packet_side_data_free(AVPacketSideData **sd, int *nb_sd);
++
++struct AVFrameSideData;
++
++/**
++ * Add a new packet side data entry to an array based on existing frame
++ * side data, if a matching type exists for packet side data.
++ *
++ * @param flags              Currently unused. Must be 0.
++ * @retval >= 0              Success
++ * @retval AVERROR(EINVAL)   The frame side data type does not have a matching
++ *                           packet side data type.
++ * @retval AVERROR(ENOMEM)   Failed to add a side data entry to the array, or
++ *                           similar.
++ */
++int av_packet_side_data_from_frame(AVPacketSideData **sd, int *nb_sd,
++                                   const struct AVFrameSideData *src, unsigned int flags);
++/**
++ * Add a new frame side data entry to an array based on existing packet
++ * side data, if a matching type exists for frame side data.
++ *
++ * @param flags              Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags,
++ *                           or 0.
++ * @retval >= 0              Success
++ * @retval AVERROR(EINVAL)   The packet side data type does not have a matching
++ *                           frame side data type.
++ * @retval AVERROR(ENOMEM)   Failed to add a side data entry to the array, or
++ *                           similar.
++ */
++int av_packet_side_data_to_frame(struct AVFrameSideData ***sd, int *nb_sd,
++                                 const AVPacketSideData *src, unsigned int flags);
++
++const char *av_packet_side_data_name(enum AVPacketSideDataType type);
++
++/**
++ * @}
++ */
++
++/**
++ * @defgroup lavc_packet AVPacket
++ *
++ * Types and functions for working with AVPacket.
++ * @{
++ */
++
++/**
++ * This structure stores compressed data. It is typically exported by demuxers
++ * and then passed as input to decoders, or received as output from encoders and
++ * then passed to muxers.
++ *
++ * For video, it should typically contain one compressed frame. For audio it may
++ * contain several compressed frames. Encoders are allowed to output empty
++ * packets, with no compressed data, containing only side data
++ * (e.g. to update some stream parameters at the end of encoding).
++ *
++ * The semantics of data ownership depends on the buf field.
++ * If it is set, the packet data is dynamically allocated and is
++ * valid indefinitely until a call to av_packet_unref() reduces the
++ * reference count to 0.
++ *
++ * If the buf field is not set av_packet_ref() would make a copy instead
++ * of increasing the reference count.
++ *
++ * The side data is always allocated with av_malloc(), copied by
++ * av_packet_ref() and freed by av_packet_unref().
++ *
++ * sizeof(AVPacket) being a part of the public ABI is deprecated. once
++ * av_init_packet() is removed, new packets will only be able to be allocated
++ * with av_packet_alloc(), and new fields may be added to the end of the struct
++ * with a minor bump.
++ *
++ * @see av_packet_alloc
++ * @see av_packet_ref
++ * @see av_packet_unref
++ */
++typedef struct AVPacket {
++    /**
++     * A reference to the reference-counted buffer where the packet data is
++     * stored.
++     * May be NULL, then the packet data is not reference-counted.
++     */
++    AVBufferRef *buf;
++    /**
++     * Presentation timestamp in AVStream->time_base units; the time at which
++     * the decompressed packet will be presented to the user.
++     * Can be AV_NOPTS_VALUE if it is not stored in the file.
++     * pts MUST be larger or equal to dts as presentation cannot happen before
++     * decompression, unless one wants to view hex dumps. Some formats misuse
++     * the terms dts and pts/cts to mean something different. Such timestamps
++     * must be converted to true pts/dts before they are stored in AVPacket.
++     */
++    int64_t pts;
++    /**
++     * Decompression timestamp in AVStream->time_base units; the time at which
++     * the packet is decompressed.
++     * Can be AV_NOPTS_VALUE if it is not stored in the file.
++     */
++    int64_t dts;
++    uint8_t *data;
++    int   size;
++    int   stream_index;
++    /**
++     * A combination of AV_PKT_FLAG values
++     */
++    int   flags;
++    /**
++     * Additional packet data that can be provided by the container.
++     * Packet can contain several types of side information.
++     */
++    AVPacketSideData *side_data;
++    int side_data_elems;
++
++    /**
++     * Duration of this packet in AVStream->time_base units, 0 if unknown.
++     * Equals next_pts - this_pts in presentation order.
++     */
++    int64_t duration;
++
++    int64_t pos;                            ///< byte position in stream, -1 if unknown
++
++    /**
++     * for some private data of the user
++     */
++    void *opaque;
++
++    /**
++     * AVBufferRef for free use by the API user. FFmpeg will never check the
++     * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when
++     * the packet is unreferenced. av_packet_copy_props() calls create a new
++     * reference with av_buffer_ref() for the target packet's opaque_ref field.
++     *
++     * This is unrelated to the opaque field, although it serves a similar
++     * purpose.
++     */
++    AVBufferRef *opaque_ref;
++
++    /**
++     * Time base of the packet's timestamps.
++     * In the future, this field may be set on packets output by encoders or
++     * demuxers, but its value will be by default ignored on input to decoders
++     * or muxers.
++     */
++    AVRational time_base;
++} AVPacket;
++
++#define AV_PKT_FLAG_KEY     0x0001 ///< The packet contains a keyframe
++#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
++/**
++ * Flag is used to discard packets which are required to maintain valid
++ * decoder state but are not required for output and should be dropped
++ * after decoding.
++ **/
++#define AV_PKT_FLAG_DISCARD   0x0004
++/**
++ * The packet comes from a trusted source.
++ *
++ * Otherwise-unsafe constructs such as arbitrary pointers to data
++ * outside the packet may be followed.
++ */
++#define AV_PKT_FLAG_TRUSTED   0x0008
++/**
++ * Flag is used to indicate packets that contain frames that can
++ * be discarded by the decoder.  I.e. Non-reference frames.
++ */
++#define AV_PKT_FLAG_DISPOSABLE 0x0010
++
++enum AVSideDataParamChangeFlags {
++    AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE    = 0x0004,
++    AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS     = 0x0008,
++};
++
++/**
++ * Allocate an AVPacket and set its fields to default values.  The resulting
++ * struct must be freed using av_packet_free().
++ *
++ * @return An AVPacket filled with default values or NULL on failure.
++ *
++ * @note this only allocates the AVPacket itself, not the data buffers. Those
++ * must be allocated through other means such as av_new_packet.
++ *
++ * @see av_new_packet
++ */
++AVPacket *av_packet_alloc(void);
++
++/**
++ * Create a new packet that references the same data as src.
++ *
++ * This is a shortcut for av_packet_alloc()+av_packet_ref().
++ *
++ * @return newly created AVPacket on success, NULL on error.
++ *
++ * @see av_packet_alloc
++ * @see av_packet_ref
++ */
++AVPacket *av_packet_clone(const AVPacket *src);
++
++/**
++ * Free the packet, if the packet is reference counted, it will be
++ * unreferenced first.
++ *
++ * @param pkt packet to be freed. The pointer will be set to NULL.
++ * @note passing NULL is a no-op.
++ */
++void av_packet_free(AVPacket **pkt);
++
++#if FF_API_INIT_PACKET
++/**
++ * Initialize optional fields of a packet with default values.
++ *
++ * Note, this does not touch the data and size members, which have to be
++ * initialized separately.
++ *
++ * @param pkt packet
++ *
++ * @see av_packet_alloc
++ * @see av_packet_unref
++ *
++ * @deprecated This function is deprecated. Once it's removed,
++               sizeof(AVPacket) will not be a part of the ABI anymore.
++ */
++attribute_deprecated
++void av_init_packet(AVPacket *pkt);
++#endif
++
++/**
++ * Allocate the payload of a packet and initialize its fields with
++ * default values.
++ *
++ * @param pkt packet
++ * @param size wanted payload size
++ * @return 0 if OK, AVERROR_xxx otherwise
++ */
++int av_new_packet(AVPacket *pkt, int size);
++
++/**
++ * Reduce packet size, correctly zeroing padding
++ *
++ * @param pkt packet
++ * @param size new size
++ */
++void av_shrink_packet(AVPacket *pkt, int size);
++
++/**
++ * Increase packet size, correctly zeroing padding
++ *
++ * @param pkt packet
++ * @param grow_by number of bytes by which to increase the size of the packet
++ */
++int av_grow_packet(AVPacket *pkt, int grow_by);
++
++/**
++ * Initialize a reference-counted packet from av_malloc()ed data.
++ *
++ * @param pkt packet to be initialized. This function will set the data, size,
++ *        and buf fields, all others are left untouched.
++ * @param data Data allocated by av_malloc() to be used as packet data. If this
++ *        function returns successfully, the data is owned by the underlying AVBuffer.
++ *        The caller may not access the data through other means.
++ * @param size size of data in bytes, without the padding. I.e. the full buffer
++ *        size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE.
++ *
++ * @return 0 on success, a negative AVERROR on error
++ */
++int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size);
++
++/**
++ * Allocate new information of a packet.
++ *
++ * @param pkt packet
++ * @param type side information type
++ * @param size side information size
++ * @return pointer to fresh allocated data or NULL otherwise
++ */
++uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
++                                 size_t size);
++
++/**
++ * Wrap an existing array as a packet side data.
++ *
++ * @param pkt packet
++ * @param type side information type
++ * @param data the side data array. It must be allocated with the av_malloc()
++ *             family of functions. The ownership of the data is transferred to
++ *             pkt.
++ * @param size side information size
++ * @return a non-negative number on success, a negative AVERROR code on
++ *         failure. On failure, the packet is unchanged and the data remains
++ *         owned by the caller.
++ */
++int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
++                            uint8_t *data, size_t size);
++
++/**
++ * Shrink the already allocated side data buffer
++ *
++ * @param pkt packet
++ * @param type side information type
++ * @param size new side information size
++ * @return 0 on success, < 0 on failure
++ */
++int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
++                               size_t size);
++
++/**
++ * Get side information from packet.
++ *
++ * @param pkt packet
++ * @param type desired side information type
++ * @param size If supplied, *size will be set to the size of the side data
++ *             or to zero if the desired side data is not present.
++ * @return pointer to data if present or NULL otherwise
++ */
++uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type,
++                                 size_t *size);
++
++/**
++ * Pack a dictionary for use in side_data.
++ *
++ * @param dict The dictionary to pack.
++ * @param size pointer to store the size of the returned data
++ * @return pointer to data if successful, NULL otherwise
++ */
++uint8_t *av_packet_pack_dictionary(const 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);
++
++/**
++ * Allocate an AVContainerFifo instance for AVPacket.
++ *
++ * @param flags currently unused
++ */
++struct AVContainerFifo *av_container_fifo_alloc_avpacket(unsigned flags);
++
++/**
++ * @}
++ */
++
++#endif // AVCODEC_PACKET_H
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/version.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/version.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/version.h.ffmpeg9	2026-09-07 12:23:47.674509692 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/version.h	2026-09-07 12:23:47.674489202 +0200
+@@ -0,0 +1,45 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVCODEC_VERSION_H
++#define AVCODEC_VERSION_H
++
++/**
++ * @file
++ * @ingroup libavc
++ * Libavcodec version macros.
++ */
++
++#include "libavutil/version.h"
++
++#include "version_major.h"
++
++#define LIBAVCODEC_VERSION_MINOR   1
++#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_IDENT        "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
++
++#endif /* AVCODEC_VERSION_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/version_major.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/version_major.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/version_major.h.ffmpeg9	2026-09-07 12:23:47.674582445 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavcodec/version_major.h	2026-09-07 12:23:47.674562700 +0200
+@@ -0,0 +1,45 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVCODEC_VERSION_MAJOR_H
++#define AVCODEC_VERSION_MAJOR_H
++
++/**
++ * @file
++ * @ingroup libavc
++ * Libavcodec version macros.
++ */
++
++#define LIBAVCODEC_VERSION_MAJOR  63
++
++/**
++ * FF_API_* defines may be placed below to indicate public API that will be
++ * dropped at a future version bump. The defines themselves are not part of
++ * the public API and may change, break or disappear at any time.
++ *
++ * @note, when bumping the major version it is recommended to manually
++ * disable each FF_API_* in its own commit instead of disabling them all
++ * at once through the bump. This improves the git bisect-ability of the change.
++ */
++
++#define FF_API_INIT_PACKET         (LIBAVCODEC_VERSION_MAJOR < 64)
++
++#define FF_API_INTRA_DC_PRECISION  (LIBAVCODEC_VERSION_MAJOR < 64)
++#define FF_API_MJPEG_EXTERN_HUFF   (LIBAVCODEC_VERSION_MAJOR < 64)
++
++#endif /* AVCODEC_VERSION_MAJOR_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/avformat.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/avformat.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/avformat.h.ffmpeg9	2026-09-07 12:23:47.675219111 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/avformat.h	2026-09-07 12:23:47.675078994 +0200
+@@ -0,0 +1,3192 @@
++/*
++ * 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 AVFORMAT_AVFORMAT_H
++#define AVFORMAT_AVFORMAT_H
++
++/**
++ * @file
++ * @ingroup libavf
++ * Main libavformat public API header
++ */
++
++/**
++ * @defgroup libavf libavformat
++ * I/O and Muxing/Demuxing Library
++ *
++ * Libavformat (lavf) is a library for dealing with various media container
++ * formats. Its main two purposes are demuxing - i.e. splitting a media file
++ * into component streams, and the reverse process of muxing - writing supplied
++ * data in a specified container format. It also has an @ref lavf_io
++ * "I/O module" which supports a number of protocols for accessing the data (e.g.
++ * file, tcp, http and others).
++ * Unless you are absolutely sure you won't use libavformat's network
++ * capabilities, you should also call avformat_network_init().
++ *
++ * A supported input format is described by an AVInputFormat struct, conversely
++ * an output format is described by AVOutputFormat. You can iterate over all
++ * input/output formats using the  av_demuxer_iterate / av_muxer_iterate() functions.
++ * The protocols layer is not part of the public API, so you can only get the names
++ * of supported protocols with the avio_enum_protocols() function.
++ *
++ * Main lavf structure used for both muxing and demuxing is AVFormatContext,
++ * which exports all information about the file being read or written. As with
++ * most Libavformat structures, its size is not part of public ABI, so it cannot be
++ * allocated on stack or directly with av_malloc(). To create an
++ * AVFormatContext, use avformat_alloc_context() (some functions, like
++ * avformat_open_input() might do that for you).
++ *
++ * Most importantly an AVFormatContext contains:
++ * @li the @ref AVFormatContext.iformat "input" or @ref AVFormatContext.oformat
++ * "output" format. It is either autodetected or set by user for input;
++ * always set by user for output.
++ * @li an @ref AVFormatContext.streams "array" of AVStreams, which describe all
++ * elementary streams stored in the file. AVStreams are typically referred to
++ * using their index in this array.
++ * @li an @ref AVFormatContext.pb "I/O context". It is either opened by lavf or
++ * set by user for input, always set by user for output (unless you are dealing
++ * with an AVFMT_NOFILE format).
++ *
++ * @section lavf_options Passing options to (de)muxers
++ * It is possible to configure lavf muxers and demuxers using the @ref avoptions
++ * mechanism. Generic (format-independent) libavformat options are provided by
++ * AVFormatContext, they can be examined from a user program by calling
++ * av_opt_next() / av_opt_find() on an allocated AVFormatContext (or its AVClass
++ * from avformat_get_class()). Private (format-specific) options are provided by
++ * AVFormatContext.priv_data if and only if AVInputFormat.priv_class /
++ * AVOutputFormat.priv_class of the corresponding format struct is non-NULL.
++ * Further options may be provided by the @ref AVFormatContext.pb "I/O context",
++ * if its AVClass is non-NULL, and the protocols layer. See the discussion on
++ * nesting in @ref avoptions documentation to learn how to access those.
++ *
++ * @section urls
++ * URL strings in libavformat are made of a scheme/protocol, a ':', and a
++ * scheme specific string. URLs without a scheme and ':' used for local files
++ * are supported but deprecated. "file:" should be used for local files.
++ *
++ * It is important that the scheme string is not taken from untrusted
++ * sources without checks.
++ *
++ * Note that some schemes/protocols are quite powerful, allowing access to
++ * both local and remote files, parts of them, concatenations of them, local
++ * audio and video devices and so on.
++ *
++ * @{
++ *
++ * @defgroup lavf_decoding Demuxing
++ * @{
++ * Demuxers read a media file and split it into chunks of data (@em packets). A
++ * @ref AVPacket "packet" contains one or more encoded frames which belongs to a
++ * single elementary stream. In the lavf API this process is represented by the
++ * avformat_open_input() function for opening a file, av_read_frame() for
++ * reading a single packet and finally avformat_close_input(), which does the
++ * cleanup.
++ *
++ * @section lavf_decoding_open Opening a media file
++ * The minimum information required to open a file is its URL, which
++ * is passed to avformat_open_input(), as in the following code:
++ * @code
++ * const char    *url = "file:in.mp3";
++ * AVFormatContext *s = NULL;
++ * int ret = avformat_open_input(&s, url, NULL, NULL);
++ * if (ret < 0)
++ *     abort();
++ * @endcode
++ * The above code attempts to allocate an AVFormatContext, open the
++ * specified file (autodetecting the format) and read the header, exporting the
++ * information stored there into s. Some formats do not have a header or do not
++ * store enough information there, so it is recommended that you call the
++ * avformat_find_stream_info() function which tries to read and decode a few
++ * frames to find missing information.
++ *
++ * In some cases you might want to preallocate an AVFormatContext yourself with
++ * avformat_alloc_context() and do some tweaking on it before passing it to
++ * avformat_open_input(). One such case is when you want to use custom functions
++ * for reading input data instead of lavf internal I/O layer.
++ * To do that, create your own AVIOContext with avio_alloc_context(), passing
++ * your reading callbacks to it. Then set the @em pb field of your
++ * AVFormatContext to newly created AVIOContext.
++ *
++ * Since the format of the opened file is in general not known until after
++ * avformat_open_input() has returned, it is not possible to set demuxer private
++ * options on a preallocated context. Instead, the options should be passed to
++ * avformat_open_input() wrapped in an AVDictionary:
++ * @code
++ * AVDictionary *options = NULL;
++ * av_dict_set(&options, "video_size", "640x480", 0);
++ * av_dict_set(&options, "pixel_format", "rgb24", 0);
++ *
++ * if (avformat_open_input(&s, url, NULL, &options) < 0)
++ *     abort();
++ * av_dict_free(&options);
++ * @endcode
++ * This code passes the private options 'video_size' and 'pixel_format' to the
++ * demuxer. They would be necessary for e.g. the rawvideo demuxer, since it
++ * cannot know how to interpret raw video data otherwise. If the format turns
++ * out to be something different than raw video, those options will not be
++ * recognized by the demuxer and therefore will not be applied. Such unrecognized
++ * options are then returned in the options dictionary (recognized options are
++ * consumed). The calling program can handle such unrecognized options as it
++ * wishes, e.g.
++ * @code
++ * const AVDictionaryEntry *e;
++ * if ((e = av_dict_iterate(options, NULL))) {
++ *     fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key);
++ *     abort();
++ * }
++ * @endcode
++ *
++ * After you have finished reading the file, you must close it with
++ * avformat_close_input(). It will free everything associated with the file.
++ *
++ * @section lavf_decoding_read Reading from an opened file
++ * Reading data from an opened AVFormatContext is done by repeatedly calling
++ * av_read_frame() on it. Each call, if successful, will return an AVPacket
++ * containing encoded data for one AVStream, identified by
++ * AVPacket.stream_index. This packet may be passed straight into the libavcodec
++ * decoding functions avcodec_send_packet() or avcodec_decode_subtitle2() if the
++ * caller wishes to decode the data.
++ *
++ * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be
++ * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for
++ * pts/dts, 0 for duration) if the stream does not provide them. The timing
++ * information will be in AVStream.time_base units, i.e. it has to be
++ * multiplied by the timebase to convert them to seconds.
++ *
++ * A packet returned by av_read_frame() is always reference-counted,
++ * i.e. AVPacket.buf is set and the user may keep it indefinitely.
++ * The packet must be freed with av_packet_unref() when it is no
++ * longer needed.
++ *
++ * @section lavf_decoding_seek Seeking
++ * @}
++ *
++ * @defgroup lavf_encoding Muxing
++ * @{
++ * Muxers take encoded data in the form of @ref AVPacket "AVPackets" and write
++ * it into files or other output bytestreams in the specified container format.
++ *
++ * The main API functions for muxing are avformat_write_header() for writing the
++ * file header, av_write_frame() / av_interleaved_write_frame() for writing the
++ * packets and av_write_trailer() for finalizing the file.
++ *
++ * At the beginning of the muxing process, the caller must first call
++ * avformat_alloc_context() to create a muxing context. The caller then sets up
++ * the muxer by filling the various fields in this context:
++ *
++ * - The @ref AVFormatContext.oformat "oformat" field must be set to select the
++ *   muxer that will be used.
++ * - Unless the format is of the AVFMT_NOFILE type, the @ref AVFormatContext.pb
++ *   "pb" field must be set to an opened IO context, either returned from
++ *   avio_open2() or a custom one.
++ * - Unless the format is of the AVFMT_NOSTREAMS type, at least one stream must
++ *   be created with the avformat_new_stream() function. The caller should fill
++ *   the @ref AVStream.codecpar "stream codec parameters" information, such as the
++ *   codec @ref AVCodecParameters.codec_type "type", @ref AVCodecParameters.codec_id
++ *   "id" and other parameters (e.g. width / height, the pixel or sample format,
++ *   etc.) as known. The @ref AVStream.time_base "stream timebase" should
++ *   be set to the timebase that the caller desires to use for this stream (note
++ *   that the timebase actually used by the muxer can be different, as will be
++ *   described later).
++ * - It is advised to manually initialize only the relevant fields in
++ *   AVCodecParameters, rather than using @ref avcodec_parameters_copy() during
++ *   remuxing: there is no guarantee that the codec context values remain valid
++ *   for both input and output format contexts.
++ * - The caller may fill in additional information, such as @ref
++ *   AVFormatContext.metadata "global" or @ref AVStream.metadata "per-stream"
++ *   metadata, @ref AVFormatContext.chapters "chapters", @ref
++ *   AVFormatContext.programs "programs", etc. as described in the
++ *   AVFormatContext documentation. Whether such information will actually be
++ *   stored in the output depends on what the container format and the muxer
++ *   support.
++ *
++ * When the muxing context is fully set up, the caller must call
++ * avformat_write_header() to initialize the muxer internals and write the file
++ * header. Whether anything actually is written to the IO context at this step
++ * depends on the muxer, but this function must always be called. Any muxer
++ * private options must be passed in the options parameter to this function.
++ *
++ * The data is then sent to the muxer by repeatedly calling av_write_frame() or
++ * av_interleaved_write_frame() (consult those functions' documentation for
++ * discussion on the difference between them; only one of them may be used with
++ * a single muxing context, they should not be mixed). Do note that the timing
++ * information on the packets sent to the muxer must be in the corresponding
++ * AVStream's timebase. That timebase is set by the muxer (in the
++ * avformat_write_header() step) and may be different from the timebase
++ * requested by the caller.
++ *
++ * Once all the data has been written, the caller must call av_write_trailer()
++ * to flush any buffered packets and finalize the output file, then close the IO
++ * context (if any) and finally free the muxing context with
++ * avformat_free_context().
++ * @}
++ *
++ * @defgroup lavf_io I/O Read/Write
++ * @{
++ * @section lavf_io_dirlist Directory listing
++ * The directory listing API makes it possible to list files on remote servers.
++ *
++ * Some of possible use cases:
++ * - an "open file" dialog to choose files from a remote location,
++ * - a recursive media finder providing a player with an ability to play all
++ * files from a given directory.
++ *
++ * @subsection lavf_io_dirlist_open Opening a directory
++ * At first, a directory needs to be opened by calling avio_open_dir()
++ * supplied with a URL and, optionally, ::AVDictionary containing
++ * protocol-specific parameters. The function returns zero or positive
++ * integer and allocates AVIODirContext on success.
++ *
++ * @code
++ * AVIODirContext *ctx = NULL;
++ * if (avio_open_dir(&ctx, "smb://example.com/some_dir", NULL) < 0) {
++ *     fprintf(stderr, "Cannot open directory.\n");
++ *     abort();
++ * }
++ * @endcode
++ *
++ * This code tries to open a sample directory using smb protocol without
++ * any additional parameters.
++ *
++ * @subsection lavf_io_dirlist_read Reading entries
++ * Each directory's entry (i.e. file, another directory, anything else
++ * within ::AVIODirEntryType) is represented by AVIODirEntry.
++ * Reading consecutive entries from an opened AVIODirContext is done by
++ * repeatedly calling avio_read_dir() on it. Each call returns zero or
++ * positive integer if successful. Reading can be stopped right after the
++ * NULL entry has been read -- it means there are no entries left to be
++ * read. The following code reads all entries from a directory associated
++ * with ctx and prints their names to standard output.
++ * @code
++ * AVIODirEntry *entry = NULL;
++ * for (;;) {
++ *     if (avio_read_dir(ctx, &entry) < 0) {
++ *         fprintf(stderr, "Cannot list directory.\n");
++ *         abort();
++ *     }
++ *     if (!entry)
++ *         break;
++ *     printf("%s\n", entry->name);
++ *     avio_free_directory_entry(&entry);
++ * }
++ * @endcode
++ * @}
++ *
++ * @defgroup lavf_codec Demuxers
++ * @{
++ * @defgroup lavf_codec_native Native Demuxers
++ * @{
++ * @}
++ * @defgroup lavf_codec_wrappers External library wrappers
++ * @{
++ * @}
++ * @}
++ * @defgroup lavf_protos I/O Protocols
++ * @{
++ * @}
++ * @defgroup lavf_internal Internal
++ * @{
++ * @}
++ * @}
++ */
++
++#include <stdio.h>  /* FILE */
++
++#include "libavcodec/codec_par.h"
++#include "libavcodec/defs.h"
++#include "libavcodec/packet.h"
++
++#include "libavutil/dict.h"
++#include "libavutil/log.h"
++
++#include "avio.h"
++#include "libavformat/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 "libavformat/version.h"
++
++#include "libavutil/frame.h"
++#include "libavcodec/codec.h"
++#endif
++
++struct AVFormatContext;
++struct AVFrame;
++
++/**
++ * @defgroup metadata_api Public Metadata API
++ * @{
++ * @ingroup libavf
++ * The metadata API allows libavformat to export metadata tags to a client
++ * application when demuxing. Conversely it allows a client application to
++ * set metadata when muxing.
++ *
++ * Metadata is exported or set as pairs of key/value strings in the 'metadata'
++ * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs
++ * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg,
++ * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata
++ * exported by demuxers isn't checked to be valid UTF-8 in most cases.
++ *
++ * Important concepts to keep in mind:
++ * -  Keys are unique; there can never be 2 tags with the same key. This is
++ *    also meant semantically, i.e., a demuxer should not knowingly produce
++ *    several keys that are literally different but semantically identical.
++ *    E.g., key=Author5, key=Author6. In this example, all authors must be
++ *    placed in the same tag.
++ * -  Metadata is flat, not hierarchical; there are no subtags. If you
++ *    want to store, e.g., the email address of the child of producer Alice
++ *    and actor Bob, that could have key=alice_and_bobs_childs_email_address.
++ * -  Several modifiers can be applied to the tag name. This is done by
++ *    appending a dash character ('-') and the modifier name in the order
++ *    they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng.
++ *    -  language -- a tag whose value is localized for a particular language
++ *       is appended with the ISO 639-2/B 3-letter language code.
++ *       For example: Author-ger=Michael, Author-eng=Mike
++ *       The original/default language is in the unqualified "Author" tag.
++ *       A demuxer should set a default if it sets any translated tag.
++ *    -  sorting  -- a modified version of a tag that should be used for
++ *       sorting will have '-sort' appended. E.g. artist="The Beatles",
++ *       artist-sort="Beatles, The".
++ * - Some protocols and demuxers support metadata updates. After a successful
++ *   call to av_read_frame(), AVFormatContext.event_flags or AVStream.event_flags
++ *   will be updated to indicate if metadata changed. In order to detect metadata
++ *   changes on a stream, you need to loop through all streams in the AVFormatContext
++ *   and check their individual event_flags.
++ *
++ * -  Demuxers attempt to export metadata in a generic format, however tags
++ *    with no generic equivalents are left as they are stored in the container.
++ *    Follows a list of generic tag names:
++ *
++ @verbatim
++ album        -- name of the set this work belongs to
++ album_artist -- main creator of the set/album, if different from artist.
++                 e.g. "Various Artists" for compilation albums.
++ artist       -- main creator of the work
++ comment      -- any additional description of the file.
++ composer     -- who composed the work, if different from artist.
++ copyright    -- name of copyright holder.
++ creation_time-- date when the file was created, preferably in ISO 8601.
++ date         -- date when the work was created, preferably in ISO 8601.
++ disc         -- number of a subset, e.g. disc in a multi-disc collection.
++ disc_subtitle-- title of a subset, e.g. disc subtitle in a multi-disc collection.
++ encoder      -- name/settings of the software/hardware that produced the file.
++ encoded_by   -- person/group who created the file.
++ filename     -- original name of the file.
++ genre        -- <self-evident>.
++ language     -- main language in which the work is performed, preferably
++                 in ISO 639-2 format. Multiple languages can be specified by
++                 separating them with commas.
++ performer    -- artist who performed the work, if different from artist.
++                 E.g for "Also sprach Zarathustra", artist would be "Richard
++                 Strauss" and performer "London Philharmonic Orchestra".
++ publisher    -- name of the label/publisher.
++ service_name     -- name of the service in broadcasting (channel name).
++ service_provider -- name of the service provider in broadcasting.
++ title        -- name of the work.
++ track        -- number of this work in the set, can be in form current/total.
++ variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of
++ @endverbatim
++ *
++ * Look in the examples section for an application example how to use the Metadata API.
++ *
++ * @}
++ */
++
++/* packet functions */
++
++
++/**
++ * Allocate and read the payload of a packet and initialize its
++ * fields with default values.
++ *
++ * @param s    associated IO context
++ * @param pkt packet
++ * @param size desired payload size
++ * @return >0 (read size) if OK, AVERROR_xxx otherwise
++ */
++int av_get_packet(AVIOContext *s, AVPacket *pkt, int size);
++
++
++/**
++ * Read data and append it to the current content of the AVPacket.
++ * If pkt->size is 0 this is identical to av_get_packet.
++ * Note that this uses av_grow_packet and thus involves a realloc
++ * which is inefficient. Thus this function should only be used
++ * when there is no reasonable way to know (an upper bound of)
++ * the final size.
++ *
++ * @param s    associated IO context
++ * @param pkt packet
++ * @param size amount of data to read
++ * @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data
++ *         will not be lost even if an error occurs.
++ */
++int av_append_packet(AVIOContext *s, AVPacket *pkt, int size);
++
++/*************************************************/
++/* input/output formats */
++
++struct AVCodecTag;
++
++/**
++ * This structure contains the data a format has to probe a file.
++ */
++typedef struct AVProbeData {
++    const char *filename;
++    unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */
++    int buf_size;       /**< Size of buf except extra allocated bytes */
++    const char *mime_type; /**< mime_type, when known. */
++} AVProbeData;
++
++#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4)
++#define AVPROBE_SCORE_STREAM_RETRY (AVPROBE_SCORE_MAX/4-1)
++
++#define AVPROBE_SCORE_EXTENSION  50 ///< score for file extension
++#define AVPROBE_SCORE_MIME_BONUS 30 ///< score added for matching mime type
++#define AVPROBE_SCORE_MAX       100 ///< maximum score
++
++#define AVPROBE_PADDING_SIZE 32             ///< extra allocated bytes at the end of the probe buffer
++
++/// Demuxer will use avio_open, no opened file should be provided by the caller.
++#define AVFMT_NOFILE        0x0001
++#define AVFMT_NEEDNUMBER    0x0002 /**< Needs '%d' in filename. */
++/**
++ * The muxer/demuxer is experimental and should be used with caution.
++ *
++ * It will not be selected automatically, and must be specified explicitly.
++ */
++#define AVFMT_EXPERIMENTAL  0x0004
++#define AVFMT_SHOW_IDS      0x0008 /**< Show format stream IDs numbers. */
++#define AVFMT_GLOBALHEADER  0x0040 /**< Format wants global header. */
++#define AVFMT_NOTIMESTAMPS  0x0080 /**< Format does not need / have any timestamps. */
++#define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */
++#define AVFMT_TS_DISCONT    0x0200 /**< Format allows timestamp discontinuities. Note, muxers always require valid (monotone) timestamps */
++#define AVFMT_VARIABLE_FPS  0x0400 /**< Format allows variable fps. */
++#define AVFMT_NODIMENSIONS  0x0800 /**< Format does not need width/height */
++#define AVFMT_NOSTREAMS     0x1000 /**< Format does not require any streams */
++#define AVFMT_NOBINSEARCH   0x2000 /**< Format does not allow to fall back on binary search via read_timestamp */
++#define AVFMT_NOGENSEARCH   0x4000 /**< Format does not allow to fall back on generic search */
++#define AVFMT_NO_BYTE_SEEK  0x8000 /**< Format does not allow seeking by bytes */
++#define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly
++                                        increasing timestamps, but they must
++                                        still be monotonic */
++#define AVFMT_TS_NEGATIVE  0x40000 /**< Format allows muxing negative
++                                        timestamps. If not set the timestamp
++                                        will be shifted in av_write_frame and
++                                        av_interleaved_write_frame so they
++                                        start from 0.
++                                        The user or muxer can override this through
++                                        AVFormatContext.avoid_negative_ts
++                                        */
++#define AVFMT_FIXED_FRAMESIZE 0x80000 /**< Format wants @ref AVCodecParameters.frame_size "fixed size audio frames." */
++
++#define AVFMT_SEEK_TO_PTS   0x4000000 /**< Seeking is based on PTS */
++
++/**
++ * @addtogroup lavf_encoding
++ * @{
++ */
++typedef struct AVOutputFormat {
++    const char *name;
++    /**
++     * Descriptive name for the format, meant to be more human-readable
++     * than name. You should use the NULL_IF_CONFIG_SMALL() macro
++     * to define it.
++     */
++    const char *long_name;
++    const char *mime_type;
++    const char *extensions; /**< comma-separated filename extensions */
++    /* output support */
++    enum AVCodecID audio_codec;    /**< default audio codec */
++    enum AVCodecID video_codec;    /**< default video codec */
++    enum AVCodecID subtitle_codec; /**< default subtitle codec */
++    /**
++     * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_EXPERIMENTAL,
++     * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS,
++     * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS,
++     * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE, AVFMT_FIXED_FRAMESIZE
++     */
++    int flags;
++
++    /**
++     * List of supported codec_id-codec_tag pairs, ordered by "better
++     * choice first". The arrays are all terminated by AV_CODEC_ID_NONE.
++     */
++    const struct AVCodecTag * const *codec_tag;
++
++
++    const AVClass *priv_class; ///< AVClass for the private context
++} AVOutputFormat;
++/**
++ * @}
++ */
++
++/**
++ * @addtogroup lavf_decoding
++ * @{
++ */
++typedef struct AVInputFormat {
++    /**
++     * A comma separated list of short names for the format. New names
++     * may be appended with a minor bump.
++     */
++    const char *name;
++
++    /**
++     * Descriptive name for the format, meant to be more human-readable
++     * than name. You should use the NULL_IF_CONFIG_SMALL() macro
++     * to define it.
++     */
++    const char *long_name;
++
++    /**
++     * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_EXPERIMENTAL,
++     * AVFMT_SHOW_IDS, AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX,
++     * AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH, AVFMT_NOGENSEARCH,
++     * AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
++     */
++    int flags;
++
++    /**
++     * If extensions are defined, then no probe is done. You should
++     * usually not use extension format guessing because it is not
++     * reliable enough
++     */
++    const char *extensions;
++
++    const struct AVCodecTag * const *codec_tag;
++
++    const AVClass *priv_class; ///< AVClass for the private context
++
++    /**
++     * Comma-separated list of mime types.
++     * It is used check for matching mime types while probing.
++     * @see av_probe_input_format2
++     */
++    const char *mime_type;
++} AVInputFormat;
++/**
++ * @}
++ */
++
++enum AVStreamParseType {
++    AVSTREAM_PARSE_NONE,
++    AVSTREAM_PARSE_FULL,       /**< full parsing and repack */
++    AVSTREAM_PARSE_HEADERS,    /**< Only parse headers, do not repack. */
++    AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */
++    AVSTREAM_PARSE_FULL_ONCE,  /**< full parsing and repack of the first frame only, only implemented for H.264 currently */
++    AVSTREAM_PARSE_FULL_RAW,   /**< full parsing and repack with timestamp and position generation by parser for raw
++                                    this assumes that each packet in the file contains no demuxer level headers and
++                                    just codec level data, otherwise position generation would fail */
++};
++
++typedef struct AVIndexEntry {
++    int64_t pos;
++    int64_t timestamp;        /**<
++                               * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available
++                               * when seeking to this entry. That means preferable PTS on keyframe based formats.
++                               * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better
++                               * is known
++                               */
++#define AVINDEX_KEYFRAME 0x0001
++#define AVINDEX_DISCARD_FRAME  0x0002    /**
++                                          * Flag is used to indicate which frame should be discarded after decoding.
++                                          */
++    int flags:2;
++    int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment).
++    int min_distance;         /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */
++} AVIndexEntry;
++
++/**
++ * The stream should be chosen by default among other streams of the same type,
++ * unless the user has explicitly specified otherwise.
++ */
++#define AV_DISPOSITION_DEFAULT              (1 << 0)
++/**
++ * The stream is not in original language.
++ *
++ * @note AV_DISPOSITION_ORIGINAL is the inverse of this disposition. At most
++ *       one of them should be set in properly tagged streams.
++ * @note This disposition may apply to any stream type, not just audio.
++ */
++#define AV_DISPOSITION_DUB                  (1 << 1)
++/**
++ * The stream is in original language.
++ *
++ * @see the notes for AV_DISPOSITION_DUB
++ */
++#define AV_DISPOSITION_ORIGINAL             (1 << 2)
++/**
++ * The stream is a commentary track.
++ */
++#define AV_DISPOSITION_COMMENT              (1 << 3)
++/**
++ * The stream contains song lyrics.
++ */
++#define AV_DISPOSITION_LYRICS               (1 << 4)
++/**
++ * The stream contains karaoke audio.
++ */
++#define AV_DISPOSITION_KARAOKE              (1 << 5)
++
++/**
++ * Track should be used during playback by default.
++ * Useful for subtitle track that should be displayed
++ * even when user did not explicitly ask for subtitles.
++ */
++#define AV_DISPOSITION_FORCED               (1 << 6)
++/**
++ * The stream is intended for hearing impaired audiences.
++ */
++#define AV_DISPOSITION_HEARING_IMPAIRED     (1 << 7)
++/**
++ * The stream is intended for visually impaired audiences.
++ */
++#define AV_DISPOSITION_VISUAL_IMPAIRED      (1 << 8)
++/**
++ * The audio stream contains music and sound effects without voice.
++ */
++#define AV_DISPOSITION_CLEAN_EFFECTS        (1 << 9)
++/**
++ * The stream is stored in the file as an attached picture/"cover art" (e.g.
++ * APIC frame in ID3v2). The first (usually only) packet associated with it
++ * will be returned among the first few packets read from the file unless
++ * seeking takes place. It can also be accessed at any time in
++ * AVStream.attached_pic.
++ */
++#define AV_DISPOSITION_ATTACHED_PIC         (1 << 10)
++/**
++ * The stream is sparse, and contains thumbnail images, often corresponding
++ * to chapter markers. Only ever used with AV_DISPOSITION_ATTACHED_PIC.
++ */
++#define AV_DISPOSITION_TIMED_THUMBNAILS     (1 << 11)
++
++/**
++ * The stream is intended to be mixed with a spatial audio track. For example,
++ * it could be used for narration or stereo music, and may remain unchanged by
++ * listener head rotation.
++ */
++#define AV_DISPOSITION_NON_DIEGETIC         (1 << 12)
++
++/**
++ * The subtitle stream contains captions, providing a transcription and possibly
++ * a translation of audio. Typically intended for hearing-impaired audiences.
++ */
++#define AV_DISPOSITION_CAPTIONS             (1 << 16)
++/**
++ * The subtitle stream contains a textual description of the video content.
++ * Typically intended for visually-impaired audiences or for the cases where the
++ * video cannot be seen.
++ */
++#define AV_DISPOSITION_DESCRIPTIONS         (1 << 17)
++/**
++ * The subtitle stream contains time-aligned metadata that is not intended to be
++ * directly presented to the user.
++ */
++#define AV_DISPOSITION_METADATA             (1 << 18)
++/**
++ * The stream is intended to be mixed with another stream before presentation.
++ * Used for example to signal the stream contains an image part of a HEIF grid,
++ * or for mix_type=0 in mpegts.
++ */
++#define AV_DISPOSITION_DEPENDENT            (1 << 19)
++/**
++ * The video stream contains still images.
++ */
++#define AV_DISPOSITION_STILL_IMAGE          (1 << 20)
++/**
++ * The video stream contains multiple layers, e.g. stereoscopic views (cf. H.264
++ * Annex G/H, or HEVC Annex F).
++ */
++#define AV_DISPOSITION_MULTILAYER           (1 << 21)
++
++/**
++ * @return The AV_DISPOSITION_* flag corresponding to disp or a negative error
++ *         code if disp does not correspond to a known stream disposition.
++ */
++int av_disposition_from_string(const char *disp);
++
++/**
++ * @param disposition a combination of AV_DISPOSITION_* values
++ * @return The string description corresponding to the lowest set bit in
++ *         disposition. NULL when the lowest set bit does not correspond
++ *         to a known disposition or when disposition is 0.
++ */
++const char *av_disposition_to_string(int disposition);
++
++/**
++ * Options for behavior on timestamp wrap detection.
++ */
++#define AV_PTS_WRAP_IGNORE      0   ///< ignore the wrap
++#define AV_PTS_WRAP_ADD_OFFSET  1   ///< add the format specific offset on wrap detection
++#define AV_PTS_WRAP_SUB_OFFSET  -1  ///< subtract the format specific offset on wrap detection
++
++/**
++ * Stream 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.
++ * sizeof(AVStream) must not be used outside libav*.
++ */
++typedef struct AVStream {
++    /**
++     * A class for @ref avoptions. Set on stream creation.
++     */
++    const AVClass *av_class;
++
++    int index;    /**< stream index in AVFormatContext */
++    /**
++     * Format-specific stream ID.
++     * decoding: set by libavformat
++     * encoding: set by the user, replaced by libavformat if left unset
++     */
++    int id;
++
++    /**
++     * Codec parameters associated with this stream. Allocated and freed by
++     * libavformat in avformat_new_stream() and avformat_free_context()
++     * respectively.
++     *
++     * - demuxing: filled by libavformat on stream creation or in
++     *             avformat_find_stream_info()
++     * - muxing: filled by the caller before avformat_write_header()
++     */
++    AVCodecParameters *codecpar;
++
++    void *priv_data;
++
++    /**
++     * This is the fundamental unit of time (in seconds) in terms
++     * of which frame timestamps are represented.
++     *
++     * decoding: set by libavformat
++     * encoding: May be set by the caller before avformat_write_header() to
++     *           provide a hint to the muxer about the desired timebase. In
++     *           avformat_write_header(), the muxer will overwrite this field
++     *           with the timebase that will actually be used for the timestamps
++     *           written into the file (which may or may not be related to the
++     *           user-provided one, depending on the format).
++     */
++    AVRational time_base;
++
++    /**
++     * Decoding: pts of the first frame of the stream in presentation order, in stream time base.
++     * Only set this if you are absolutely 100% sure that the value you set
++     * it to really is the pts of the first frame.
++     * This may be undefined (AV_NOPTS_VALUE).
++     * @note The ASF header does NOT contain a correct start_time the ASF
++     * demuxer must NOT set this.
++     */
++    int64_t start_time;
++
++    /**
++     * Decoding: duration of the stream, in stream time base.
++     * If a source file does not specify a duration, but does specify
++     * a bitrate, this value will be estimated from bitrate and file size.
++     *
++     * Encoding: May be set by the caller before avformat_write_header() to
++     * provide a hint to the muxer about the estimated duration.
++     */
++    int64_t duration;
++
++    int64_t nb_frames;                 ///< number of frames in this stream if known or 0
++
++    /**
++     * Stream disposition - a combination of AV_DISPOSITION_* flags.
++     * - demuxing: set by libavformat when creating the stream or in
++     *             avformat_find_stream_info().
++     * - muxing: may be set by the caller before avformat_write_header().
++     */
++    int disposition;
++
++    enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed.
++
++    /**
++     * sample aspect ratio (0 if unknown)
++     * - encoding: Set by user.
++     * - decoding: Set by libavformat.
++     */
++    AVRational sample_aspect_ratio;
++
++    AVDictionary *metadata;
++
++    /**
++     * Average framerate
++     *
++     * - demuxing: May be set by libavformat when creating the stream or in
++     *             avformat_find_stream_info().
++     * - muxing: May be set by the caller before avformat_write_header().
++     */
++    AVRational avg_frame_rate;
++
++    /**
++     * For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet
++     * will contain the attached picture.
++     *
++     * decoding: set by libavformat, must not be modified by the caller.
++     * encoding: unused
++     */
++    AVPacket attached_pic;
++
++    /**
++     * Flags indicating events happening on the stream, a combination of
++     * AVSTREAM_EVENT_FLAG_*.
++     *
++     * - demuxing: may be set by the demuxer in avformat_open_input(),
++     *   avformat_find_stream_info() and av_read_frame(). Flags must be cleared
++     *   by the user once the event has been handled.
++     * - muxing: may be set by the user after avformat_write_header(). to
++     *   indicate a user-triggered event.  The muxer will clear the flags for
++     *   events it has handled in av_[interleaved]_write_frame().
++     */
++    int event_flags;
++/**
++ * - demuxing: the demuxer read new metadata from the file and updated
++ *     AVStream.metadata accordingly
++ * - muxing: the user updated AVStream.metadata and wishes the muxer to write
++ *     it into the file
++ */
++#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001
++/**
++ * - demuxing: new packets for this stream were read from the file. This
++ *   event is informational only and does not guarantee that new packets
++ *   for this stream will necessarily be returned from av_read_frame().
++ */
++#define AVSTREAM_EVENT_FLAG_NEW_PACKETS (1 << 1)
++
++    /**
++     * Real base framerate of the stream.
++     * This is the lowest framerate with which all timestamps can be
++     * represented accurately (it is the least common multiple of all
++     * framerates in the stream). Note, this value is just a guess!
++     * For example, if the time base is 1/90000 and all frames have either
++     * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1.
++     */
++    AVRational r_frame_rate;
++
++    /**
++     * Number of bits in timestamps. Used for wrapping control.
++     *
++     * - demuxing: set by libavformat
++     * - muxing: set by libavformat
++     *
++     */
++    int pts_wrap_bits;
++} AVStream;
++
++/**
++ * AVStreamGroupTileGrid holds information on how to combine several
++ * independent images on a single canvas for presentation.
++ *
++ * The output should be a @ref AVStreamGroupTileGrid.background "background"
++ * colored @ref AVStreamGroupTileGrid.coded_width "coded_width" x
++ * @ref AVStreamGroupTileGrid.coded_height "coded_height" canvas where a
++ * @ref AVStreamGroupTileGrid.nb_tiles "nb_tiles" amount of tiles are placed in
++ * the order they appear in the @ref AVStreamGroupTileGrid.offsets "offsets"
++ * array, at the exact offset described for them. In particular, if two or more
++ * tiles overlap, the image with higher index in the
++ * @ref AVStreamGroupTileGrid.offsets "offsets" array takes priority.
++ * Note that a single image may be used multiple times, i.e. multiple entries
++ * in @ref AVStreamGroupTileGrid.offsets "offsets" may have the same value of
++ * idx.
++ *
++ * The following is an example of a simple grid with 3 rows and 4 columns:
++ *
++ * +---+---+---+---+
++ * | 0 | 1 | 2 | 3 |
++ * +---+---+---+---+
++ * | 4 | 5 | 6 | 7 |
++ * +---+---+---+---+
++ * | 8 | 9 |10 |11 |
++ * +---+---+---+---+
++ *
++ * Assuming all tiles have a dimension of 512x512, the
++ * @ref AVStreamGroupTileGrid.offsets "offset" of the topleft pixel of
++ * the first @ref AVStreamGroup.streams "stream" in the group is "0,0", the
++ * @ref AVStreamGroupTileGrid.offsets "offset" of the topleft pixel of
++ * the second @ref AVStreamGroup.streams "stream" in the group is "512,0", the
++ * @ref AVStreamGroupTileGrid.offsets "offset" of the topleft pixel of
++ * the fifth @ref AVStreamGroup.streams "stream" in the group is "0,512", the
++ * @ref AVStreamGroupTileGrid.offsets "offset", of the topleft pixel of
++ * the sixth @ref AVStreamGroup.streams "stream" in the group is "512,512",
++ * etc.
++ *
++ * The following is an example of a canvas with overlapping tiles:
++ *
++ * +-----------+
++ * |   %%%%%   |
++ * |***%%3%%@@@|
++ * |**0%%%%%2@@|
++ * |***##1@@@@@|
++ * |   #####   |
++ * +-----------+
++ *
++ * Assuming a canvas with size 1024x1024 and all tiles with a dimension of
++ * 512x512, a possible @ref AVStreamGroupTileGrid.offsets "offset" for the
++ * topleft pixel of the first @ref AVStreamGroup.streams "stream" in the group
++ * would be 0x256, the @ref AVStreamGroupTileGrid.offsets "offset" for the
++ * topleft pixel of the second @ref AVStreamGroup.streams "stream" in the group
++ * would be 256x512, the @ref AVStreamGroupTileGrid.offsets "offset" for the
++ * topleft pixel of the third @ref AVStreamGroup.streams "stream" in the group
++ * would be 512x256, and the @ref AVStreamGroupTileGrid.offsets "offset" for
++ * the topleft pixel of the fourth @ref AVStreamGroup.streams "stream" in the
++ * group would be 256x0.
++ *
++ * sizeof(AVStreamGroupTileGrid) is not a part of the ABI and may only be
++ * allocated by avformat_stream_group_create().
++ */
++typedef struct AVStreamGroupTileGrid {
++    const AVClass *av_class;
++
++    /**
++     * Amount of tiles in the grid.
++     *
++     * Must be > 0.
++     */
++    unsigned int nb_tiles;
++
++    /**
++     * Width of the canvas.
++     *
++     * Must be > 0.
++     */
++    int coded_width;
++    /**
++     * Width of the canvas.
++     *
++     * Must be > 0.
++     */
++    int coded_height;
++
++    /**
++     * An @ref nb_tiles sized array of offsets in pixels from the topleft edge
++     * of the canvas, indicating where each stream should be placed.
++     * It must be allocated with the av_malloc() family of functions.
++     *
++     * - demuxing: set by libavformat, must not be modified by the caller.
++     * - muxing: set by the caller before avformat_write_header().
++     *
++     * Freed by libavformat in avformat_free_context().
++     */
++    struct {
++        /**
++         * Index of the stream in the group this tile references.
++         *
++         * Must be < @ref AVStreamGroup.nb_streams "nb_streams".
++         */
++        unsigned int idx;
++        /**
++         * Offset in pixels from the left edge of the canvas where the tile
++         * should be placed.
++         */
++        int horizontal;
++        /**
++         * Offset in pixels from the top edge of the canvas where the tile
++         * should be placed.
++         */
++        int vertical;
++    } *offsets;
++
++    /**
++     * The pixel value per channel in RGBA format used if no pixel of any tile
++     * is located at a particular pixel location.
++     *
++     * @see av_image_fill_color().
++     * @see av_parse_color().
++     */
++    uint8_t background[4];
++
++    /**
++     * Offset in pixels from the left edge of the canvas where the actual image
++     * meant for presentation starts.
++     *
++     * This field must be >= 0 and < @ref coded_width.
++     */
++    int horizontal_offset;
++    /**
++     * Offset in pixels from the top edge of the canvas where the actual image
++     * meant for presentation starts.
++     *
++     * This field must be >= 0 and < @ref coded_height.
++     */
++    int vertical_offset;
++
++    /**
++     * Width of the final image for presentation.
++     *
++     * Must be > 0 and <= (@ref coded_width - @ref horizontal_offset).
++     * When it's not equal to (@ref coded_width - @ref horizontal_offset), the
++     * result of (@ref coded_width - width - @ref horizontal_offset) is the
++     * amount amount of pixels to be cropped from the right edge of the
++     * final image before presentation.
++     */
++    int width;
++    /**
++     * Height of the final image for presentation.
++     *
++     * Must be > 0 and <= (@ref coded_height - @ref vertical_offset).
++     * When it's not equal to (@ref coded_height - @ref vertical_offset), the
++     * result of (@ref coded_height - height - @ref vertical_offset) is the
++     * amount amount of pixels to be cropped from the bottom edge of the
++     * final image before presentation.
++     */
++    int height;
++
++    /**
++     * Additional data associated with the grid.
++     *
++     * Should be allocated with av_packet_side_data_new() or
++     * av_packet_side_data_add(), and will be freed by avformat_free_context().
++     */
++    AVPacketSideData *coded_side_data;
++
++    /**
++     * Amount of entries in @ref coded_side_data.
++     */
++    int nb_coded_side_data;
++} AVStreamGroupTileGrid;
++
++/**
++ * AVStreamGroupLayeredVideo is meant to define the relation between a base
++ * layer video stream and a separate enhancement layer stream that together
++ * form a single layered video presentation (for example a video stream and a
++ * data stream containing LCEVC enhancement layer NALUs, or Dolby Vision
++ * Profile 7 dual-layer encoding).
++ *
++ * The enhancement layer stream is identified by @ref el_index.
++ */
++typedef struct AVStreamGroupLayeredVideo {
++    const AVClass *av_class;
++
++    /**
++     * Index of the enhancement layer stream in AVStreamGroup.
++     */
++#if FF_API_LCEVC_STRUCT
++    union {
++#endif
++        unsigned int el_index;
++#if FF_API_LCEVC_STRUCT
++        /**
++         * Alias for @ref el_index, kept for backward compatibility.
++         */
++        attribute_deprecated
++        unsigned int lcevc_index;
++    };
++#endif
++    /**
++     * Width of the final stream for presentation.
++     */
++    int width;
++    /**
++     * Height of the final image for presentation.
++     */
++    int height;
++} AVStreamGroupLayeredVideo;
++
++#if FF_API_LCEVC_STRUCT
++/**
++ * Alias kept for backward compatibility.
++ *
++ * AVStreamGroupLCEVC was renamed to @ref AVStreamGroupLayeredVideo.
++ */
++#define AVStreamGroupLCEVC AVStreamGroupLayeredVideo
++#endif
++
++/**
++ * AVStreamGroupTREF is meant to define the relation between video, audio,
++ * or subtitle streams, and a data stream containing metadata.
++ *
++ * No more than one stream of @ref AVCodecParameters.codec_type "codec_type"
++ * AVMEDIA_TYPE_DATA shall be present.
++ */
++typedef struct AVStreamGroupTREF {
++    const AVClass *av_class;
++
++    /**
++     * Index of the metadata stream in the AVStreamGroup.
++     */
++    unsigned int metadata_index;
++} AVStreamGroupTREF;
++
++enum AVStreamGroupParamsType {
++    AV_STREAM_GROUP_PARAMS_NONE,
++    AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT,
++    AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION,
++    AV_STREAM_GROUP_PARAMS_TILE_GRID,
++    AV_STREAM_GROUP_PARAMS_LCEVC,
++    AV_STREAM_GROUP_PARAMS_TREF,
++    AV_STREAM_GROUP_PARAMS_DOLBY_VISION,
++};
++
++struct AVIAMFAudioElement;
++struct AVIAMFMixPresentation;
++
++typedef struct AVStreamGroup {
++    /**
++     * A class for @ref avoptions. Set by avformat_stream_group_create().
++     */
++    const AVClass *av_class;
++
++    void *priv_data;
++
++    /**
++     * Group index in AVFormatContext.
++     */
++    unsigned int index;
++
++    /**
++     * Group type-specific group ID.
++     *
++     * decoding: set by libavformat
++     * encoding: may set by the user
++     */
++    int64_t id;
++
++    /**
++     * Group type
++     *
++     * decoding: set by libavformat on group creation
++     * encoding: set by avformat_stream_group_create()
++     */
++    enum AVStreamGroupParamsType type;
++
++    /**
++     * Group type-specific parameters
++     */
++    union {
++        struct AVIAMFAudioElement *iamf_audio_element;
++        struct AVIAMFMixPresentation *iamf_mix_presentation;
++        struct AVStreamGroupTileGrid *tile_grid;
++        struct AVStreamGroupLayeredVideo *layered_video;
++#if FF_API_LCEVC_STRUCT
++        /**
++         * deprecated, use layered_video.
++         */
++        attribute_deprecated
++        struct AVStreamGroupLCEVC *lcevc;
++#endif
++        struct AVStreamGroupTREF *tref;
++    } params;
++
++    /**
++     * Metadata that applies to the whole group.
++     *
++     * - demuxing: set by libavformat on group creation
++     * - muxing: may be set by the caller before avformat_write_header()
++     *
++     * Freed by libavformat in avformat_free_context().
++     */
++    AVDictionary *metadata;
++
++    /**
++     * Number of elements in AVStreamGroup.streams.
++     *
++     * Set by avformat_stream_group_add_stream() must not be modified by any other code.
++     */
++    unsigned int nb_streams;
++
++    /**
++     * A list of streams in the group. New entries are created with
++     * avformat_stream_group_add_stream().
++     *
++     * - demuxing: entries are created by libavformat on group creation.
++     *             If AVFMTCTX_NOHEADER is set in ctx_flags, then new entries may also
++     *             appear in av_read_frame().
++     * - muxing: entries are created by the user before avformat_write_header().
++     *
++     * Freed by libavformat in avformat_free_context().
++     */
++    AVStream **streams;
++
++    /**
++     * Stream group disposition - a combination of AV_DISPOSITION_* flags.
++     * This field currently applies to all defined AVStreamGroupParamsType.
++     *
++     * - demuxing: set by libavformat when creating the group or in
++     *             avformat_find_stream_info().
++     * - muxing: may be set by the caller before avformat_write_header().
++     */
++    int disposition;
++} AVStreamGroup;
++
++struct AVCodecParserContext *av_stream_get_parser(const AVStream *s);
++
++#define AV_PROGRAM_RUNNING 1
++
++/**
++ * New fields can be added to the end with minor version bumps.
++ * Removal, reordering and changes to existing fields require a major
++ * version bump.
++ * sizeof(AVProgram) must not be used outside libav*.
++ */
++typedef struct AVProgram {
++    int            id;
++    int            flags;
++    enum AVDiscard discard;        ///< selects which program to discard and which to feed to the caller
++    unsigned int   *stream_index;
++    unsigned int   nb_stream_indexes;
++    AVDictionary *metadata;
++
++    int program_num;
++    int pmt_pid;
++    int pcr_pid;
++    int pmt_version;
++
++    /*****************************************************************
++     * All fields below this line are not part of the public API. They
++     * may not be used outside of libavformat and can be changed and
++     * removed at will.
++     * New public fields should be added right above.
++     *****************************************************************
++     */
++    int64_t start_time;
++    int64_t end_time;
++
++    int64_t pts_wrap_reference;    ///< reference dts for wrap detection
++    int pts_wrap_behavior;         ///< behavior on wrap detection
++} AVProgram;
++
++#define AVFMTCTX_NOHEADER      0x0001 /**< signal that no header is present
++                                         (streams are added dynamically) */
++#define AVFMTCTX_UNSEEKABLE    0x0002 /**< signal that the stream is definitely
++                                         not seekable, and attempts to call the
++                                         seek function will fail. For some
++                                         network protocols (e.g. HLS), this can
++                                         change dynamically at runtime. */
++
++typedef struct AVChapter {
++    int64_t id;             ///< unique ID to identify the chapter
++    AVRational time_base;   ///< time base in which the start/end timestamps are specified
++    int64_t start, end;     ///< chapter start/end time in time_base units
++    AVDictionary *metadata;
++} AVChapter;
++
++
++/**
++ * Callback used by devices to communicate with application.
++ */
++typedef int (*av_format_control_message)(struct AVFormatContext *s, int type,
++                                         void *data, size_t data_size);
++
++typedef int (*AVOpenCallback)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags,
++                              const AVIOInterruptCB *int_cb, AVDictionary **options);
++
++/**
++ * The duration of a video can be estimated through various ways, and this enum can be used
++ * to know how the duration was estimated.
++ */
++enum AVDurationEstimationMethod {
++    AVFMT_DURATION_FROM_PTS,    ///< Duration accurately estimated from PTSes
++    AVFMT_DURATION_FROM_STREAM, ///< Duration estimated from a stream with a known duration
++    AVFMT_DURATION_FROM_BITRATE ///< Duration estimated from bitrate (less accurate)
++};
++
++/**
++ * Format I/O context.
++ * New fields can be added to the end with minor version bumps.
++ * Removal, reordering and changes to existing fields require a major
++ * version bump.
++ * sizeof(AVFormatContext) must not be used outside libav*, use
++ * avformat_alloc_context() to create an AVFormatContext.
++ *
++ * Fields can be accessed through AVOptions (av_opt*),
++ * the name string used matches the associated command line parameter name and
++ * can be found in libavformat/options_table.h.
++ * The AVOption/command line parameter names differ in some cases from the C
++ * structure field names for historic reasons or brevity.
++ */
++typedef struct AVFormatContext {
++    /**
++     * A class for logging and @ref avoptions. Set by avformat_alloc_context().
++     * Exports (de)muxer private options if they exist.
++     */
++    const AVClass *av_class;
++
++    /**
++     * The input container format.
++     *
++     * Demuxing only, set by avformat_open_input().
++     */
++    const struct AVInputFormat *iformat;
++
++    /**
++     * The output container format.
++     *
++     * Muxing only, must be set by the caller before avformat_write_header().
++     */
++    const struct AVOutputFormat *oformat;
++
++    /**
++     * Format private data. This is an AVOptions-enabled struct
++     * if and only if iformat/oformat.priv_class is not NULL.
++     *
++     * - muxing: set by avformat_write_header()
++     * - demuxing: set by avformat_open_input()
++     */
++    void *priv_data;
++
++    /**
++     * I/O context.
++     *
++     * - demuxing: either set by the user before avformat_open_input() (then
++     *             the user must close it manually) or set by avformat_open_input().
++     * - muxing: set by the user before avformat_write_header(). The caller must
++     *           take care of closing / freeing the IO context.
++     *
++     * Do NOT set this field if AVFMT_NOFILE flag is set in
++     * iformat/oformat.flags. In such a case, the (de)muxer will handle
++     * I/O in some other way and this field will be NULL.
++     */
++    AVIOContext *pb;
++
++    /* stream info */
++    /**
++     * Flags signalling stream properties. A combination of AVFMTCTX_*.
++     * Set by libavformat.
++     */
++    int ctx_flags;
++
++    /**
++     * Number of elements in AVFormatContext.streams.
++     *
++     * Set by avformat_new_stream(), must not be modified by any other code.
++     */
++    unsigned int nb_streams;
++    /**
++     * A list of all streams in the file. New streams are created with
++     * avformat_new_stream().
++     *
++     * - demuxing: streams are created by libavformat in avformat_open_input().
++     *             If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also
++     *             appear in av_read_frame().
++     * - muxing: streams are created by the user before avformat_write_header().
++     *
++     * Freed by libavformat in avformat_free_context().
++     */
++    AVStream **streams;
++
++    /**
++     * Number of elements in AVFormatContext.stream_groups.
++     *
++     * Set by avformat_stream_group_create(), must not be modified by any other code.
++     */
++    unsigned int nb_stream_groups;
++    /**
++     * A list of all stream groups in the file. New groups are created with
++     * avformat_stream_group_create(), and filled with avformat_stream_group_add_stream().
++     *
++     * - demuxing: groups may be created by libavformat in avformat_open_input().
++     *             If AVFMTCTX_NOHEADER is set in ctx_flags, then new groups may also
++     *             appear in av_read_frame().
++     * - muxing: groups may be created by the user before avformat_write_header().
++     *
++     * Freed by libavformat in avformat_free_context().
++     */
++    AVStreamGroup **stream_groups;
++
++    /**
++     * Number of chapters in AVChapter array.
++     * When muxing, chapters are normally written in the file header,
++     * so nb_chapters should normally be initialized before write_header
++     * is called. Some muxers (e.g. mov and mkv) can also write chapters
++     * in the trailer.  To write chapters in the trailer, nb_chapters
++     * must be zero when write_header is called and non-zero when
++     * write_trailer is called.
++     * - muxing: set by user
++     * - demuxing: set by libavformat
++     */
++    unsigned int nb_chapters;
++    AVChapter **chapters;
++
++    /**
++     * input or output URL. Unlike the old filename field, this field has no
++     * length restriction.
++     *
++     * - demuxing: set by avformat_open_input(), initialized to an empty
++     *             string if url parameter was NULL in avformat_open_input().
++     * - muxing: may be set by the caller before calling avformat_write_header()
++     *           (or avformat_init_output() if that is called first) to a string
++     *           which is freeable by av_free(). Set to an empty string if it
++     *           was NULL in avformat_init_output().
++     *
++     * Freed by libavformat in avformat_free_context().
++     */
++    char *url;
++
++    /**
++     * Position of the first frame of the component, in
++     * AV_TIME_BASE fractional seconds. NEVER set this value directly:
++     * It is deduced from the AVStream values.
++     *
++     * Demuxing only, set by libavformat.
++     */
++    int64_t start_time;
++
++    /**
++     * Duration of the stream, in AV_TIME_BASE fractional
++     * seconds. Only set this value if you know none of the individual stream
++     * durations and also do not set any of them. This is deduced from the
++     * AVStream values if not set.
++     *
++     * Demuxing only, set by libavformat.
++     */
++    int64_t duration;
++
++    /**
++     * Total stream bitrate in bit/s, 0 if not
++     * available. Never set it directly if the file_size and the
++     * duration are known as FFmpeg can compute it automatically.
++     */
++    int64_t bit_rate;
++
++    unsigned int packet_size;
++    int max_delay;
++
++    /**
++     * Flags modifying the (de)muxer behaviour. A combination of AVFMT_FLAG_*.
++     * Set by the user before avformat_open_input() / avformat_write_header().
++     */
++    int flags;
++#define AVFMT_FLAG_GENPTS       0x0001 ///< Generate missing pts even if it requires parsing future frames.
++#define AVFMT_FLAG_IGNIDX       0x0002 ///< Ignore index.
++#define AVFMT_FLAG_NONBLOCK     0x0004 ///< Do not block when reading packets from input.
++#define AVFMT_FLAG_IGNDTS       0x0008 ///< Ignore DTS on frames that contain both DTS & PTS
++#define AVFMT_FLAG_NOFILLIN     0x0010 ///< Do not infer any values from other values, just return what is stored in the container
++#define AVFMT_FLAG_NOPARSE      0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the filling code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled
++#define AVFMT_FLAG_NOBUFFER     0x0040 ///< Do not buffer frames when possible
++#define AVFMT_FLAG_CUSTOM_IO    0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it.
++#define AVFMT_FLAG_DISCARD_CORRUPT  0x0100 ///< Discard frames marked corrupted
++#define AVFMT_FLAG_FLUSH_PACKETS    0x0200 ///< Flush the AVIOContext every packet.
++/**
++ * When muxing, try to avoid writing any random/volatile data to the output.
++ * This includes any random IDs, real-time timestamps/dates, muxer version, etc.
++ *
++ * This flag is mainly intended for testing.
++ */
++#define AVFMT_FLAG_BITEXACT         0x0400
++#define AVFMT_FLAG_SORT_DTS    0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down)
++#define AVFMT_FLAG_FAST_SEEK   0x80000 ///< Enable fast, but inaccurate seeks for some formats
++#define AVFMT_FLAG_AUTO_BSF   0x200000 ///< Add bitstream filters as requested by the muxer
++
++    /**
++     * Maximum number of bytes read from input in order to determine stream
++     * properties. Used when reading the global header and in
++     * avformat_find_stream_info().
++     *
++     * Demuxing only, set by the caller before avformat_open_input().
++     *
++     * @note this is \e not  used for determining the \ref AVInputFormat
++     *       "input format"
++     * @see format_probesize
++     */
++    int64_t probesize;
++
++    /**
++     * Maximum duration (in AV_TIME_BASE units) of the data read
++     * from input in avformat_find_stream_info().
++     * Demuxing only, set by the caller before avformat_find_stream_info().
++     * Can be set to 0 to let avformat choose using a heuristic.
++     */
++    int64_t max_analyze_duration;
++
++    const uint8_t *key;
++    int keylen;
++
++    unsigned int nb_programs;
++    AVProgram **programs;
++
++    /**
++     * Forced video codec_id.
++     * Demuxing: Set by user.
++     */
++    enum AVCodecID video_codec_id;
++
++    /**
++     * Forced audio codec_id.
++     * Demuxing: Set by user.
++     */
++    enum AVCodecID audio_codec_id;
++
++    /**
++     * Forced subtitle codec_id.
++     * Demuxing: Set by user.
++     */
++    enum AVCodecID subtitle_codec_id;
++
++    /**
++     * Forced Data codec_id.
++     * Demuxing: Set by user.
++     */
++    enum AVCodecID data_codec_id;
++
++    /**
++     * Metadata that applies to the whole file.
++     *
++     * - demuxing: set by libavformat in avformat_open_input()
++     * - muxing: may be set by the caller before avformat_write_header()
++     *
++     * Freed by libavformat in avformat_free_context().
++     */
++    AVDictionary *metadata;
++
++    /**
++     * Start time of the stream in real world time, in microseconds
++     * since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the
++     * stream was captured at this real world time.
++     * - muxing: Set by the caller before avformat_write_header(). If set to
++     *           either 0 or AV_NOPTS_VALUE, then the current wall-time will
++     *           be used.
++     * - demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that
++     *             the value may become known after some number of frames
++     *             have been received.
++     */
++    int64_t start_time_realtime;
++
++    /**
++     * The number of frames used for determining the framerate in
++     * avformat_find_stream_info().
++     * Demuxing only, set by the caller before avformat_find_stream_info().
++     */
++    int fps_probe_size;
++
++    /**
++     * Error recognition; higher values will detect more errors but may
++     * misdetect some more or less valid parts as errors.
++     * Demuxing only, set by the caller before avformat_open_input().
++     */
++    int error_recognition;
++
++    /**
++     * Custom interrupt callbacks for the I/O layer.
++     *
++     * demuxing: set by the user before avformat_open_input().
++     * muxing: set by the user before avformat_write_header()
++     * (mainly useful for AVFMT_NOFILE formats). The callback
++     * should also be passed to avio_open2() if it's used to
++     * open the file.
++     */
++    AVIOInterruptCB interrupt_callback;
++
++    /**
++     * Flags to enable debugging.
++     */
++    int debug;
++#define AV_FDEBUG_TS        0x0001
++#define AV_FDEBUG_ID3V2     0x0002
++
++#if FF_API_FDEBUG_TS
++#define FF_FDEBUG_TS AV_FDEBUG_TS
++#endif
++
++    /**
++     * The maximum number of streams.
++     * - encoding: unused
++     * - decoding: set by user
++     */
++    int max_streams;
++
++    /**
++     * Maximum amount of memory in bytes to use for the index of each stream.
++     * If the index exceeds this size, entries will be discarded as
++     * needed to maintain a smaller size. This can lead to slower or less
++     * accurate seeking (depends on demuxer).
++     * Demuxers for which a full in-memory index is mandatory will ignore
++     * this.
++     * - muxing: unused
++     * - demuxing: set by user
++     */
++    unsigned int max_index_size;
++
++    /**
++     * Maximum amount of memory in bytes to use for buffering frames
++     * obtained from realtime capture devices.
++     */
++    unsigned int max_picture_buffer;
++
++    /**
++     * Maximum buffering duration for interleaving.
++     *
++     * To ensure all the streams are interleaved correctly,
++     * av_interleaved_write_frame() will wait until it has at least one packet
++     * for each stream before actually writing any packets to the output file.
++     * When some streams are "sparse" (i.e. there are large gaps between
++     * successive packets), this can result in excessive buffering.
++     *
++     * This field specifies the maximum difference between the timestamps of the
++     * first and the last packet in the muxing queue, above which libavformat
++     * will output a packet regardless of whether it has queued a packet for all
++     * the streams.
++     *
++     * Muxing only, set by the caller before avformat_write_header().
++     */
++    int64_t max_interleave_delta;
++
++    /**
++     * Maximum number of packets to read while waiting for the first timestamp.
++     * Decoding only.
++     */
++    int max_ts_probe;
++
++    /**
++     * Max chunk time in microseconds.
++     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
++     * - encoding: Set by user
++     * - decoding: unused
++     */
++    int max_chunk_duration;
++
++    /**
++     * Max chunk size in bytes
++     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
++     * - encoding: Set by user
++     * - decoding: unused
++     */
++    int max_chunk_size;
++
++    /**
++     * Maximum number of packets that can be probed
++     * - encoding: unused
++     * - decoding: set by user
++     */
++    int max_probe_packets;
++
++    /**
++     * Allow non-standard and experimental extension
++     * @see AVCodecContext.strict_std_compliance
++     */
++    int strict_std_compliance;
++
++    /**
++     * Flags indicating events happening on the file, a combination of
++     * AVFMT_EVENT_FLAG_*.
++     *
++     * - demuxing: may be set by the demuxer in avformat_open_input(),
++     *   avformat_find_stream_info() and av_read_frame(). Flags must be cleared
++     *   by the user once the event has been handled.
++     * - muxing: may be set by the user after avformat_write_header() to
++     *   indicate a user-triggered event.  The muxer will clear the flags for
++     *   events it has handled in av_[interleaved]_write_frame().
++     */
++    int event_flags;
++/**
++ * - demuxing: the demuxer read new metadata from the file and updated
++ *   AVFormatContext.metadata accordingly
++ * - muxing: the user updated AVFormatContext.metadata and wishes the muxer to
++ *   write it into the file
++ */
++#define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001
++
++
++    /**
++     * Avoid negative timestamps during muxing.
++     * Any value of the AVFMT_AVOID_NEG_TS_* constants.
++     * Note, this works better when using av_interleaved_write_frame().
++     * - muxing: Set by user
++     * - demuxing: unused
++     */
++    int avoid_negative_ts;
++#define AVFMT_AVOID_NEG_TS_AUTO             -1 ///< Enabled when required by target format
++#define AVFMT_AVOID_NEG_TS_DISABLED          0 ///< Do not shift timestamps even when they are negative.
++#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative
++#define AVFMT_AVOID_NEG_TS_MAKE_ZERO         2 ///< Shift timestamps so that they start at 0
++
++    /**
++     * Audio preload in microseconds.
++     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
++     * - encoding: Set by user
++     * - decoding: unused
++     */
++    int audio_preload;
++
++    /**
++     * forces the use of wallclock timestamps as pts/dts of packets
++     * This has undefined results in the presence of B frames.
++     * - encoding: unused
++     * - decoding: Set by user
++     */
++    int use_wallclock_as_timestamps;
++
++    /**
++     * Skip duration calculation in estimate_timings_from_pts.
++     * - encoding: unused
++     * - decoding: set by user
++     *
++     * @see duration_probesize
++     */
++    int skip_estimate_duration_from_pts;
++
++    /**
++     * avio flags, used to force AVIO_FLAG_DIRECT.
++     * - encoding: unused
++     * - decoding: Set by user
++     */
++    int avio_flags;
++
++    /**
++     * The duration field can be estimated through various ways, and this field can be used
++     * to know how the duration was estimated.
++     * - encoding: unused
++     * - decoding: Read by user
++     */
++    enum AVDurationEstimationMethod duration_estimation_method;
++
++    /**
++     * Skip initial bytes when opening stream
++     * - encoding: unused
++     * - decoding: Set by user
++     */
++    int64_t skip_initial_bytes;
++
++    /**
++     * Correct single timestamp overflows
++     * - encoding: unused
++     * - decoding: Set by user
++     */
++    unsigned int correct_ts_overflow;
++
++    /**
++     * Force seeking to any (also non key) frames.
++     * - encoding: unused
++     * - decoding: Set by user
++     */
++    int seek2any;
++
++    /**
++     * Flush the I/O context after each packet.
++     * - encoding: Set by user
++     * - decoding: unused
++     */
++    int flush_packets;
++
++    /**
++     * format probing score.
++     * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes
++     * the format.
++     * - encoding: unused
++     * - decoding: set by avformat, read by user
++     */
++    int probe_score;
++
++    /**
++     * Maximum number of bytes read from input in order to identify the
++     * \ref AVInputFormat "input format". Only used when the format is not set
++     * explicitly by the caller.
++     *
++     * Demuxing only, set by the caller before avformat_open_input().
++     *
++     * @see probesize
++     */
++    int format_probesize;
++
++    /**
++     * ',' separated list of allowed decoders.
++     * If NULL then all are allowed
++     * - encoding: unused
++     * - decoding: set by user
++     */
++    char *codec_whitelist;
++
++    /**
++     * ',' separated list of allowed demuxers.
++     * If NULL then all are allowed
++     * - encoding: unused
++     * - decoding: set by user
++     */
++    char *format_whitelist;
++
++    /**
++     * ',' separated list of allowed protocols.
++     * - encoding: unused
++     * - decoding: set by user
++     */
++    char *protocol_whitelist;
++
++    /**
++     * ',' separated list of disallowed protocols.
++     * - encoding: unused
++     * - decoding: set by user
++     */
++    char *protocol_blacklist;
++
++    /**
++     * IO repositioned flag.
++     * This is set by avformat when the underlying IO context read pointer
++     * is repositioned, for example when doing byte based seeking.
++     * Demuxers can use the flag to detect such changes.
++     */
++    int io_repositioned;
++
++    /**
++     * Forced video codec.
++     * This allows forcing a specific decoder, even when there are multiple with
++     * the same codec_id.
++     * Demuxing: Set by user
++     */
++    const struct AVCodec *video_codec;
++
++    /**
++     * Forced audio codec.
++     * This allows forcing a specific decoder, even when there are multiple with
++     * the same codec_id.
++     * Demuxing: Set by user
++     */
++    const struct AVCodec *audio_codec;
++
++    /**
++     * Forced subtitle codec.
++     * This allows forcing a specific decoder, even when there are multiple with
++     * the same codec_id.
++     * Demuxing: Set by user
++     */
++    const struct AVCodec *subtitle_codec;
++
++    /**
++     * Forced data codec.
++     * This allows forcing a specific decoder, even when there are multiple with
++     * the same codec_id.
++     * Demuxing: Set by user
++     */
++    const struct AVCodec *data_codec;
++
++    /**
++     * Number of bytes to be written as padding in a metadata header.
++     * Demuxing: Unused.
++     * Muxing: Set by user.
++     */
++    int metadata_header_padding;
++
++    /**
++     * User data.
++     * This is a place for some private data of the user.
++     */
++    void *opaque;
++
++    /**
++     * Callback used by devices to communicate with application.
++     */
++    av_format_control_message control_message_cb;
++
++    /**
++     * Output timestamp offset, in microseconds.
++     * Muxing: set by user
++     */
++    int64_t output_ts_offset;
++
++    /**
++     * dump format separator.
++     * can be ", " or "\n      " or anything else
++     * - muxing: Set by user.
++     * - demuxing: Set by user.
++     */
++    uint8_t *dump_separator;
++
++    /**
++     * A callback for opening new IO streams.
++     *
++     * Whenever a muxer or a demuxer needs to open an IO stream (typically from
++     * avformat_open_input() for demuxers, but for certain formats can happen at
++     * other times as well), it will call this callback to obtain an IO context.
++     *
++     * @param s the format context
++     * @param pb on success, the newly opened IO context should be returned here
++     * @param url the url to open
++     * @param flags a combination of AVIO_FLAG_*
++     * @param options a dictionary of additional options, with the same
++     *                semantics as in avio_open2()
++     * @return 0 on success, a negative AVERROR code on failure
++     *
++     * @note Certain muxers and demuxers do nesting, i.e. they open one or more
++     * additional internal format contexts. Thus the AVFormatContext pointer
++     * passed to this callback may be different from the one facing the caller.
++     * It will, however, have the same 'opaque' field.
++     */
++    int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url,
++                   int flags, AVDictionary **options);
++
++    /**
++     * A callback for closing the streams opened with AVFormatContext.io_open().
++     *
++     * @param s the format context
++     * @param pb IO context to be closed and freed
++     * @return 0 on success, a negative AVERROR code on failure
++     */
++    int (*io_close2)(struct AVFormatContext *s, AVIOContext *pb);
++
++    /**
++     * Maximum number of bytes read from input in order to determine stream durations
++     * when using estimate_timings_from_pts in avformat_find_stream_info().
++     * Demuxing only, set by the caller before avformat_find_stream_info().
++     * Can be set to 0 to let avformat choose using a heuristic.
++     *
++     * @see skip_estimate_duration_from_pts
++     */
++    int64_t duration_probesize;
++
++    /**
++     * Name of this format context, only used for logging purposes.
++     */
++    char *name;
++} AVFormatContext;
++
++/**
++ * @defgroup lavf_core Core functions
++ * @ingroup libavf
++ *
++ * Functions for querying libavformat capabilities, allocating core structures,
++ * etc.
++ * @{
++ */
++
++/**
++ * Return the LIBAVFORMAT_VERSION_INT constant.
++ */
++unsigned avformat_version(void);
++
++/**
++ * Return the libavformat build-time configuration.
++ */
++const char *avformat_configuration(void);
++
++/**
++ * Return the libavformat license.
++ */
++const char *avformat_license(void);
++
++/**
++ * Do global initialization of network libraries. This is optional,
++ * and not recommended anymore.
++ *
++ * This functions only exists to work around thread-safety issues
++ * with older GnuTLS or OpenSSL libraries. If libavformat is linked
++ * to newer versions of those libraries, or if you do not use them,
++ * calling this function is unnecessary. Otherwise, you need to call
++ * this function before any other threads using them are started.
++ *
++ * This function will be deprecated once support for older GnuTLS and
++ * OpenSSL libraries is removed, and this function has no purpose
++ * anymore.
++ */
++int avformat_network_init(void);
++
++/**
++ * Undo the initialization done by avformat_network_init. Call it only
++ * once for each time you called avformat_network_init.
++ */
++int avformat_network_deinit(void);
++
++/**
++ * Iterate over all registered muxers.
++ *
++ * @param opaque a pointer where libavformat will store the iteration state. Must
++ *               point to NULL to start the iteration.
++ *
++ * @return the next registered muxer or NULL when the iteration is
++ *         finished
++ */
++const AVOutputFormat *av_muxer_iterate(void **opaque);
++
++/**
++ * Iterate over all registered demuxers.
++ *
++ * @param opaque a pointer where libavformat will store the iteration state.
++ *               Must point to NULL to start the iteration.
++ *
++ * @return the next registered demuxer or NULL when the iteration is
++ *         finished
++ */
++const AVInputFormat *av_demuxer_iterate(void **opaque);
++
++/**
++ * Allocate an AVFormatContext.
++ * avformat_free_context() can be used to free the context and everything
++ * allocated by the framework within it.
++ */
++AVFormatContext *avformat_alloc_context(void);
++
++/**
++ * Free an AVFormatContext and all its streams.
++ * @param s context to free
++ */
++void avformat_free_context(AVFormatContext *s);
++
++/**
++ * Get the AVClass for AVFormatContext. It can be used in combination with
++ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
++ *
++ * @see av_opt_find().
++ */
++const AVClass *avformat_get_class(void);
++
++/**
++ * Get the AVClass for AVStream. It can be used in combination with
++ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
++ *
++ * @see av_opt_find().
++ */
++const AVClass *av_stream_get_class(void);
++
++/**
++ * Get the AVClass for AVStreamGroup. It can be used in combination with
++ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
++ *
++ * @see av_opt_find().
++ */
++const AVClass *av_stream_group_get_class(void);
++
++/**
++ * @return a string identifying the stream group type, or NULL if unknown
++ */
++const char *avformat_stream_group_name(enum AVStreamGroupParamsType type);
++
++/**
++ * Add a new empty stream group to a media file.
++ *
++ * When demuxing, it may be called by the demuxer in read_header(). If the
++ * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also
++ * be called in read_packet().
++ *
++ * When muxing, may be called by the user before avformat_write_header().
++ *
++ * User is required to call avformat_free_context() to clean up the allocation
++ * by avformat_stream_group_create().
++ *
++ * New streams can be added to the group with avformat_stream_group_add_stream().
++ *
++ * @param s media file handle
++ *
++ * @return newly created group or NULL on error.
++ * @see avformat_new_stream, avformat_stream_group_add_stream.
++ */
++AVStreamGroup *avformat_stream_group_create(AVFormatContext *s,
++                                            enum AVStreamGroupParamsType type,
++                                            AVDictionary **options);
++
++/**
++ * Add a new stream to a media file.
++ *
++ * When demuxing, it is called by the demuxer in read_header(). If the
++ * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also
++ * be called in read_packet().
++ *
++ * When muxing, should be called by the user before avformat_write_header().
++ *
++ * User is required to call avformat_free_context() to clean up the allocation
++ * by avformat_new_stream().
++ *
++ * @param s media file handle
++ * @param c unused, does nothing
++ *
++ * @return newly created stream or NULL on error.
++ */
++AVStream *avformat_new_stream(AVFormatContext *s, const struct AVCodec *c);
++
++/**
++ * Add an already allocated stream to a stream group.
++ *
++ * When demuxing, it may be called by the demuxer in read_header(). If the
++ * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also
++ * be called in read_packet().
++ *
++ * When muxing, may be called by the user before avformat_write_header() after
++ * having allocated a new group with avformat_stream_group_create() and stream with
++ * avformat_new_stream().
++ *
++ * User is required to call avformat_free_context() to clean up the allocation
++ * by avformat_stream_group_add_stream().
++ *
++ * @param stg stream group belonging to a media file.
++ * @param st  stream in the media file to add to the group.
++ *
++ * @retval 0                 success
++ * @retval AVERROR(EEXIST)   the stream was already in the group
++ * @retval "another negative error code" legitimate errors
++ *
++ * @see avformat_new_stream, avformat_stream_group_create.
++ */
++int avformat_stream_group_add_stream(AVStreamGroup *stg, AVStream *st);
++
++AVProgram *av_new_program(AVFormatContext *s, int id);
++
++
++#define AVFMT_PROGCOPY_MATCH_BY_ID          (1 << 0) ///< match streams using stream id
++#define AVFMT_PROGCOPY_MATCH_BY_INDEX       (1 << 1) ///< match streams using stream index
++#define AVFMT_PROGCOPY_OVERWRITE            (1 << 8) ///< overwrite pre-existing program having same ID
++
++/**
++ * Copy an AVProgram from one AVFormatContext to another.
++ *
++ * Streams in the destination context whose designated attribute match the attribute of
++ * the streams in the source AVProgram index are added to the stream index of the copied
++ * AVProgram. The attribute is designated using AVFMT_PROGCOPY_MATCH_ flags.
++ *
++ * If a new program has to be added, the function expects and requires any existing buffer
++ * holding the array of pointers to AVPrograms in the destination context to have its size
++ * be a power-of-two value. This should be the case if all earlier programs were created
++ * using av_new_program or this function.
++ *
++ * @param dst           pointer to the target muxer context
++ * @param src           pointer to the source muxer context
++ * @param progid        ID of the program to be copied
++ * @param flags         combination of flags which determine how streams are matched and
++ *                      whether pre-existing AVProgram in target is overwritten.
++ *                      If no match condition is set, streams will be matched by ids if
++ *                      all source stream ids are non-zero and unique, else by index.
++ *
++ * @return  >= 0 in case of success, Error EEXIST if target already has program with same ID
++ *          and overwrite flag isn't set, else a negative AVERROR code in case of other
++ *          failures.
++ */
++int av_program_copy(AVFormatContext *dst, const AVFormatContext *src, int progid, int flags);
++
++/**
++ * @}
++ */
++
++
++/**
++ * Allocate an AVFormatContext for an output format.
++ * avformat_free_context() can be used to free the context and
++ * everything allocated by the framework within it.
++ *
++ * @param ctx           pointee is set to the created format context,
++ *                      or to NULL in case of failure
++ * @param oformat       format to use for allocating the context, if NULL
++ *                      format_name and filename are used instead
++ * @param format_name   the name of output format to use for allocating the
++ *                      context, if NULL filename is used instead
++ * @param filename      the name of the filename to use for allocating the
++ *                      context, may be NULL
++ *
++ * @return  >= 0 in case of success, a negative AVERROR code in case of
++ *          failure
++ */
++int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat,
++                                   const char *format_name, const char *filename);
++
++/**
++ * @addtogroup lavf_decoding
++ * @{
++ */
++
++/**
++ * Find AVInputFormat based on the short name of the input format.
++ */
++const AVInputFormat *av_find_input_format(const char *short_name);
++
++/**
++ * Guess the file format.
++ *
++ * @param pd        data to be probed
++ * @param is_opened Whether the file is already opened; determines whether
++ *                  demuxers with or without AVFMT_NOFILE are probed.
++ */
++const AVInputFormat *av_probe_input_format(const AVProbeData *pd, int is_opened);
++
++/**
++ * Guess the file format.
++ *
++ * @param pd        data to be probed
++ * @param is_opened Whether the file is already opened; determines whether
++ *                  demuxers with or without AVFMT_NOFILE are probed.
++ * @param score_max A probe score larger that this is required to accept a
++ *                  detection, the variable is set to the actual detection
++ *                  score afterwards.
++ *                  If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended
++ *                  to retry with a larger probe buffer.
++ */
++const AVInputFormat *av_probe_input_format2(const AVProbeData *pd,
++                                            int is_opened, int *score_max);
++
++/**
++ * Guess the file format.
++ *
++ * @param is_opened Whether the file is already opened; determines whether
++ *                  demuxers with or without AVFMT_NOFILE are probed.
++ * @param score_ret The score of the best detection.
++ */
++const AVInputFormat *av_probe_input_format3(const AVProbeData *pd,
++                                            int is_opened, int *score_ret);
++
++/**
++ * Probe a bytestream to determine the input format. Each time a probe returns
++ * with a score that is too low, the probe buffer size is increased and another
++ * attempt is made. When the maximum probe size is reached, the input format
++ * with the highest score is returned.
++ *
++ * @param pb             the bytestream to probe
++ * @param fmt            the input format is put here
++ * @param url            the url of the stream
++ * @param logctx         the log context
++ * @param offset         the offset within the bytestream to probe from
++ * @param max_probe_size the maximum probe buffer size (zero for default)
++ *
++ * @return the score in case of success, a negative value corresponding to an
++ *         the maximal score is AVPROBE_SCORE_MAX
++ *         AVERROR code otherwise
++ */
++int av_probe_input_buffer2(AVIOContext *pb, const AVInputFormat **fmt,
++                           const char *url, void *logctx,
++                           unsigned int offset, unsigned int max_probe_size);
++
++/**
++ * Like av_probe_input_buffer2() but returns 0 on success
++ */
++int av_probe_input_buffer(AVIOContext *pb, const AVInputFormat **fmt,
++                          const char *url, void *logctx,
++                          unsigned int offset, unsigned int max_probe_size);
++
++/**
++ * Open an input stream and read the header. The codecs are not opened.
++ * The stream must be closed with avformat_close_input().
++ *
++ * @param ps       Pointer to user-supplied AVFormatContext (allocated by
++ *                 avformat_alloc_context). May be a pointer to NULL, in
++ *                 which case an AVFormatContext is allocated by this
++ *                 function and written into ps.
++ *                 Note that a user-supplied AVFormatContext will be freed
++ *                 on failure and its pointer set to NULL.
++ * @param url      URL of the stream to open.
++ * @param fmt      If non-NULL, this parameter forces a specific input format.
++ *                 Otherwise the format is autodetected.
++ * @param options  A dictionary filled with AVFormatContext and demuxer-private
++ *                 options.
++ *                 On return this parameter will be destroyed and replaced with
++ *                 a dict containing options that were not found. May be NULL.
++ *
++ * @return 0 on success; on failure: frees ps, sets its pointer to NULL,
++ *         and returns a negative AVERROR.
++ *
++ * @note If you want to use custom IO, preallocate the format context and set its pb field.
++ */
++int avformat_open_input(AVFormatContext **ps, const char *url,
++                        const AVInputFormat *fmt, AVDictionary **options);
++
++/**
++ * Read packets of a media file to get stream information. This
++ * is useful for file formats with no headers such as MPEG. This
++ * function also computes the real framerate in case of MPEG-2 repeat
++ * frame mode.
++ * The logical file position is not changed by this function;
++ * examined packets may be buffered for later processing.
++ *
++ * @param ic media file handle
++ * @param options  If non-NULL, an ic.nb_streams long array of pointers to
++ *                 dictionaries, where i-th member contains options for
++ *                 codec corresponding to i-th stream.
++ *                 On return each dictionary will be filled with options that were not found.
++ * @return >=0 if OK, AVERROR_xxx on error
++ *
++ * @note this function isn't guaranteed to open all the codecs, so
++ *       options being non-empty at return is a perfectly normal behavior.
++ *
++ * @todo Let the user decide somehow what information is needed so that
++ *       we do not waste time getting stuff the user does not need.
++ */
++int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
++
++/**
++ * Find the programs which belong to a given stream.
++ *
++ * @param ic    media file handle
++ * @param last  the last found program, the search will start after this
++ *              program, or from the beginning if it is NULL
++ * @param s     stream index
++ *
++ * @return the next program which belongs to s, NULL if no program is found or
++ *         the last program is not among the programs of ic.
++ */
++AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s);
++
++void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx);
++
++/**
++ * Add the supplied index of a stream to the AVProgram with matching id.
++ *
++ * @param ac      the format context which contains the target AVProgram
++ * @param progid  the ID of the AVProgram whose stream index is to be updated
++ * @param idx     the index of the stream to be added
++ *
++ * @return >=0 upon successful addition or if index was already present,
++ *         AVERROR if no matching program is found or stream index is invalid or
++ *         the stream index array reallocation failed.
++ */
++int av_program_add_stream_index2(AVFormatContext *ac, int progid, unsigned int idx);
++
++/**
++ * Find the "best" stream in the file.
++ * The best stream is determined according to various heuristics as the most
++ * likely to be what the user expects.
++ * If the decoder parameter is non-NULL, av_find_best_stream will find the
++ * default decoder for the stream's codec; streams for which no decoder can
++ * be found are ignored.
++ *
++ * @param ic                media file handle
++ * @param type              stream type: video, audio, subtitles, etc.
++ * @param wanted_stream_nb  user-requested stream number,
++ *                          or -1 for automatic selection
++ * @param related_stream    try to find a stream related (eg. in the same
++ *                          program) to this one, or -1 if none
++ * @param decoder_ret       if non-NULL, returns the decoder for the
++ *                          selected stream
++ * @param flags             flags; none are currently defined
++ *
++ * @return  the non-negative stream number in case of success,
++ *          AVERROR_STREAM_NOT_FOUND if no stream with the requested type
++ *          could be found,
++ *          AVERROR_DECODER_NOT_FOUND if streams were found but no decoder
++ *
++ * @note  If av_find_best_stream returns successfully and decoder_ret is not
++ *        NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec.
++ */
++int av_find_best_stream(AVFormatContext *ic,
++                        enum AVMediaType type,
++                        int wanted_stream_nb,
++                        int related_stream,
++                        const struct AVCodec **decoder_ret,
++                        int flags);
++
++/**
++ * Return the next frame of a stream.
++ * This function returns what is stored in the file, and does not validate
++ * that what is there are valid frames for the decoder. It will split what is
++ * stored in the file into frames and return one for each call. It will not
++ * omit invalid data between valid frames so as to give the decoder the maximum
++ * information possible for decoding.
++ *
++ * On success, the returned packet is reference-counted (pkt->buf is set) and
++ * valid indefinitely. The packet must be freed with av_packet_unref() when
++ * it is no longer needed. For video, the packet contains exactly one frame.
++ * For audio, it contains an integer number of frames if each frame has
++ * a known fixed size (e.g. PCM or ADPCM data). If the audio frames have
++ * a variable size (e.g. MPEG audio), then it contains one frame.
++ *
++ * pkt->pts, pkt->dts and pkt->duration are always set to correct
++ * values in AVStream.time_base units (and guessed if the format cannot
++ * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format
++ * has B-frames, so it is better to rely on pkt->dts if you do not
++ * decompress the payload.
++ *
++ * @return 0 if OK, < 0 on error or end of file. On error, pkt will be blank
++ *         (as if it came from av_packet_alloc()).
++ *
++ * @note pkt will be initialized, so it may be uninitialized, but it must not
++ *       contain data that needs to be freed.
++ */
++int av_read_frame(AVFormatContext *s, AVPacket *pkt);
++
++/**
++ * Seek to the keyframe at timestamp.
++ * 'timestamp' in 'stream_index'.
++ *
++ * @param s            media file handle
++ * @param stream_index If stream_index is (-1), a default stream is selected,
++ *                     and timestamp is automatically converted from
++ *                     AV_TIME_BASE units to the stream specific time_base.
++ * @param timestamp    Timestamp in AVStream.time_base units or, if no stream
++ *                     is specified, in AV_TIME_BASE units.
++ * @param flags        flags which select direction and seeking mode
++ *
++ * @return >= 0 on success
++ */
++int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp,
++                  int flags);
++
++/**
++ * Seek to timestamp ts.
++ * Seeking will be done so that the point from which all active streams
++ * can be presented successfully will be closest to ts and within min/max_ts.
++ * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL.
++ *
++ * If flags contain AVSEEK_FLAG_BYTE, then all timestamps are in bytes and
++ * are the file position (this may not be supported by all demuxers).
++ * If flags contain AVSEEK_FLAG_FRAME, then all timestamps are in frames
++ * in the stream with stream_index (this may not be supported by all demuxers).
++ * Otherwise all timestamps are in units of the stream selected by stream_index
++ * or if stream_index is -1, in AV_TIME_BASE units.
++ * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as
++ * keyframes (this may not be supported by all demuxers).
++ * If flags contain AVSEEK_FLAG_BACKWARD, it is ignored.
++ *
++ * @param s            media file handle
++ * @param stream_index index of the stream which is used as time base reference
++ * @param min_ts       smallest acceptable timestamp
++ * @param ts           target timestamp
++ * @param max_ts       largest acceptable timestamp
++ * @param flags        flags
++ * @return >=0 on success, error code otherwise
++ *
++ * @note This is part of the new seek API which is still under construction.
++ */
++int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);
++
++/**
++ * Discard all internally buffered data. This can be useful when dealing with
++ * discontinuities in the byte stream. Generally works only with formats that
++ * can resync. This includes headerless formats like MPEG-TS/TS but should also
++ * work with NUT, Ogg and in a limited way AVI for example.
++ *
++ * The set of streams, the detected duration, stream parameters and codecs do
++ * not change when calling this function. If you want a complete reset, it's
++ * better to open a new AVFormatContext.
++ *
++ * This does not flush the AVIOContext (s->pb). If necessary, call
++ * avio_flush(s->pb) before calling this function.
++ *
++ * @param s media file handle
++ * @return >=0 on success, error code otherwise
++ */
++int avformat_flush(AVFormatContext *s);
++
++/**
++ * Start playing a network-based stream (e.g. RTSP stream) at the
++ * current position.
++ */
++int av_read_play(AVFormatContext *s);
++
++/**
++ * Pause a network-based stream (e.g. RTSP stream).
++ *
++ * Use av_read_play() to resume it.
++ */
++int av_read_pause(AVFormatContext *s);
++
++/**
++ * Command IDs that can be sent to the demuxer
++ *
++ * The following commands can be sent to a demuxer
++ * using ::avformat_send_command.
++ */
++enum AVFormatCommandID {
++    /**
++     * Send a RTSP `SET_PARAMETER` request to the server
++     *
++     * Sends an SET_PARAMETER RTSP command to the server,
++     * with a data payload of type ::AVRTSPCommandRequest,
++     * ownership of it and its data remains with the caller.
++     *
++     * A reply retrieved is of type ::AVRTSPResponse and it
++     * and its contents must be freed by the caller.
++     */
++    AVFORMAT_COMMAND_RTSP_SET_PARAMETER,
++};
++
++typedef struct AVRTSPCommandRequest {
++    /**
++     * Headers sent in the request to the server
++     */
++    AVDictionary *headers;
++
++    /**
++     * Body payload size
++     */
++    size_t body_len;
++
++    /**
++     * Body payload
++     */
++    char *body;
++} AVRTSPCommandRequest;
++
++typedef struct AVRTSPResponse {
++    /**
++     * Response status code from server
++     */
++    int status_code;
++
++    /**
++     * Reason phrase from the server, describing the
++     * status in a human-readable way.
++     */
++    char *reason;
++
++    /**
++     * Body payload size
++     */
++    size_t body_len;
++
++    /**
++     * Body payload
++     */
++    unsigned char *body;
++} AVRTSPResponse;
++
++/**
++ * Send a command to the demuxer
++ *
++ * Sends the specified command and (depending on the command)
++ * optionally a command-specific payload to the demuxer to handle.
++ *
++ * @param s     Format context, must be allocated with
++ *              ::avformat_alloc_context.
++ * @param id    Identifier of type ::AVFormatCommandID,
++ *              indicating the command to send.
++ * @param data  Command-specific data, allocated by the caller
++ *              and ownership remains with the caller.
++ *              For details what is expected here, consult the
++ *              documentation of the respective ::AVFormatCommandID.
++ */
++int avformat_send_command(AVFormatContext *s, enum AVFormatCommandID id, void *data);
++
++/**
++ * Receive a command reply from the demuxer
++ *
++ * Retrieves a reply for a previously sent command from the muxer.
++ *
++ * @param s         Format context, must be allocated with
++ *                  ::avformat_alloc_context.
++ * @param id        Identifier of type ::AVFormatCommandID,
++ *                  indicating the command for which to retrieve
++ *                  the reply.
++ * @param data_out  Pointee is set to the command reply, the actual
++ *                  type depends on the command. This is allocated by
++ *                  the muxer and must be freed with ::av_free.
++ *                  For details on the actual data set here, consult the
++ *                  documentation of the respective ::AVFormatCommandID.
++ */
++int avformat_receive_command_reply(AVFormatContext *s, enum AVFormatCommandID id, void **data_out);
++
++/**
++ * Close an opened input AVFormatContext. Free it and all its contents
++ * and set *s to NULL.
++ */
++void avformat_close_input(AVFormatContext **s);
++/**
++ * @}
++ */
++
++#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward
++#define AVSEEK_FLAG_BYTE     2 ///< seeking based on position in bytes
++#define AVSEEK_FLAG_ANY      4 ///< seek to any frame, even non-keyframes
++#define AVSEEK_FLAG_FRAME    8 ///< seeking based on frame number
++
++/**
++ * @addtogroup lavf_encoding
++ * @{
++ */
++
++#define AVSTREAM_INIT_IN_WRITE_HEADER 0 ///< stream parameters initialized in avformat_write_header
++#define AVSTREAM_INIT_IN_INIT_OUTPUT  1 ///< stream parameters initialized in avformat_init_output
++
++/**
++ * Allocate the stream private data and write the stream header to
++ * an output media file.
++ *
++ * @param s        Media file handle, must be allocated with
++ *                 avformat_alloc_context().
++ *                 Its \ref AVFormatContext.oformat "oformat" field must be set
++ *                 to the desired output format;
++ *                 Its \ref AVFormatContext.pb "pb" field must be set to an
++ *                 already opened ::AVIOContext.
++ * @param options  An ::AVDictionary filled with AVFormatContext and
++ *                 muxer-private options.
++ *                 On return this parameter will be destroyed and replaced with
++ *                 a dict containing options that were not found. May be NULL.
++ *
++ * @retval AVSTREAM_INIT_IN_WRITE_HEADER On success, if the codec had not already been
++ *                                       fully initialized in avformat_init_output().
++ * @retval AVSTREAM_INIT_IN_INIT_OUTPUT  On success, if the codec had already been fully
++ *                                       initialized in avformat_init_output().
++ * @retval AVERROR                       A negative AVERROR on failure.
++ *
++ * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_init_output.
++ */
++av_warn_unused_result
++int avformat_write_header(AVFormatContext *s, AVDictionary **options);
++
++/**
++ * Allocate the stream private data and initialize the codec, but do not write the header.
++ * May optionally be used before avformat_write_header() to initialize stream parameters
++ * before actually writing the header.
++ * If using this function, do not pass the same options to avformat_write_header().
++ *
++ * @param s        Media file handle, must be allocated with
++ *                 avformat_alloc_context().
++ *                 Its \ref AVFormatContext.oformat "oformat" field must be set
++ *                 to the desired output format;
++ *                 Its \ref AVFormatContext.pb "pb" field must be set to an
++ *                 already opened ::AVIOContext.
++ * @param options  An ::AVDictionary filled with AVFormatContext and
++ *                 muxer-private options.
++ *                 On return this parameter will be destroyed and replaced with
++ *                 a dict containing options that were not found. May be NULL.
++ *
++ * @retval AVSTREAM_INIT_IN_WRITE_HEADER On success, if the codec requires
++ *                                       avformat_write_header to fully initialize.
++ * @retval AVSTREAM_INIT_IN_INIT_OUTPUT  On success, if the codec has been fully
++ *                                       initialized.
++ * @retval AVERROR                       Anegative AVERROR on failure.
++ *
++ * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_write_header.
++ */
++av_warn_unused_result
++int avformat_init_output(AVFormatContext *s, AVDictionary **options);
++
++/**
++ * Write a packet to an output media file.
++ *
++ * This function passes the packet directly to the muxer, without any buffering
++ * or reordering. The caller is responsible for correctly interleaving the
++ * packets if the format requires it. Callers that want libavformat to handle
++ * the interleaving should call av_interleaved_write_frame() instead of this
++ * function.
++ *
++ * @param s media file handle
++ * @param pkt The packet containing the data to be written. Note that unlike
++ *            av_interleaved_write_frame(), this function does not take
++ *            ownership of the packet passed to it (though some muxers may make
++ *            an internal reference to the input packet).
++ *            <br>
++ *            This parameter can be NULL (at any time, not just at the end), in
++ *            order to immediately flush data buffered within the muxer, for
++ *            muxers that buffer up data internally before writing it to the
++ *            output.
++ *            <br>
++ *            Packet's @ref AVPacket.stream_index "stream_index" field must be
++ *            set to the index of the corresponding stream in @ref
++ *            AVFormatContext.streams "s->streams".
++ *            <br>
++ *            The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts")
++ *            must be set to correct values in the stream's timebase (unless the
++ *            output format is flagged with the AVFMT_NOTIMESTAMPS flag, then
++ *            they can be set to AV_NOPTS_VALUE).
++ *            The dts for subsequent packets passed to this function must be strictly
++ *            increasing when compared in their respective timebases (unless the
++ *            output format is flagged with the AVFMT_TS_NONSTRICT, then they
++ *            merely have to be nondecreasing).  @ref AVPacket.duration
++ *            "duration") should also be set if known.
++ * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush
++ *
++ * @see av_interleaved_write_frame()
++ */
++int av_write_frame(AVFormatContext *s, AVPacket *pkt);
++
++/**
++ * Write a packet to an output media file ensuring correct interleaving.
++ *
++ * This function will buffer the packets internally as needed to make sure the
++ * packets in the output file are properly interleaved, usually ordered by
++ * increasing dts. Callers doing their own interleaving should call
++ * av_write_frame() instead of this function.
++ *
++ * Using this function instead of av_write_frame() can give muxers advance
++ * knowledge of future packets, improving e.g. the behaviour of the mp4
++ * muxer for VFR content in fragmenting mode.
++ *
++ * @param s media file handle
++ * @param pkt The packet containing the data to be written.
++ *            <br>
++ *            If the packet is reference-counted, this function will take
++ *            ownership of this reference and unreference it later when it sees
++ *            fit. If the packet is not reference-counted, libavformat will
++ *            make a copy.
++ *            The returned packet will be blank (as if returned from
++ *            av_packet_alloc()), even on error.
++ *            <br>
++ *            This parameter can be NULL (at any time, not just at the end), to
++ *            flush the interleaving queues.
++ *            <br>
++ *            Packet's @ref AVPacket.stream_index "stream_index" field must be
++ *            set to the index of the corresponding stream in @ref
++ *            AVFormatContext.streams "s->streams".
++ *            <br>
++ *            The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts")
++ *            must be set to correct values in the stream's timebase (unless the
++ *            output format is flagged with the AVFMT_NOTIMESTAMPS flag, then
++ *            they can be set to AV_NOPTS_VALUE).
++ *            The dts for subsequent packets in one stream must be strictly
++ *            increasing (unless the output format is flagged with the
++ *            AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing).
++ *            @ref AVPacket.duration "duration" should also be set if known.
++ *
++ * @return 0 on success, a negative AVERROR on error.
++ *
++ * @see av_write_frame(), AVFormatContext.max_interleave_delta
++ */
++int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt);
++
++/**
++ * Write an uncoded frame to an output media file.
++ *
++ * The frame must be correctly interleaved according to the container
++ * specification; if not, av_interleaved_write_uncoded_frame() must be used.
++ *
++ * See av_interleaved_write_uncoded_frame() for details.
++ */
++int av_write_uncoded_frame(AVFormatContext *s, int stream_index,
++                           struct AVFrame *frame);
++
++/**
++ * Write an uncoded frame to an output media file.
++ *
++ * If the muxer supports it, this function makes it possible to write an AVFrame
++ * structure directly, without encoding it into a packet.
++ * It is mostly useful for devices and similar special muxers that use raw
++ * video or PCM data and will not serialize it into a byte stream.
++ *
++ * To test whether it is possible to use it with a given muxer and stream,
++ * use av_write_uncoded_frame_query().
++ *
++ * The caller gives up ownership of the frame and must not access it
++ * afterwards.
++ *
++ * @return  >=0 for success, a negative code on error
++ */
++int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index,
++                                       struct AVFrame *frame);
++
++/**
++ * Test whether a muxer supports uncoded frame.
++ *
++ * @return  >=0 if an uncoded frame can be written to that muxer and stream,
++ *          <0 if not
++ */
++int av_write_uncoded_frame_query(AVFormatContext *s, int stream_index);
++
++/**
++ * Write the stream trailer to an output media file and free the
++ * file private data.
++ *
++ * May only be called after a successful call to avformat_write_header.
++ *
++ * @param s media file handle
++ * @return 0 if OK, AVERROR_xxx on error
++ */
++int av_write_trailer(AVFormatContext *s);
++
++/**
++ * Return the output format in the list of registered output formats
++ * which best matches the provided parameters, or return NULL if
++ * there is no match.
++ *
++ * @param short_name if non-NULL checks if short_name matches with the
++ *                   names of the registered formats
++ * @param filename   if non-NULL checks if filename terminates with the
++ *                   extensions of the registered formats
++ * @param mime_type  if non-NULL checks if mime_type matches with the
++ *                   MIME type of the registered formats
++ */
++const AVOutputFormat *av_guess_format(const char *short_name,
++                                      const char *filename,
++                                      const char *mime_type);
++
++/**
++ * Guess the codec ID based upon muxer and filename.
++ */
++enum AVCodecID av_guess_codec(const AVOutputFormat *fmt, const char *short_name,
++                              const char *filename, const char *mime_type,
++                              enum AVMediaType type);
++
++/**
++ * Get timing information for the data currently output.
++ * The exact meaning of "currently output" depends on the format.
++ * It is mostly relevant for devices that have an internal buffer and/or
++ * work in real time.
++ * @param s          media file handle
++ * @param stream     stream in the media file
++ * @param[out] dts   DTS of the last packet output for the stream, in stream
++ *                   time_base units
++ * @param[out] wall  absolute time when that packet whas output,
++ *                   in microsecond
++ * @retval  0               Success
++ * @retval  AVERROR(ENOSYS) The format does not support it
++ *
++ * @note Some formats or devices may not allow to measure dts and wall
++ *       atomically.
++ */
++int av_get_output_timestamp(struct AVFormatContext *s, int stream,
++                            int64_t *dts, int64_t *wall);
++
++
++/**
++ * @}
++ */
++
++
++/**
++ * @defgroup lavf_misc Utility functions
++ * @ingroup libavf
++ * @{
++ *
++ * Miscellaneous utility functions related to both muxing and demuxing
++ * (or neither).
++ */
++
++/**
++ * Send a nice hexadecimal dump of a buffer to the specified file stream.
++ *
++ * @param f The file stream pointer where the dump should be sent to.
++ * @param buf buffer
++ * @param size buffer size
++ *
++ * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2
++ */
++void av_hex_dump(FILE *f, const uint8_t *buf, int size);
++
++/**
++ * Send a nice hexadecimal dump of a buffer to the log.
++ *
++ * @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, lower values signifying
++ * higher importance.
++ * @param buf buffer
++ * @param size buffer size
++ *
++ * @see av_hex_dump, av_pkt_dump2, av_pkt_dump_log2
++ */
++void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size);
++
++/**
++ * Send a nice dump of a packet to the specified file stream.
++ *
++ * @param f The file stream pointer where the dump should be sent to.
++ * @param pkt packet to dump
++ * @param dump_payload True if the payload must be displayed, too.
++ * @param st AVStream that the packet belongs to
++ */
++void av_pkt_dump2(FILE *f, const AVPacket *pkt, int dump_payload, const AVStream *st);
++
++
++/**
++ * Send a nice dump of a packet to the log.
++ *
++ * @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, lower values signifying
++ * higher importance.
++ * @param pkt packet to dump
++ * @param dump_payload True if the payload must be displayed, too.
++ * @param st AVStream that the packet belongs to
++ */
++void av_pkt_dump_log2(void *avcl, int level, const AVPacket *pkt, int dump_payload,
++                      const AVStream *st);
++
++/**
++ * Get the AVCodecID for the given codec tag tag.
++ * If no codec id is found returns AV_CODEC_ID_NONE.
++ *
++ * @param tags list of supported codec_id-codec_tag pairs, as stored
++ * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag
++ * @param tag  codec tag to match to a codec ID
++ */
++enum AVCodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag);
++
++/**
++ * Get the codec tag for the given codec id id.
++ * If no codec tag is found returns 0.
++ *
++ * @param tags list of supported codec_id-codec_tag pairs, as stored
++ * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag
++ * @param id   codec ID to match to a codec tag
++ */
++unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum AVCodecID id);
++
++/**
++ * Get the codec tag for the given codec id.
++ *
++ * @param tags list of supported codec_id - codec_tag pairs, as stored
++ * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag
++ * @param id codec id that should be searched for in the list
++ * @param tag A pointer to the found tag
++ * @return 0 if id was not found in tags, > 0 if it was found
++ */
++int av_codec_get_tag2(const struct AVCodecTag * const *tags, enum AVCodecID id,
++                      unsigned int *tag);
++
++int av_find_default_stream_index(AVFormatContext *s);
++
++/**
++ * Get the index for a specific timestamp.
++ *
++ * @param st        stream that the timestamp belongs to
++ * @param timestamp timestamp to retrieve the index for
++ * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond
++ *                 to the timestamp which is <= the requested one, if backward
++ *                 is 0, then it will be >=
++ *              if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise
++ * @return < 0 if no such timestamp could be found
++ */
++int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags);
++
++/**
++ * Get the index entry count for the given AVStream.
++ *
++ * @param st stream
++ * @return the number of index entries in the stream
++ */
++int avformat_index_get_entries_count(const AVStream *st);
++
++/**
++ * Get the AVIndexEntry corresponding to the given index.
++ *
++ * @param st          Stream containing the requested AVIndexEntry.
++ * @param idx         The desired index.
++ * @return A pointer to the requested AVIndexEntry if it exists, NULL otherwise.
++ *
++ * @note The pointer returned by this function is only guaranteed to be valid
++ *       until any function that takes the stream or the parent AVFormatContext
++ *       as input argument is called.
++ */
++const AVIndexEntry *avformat_index_get_entry(AVStream *st, int idx);
++
++/**
++ * Get the AVIndexEntry corresponding to the given timestamp.
++ *
++ * @param st          Stream containing the requested AVIndexEntry.
++ * @param wanted_timestamp   Timestamp to retrieve the index entry for.
++ * @param flags       If AVSEEK_FLAG_BACKWARD then the returned entry will correspond
++ *                    to the timestamp which is <= the requested one, if backward
++ *                    is 0, then it will be >=
++ *                    if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise.
++ * @return A pointer to the requested AVIndexEntry if it exists, NULL otherwise.
++ *
++ * @note The pointer returned by this function is only guaranteed to be valid
++ *       until any function that takes the stream or the parent AVFormatContext
++ *       as input argument is called.
++ */
++const AVIndexEntry *avformat_index_get_entry_from_timestamp(AVStream *st,
++                                                            int64_t wanted_timestamp,
++                                                            int flags);
++/**
++ * Add an index entry into a sorted list. Update the entry if the list
++ * already contains it.
++ *
++ * @param timestamp timestamp in the time base of the given stream
++ */
++int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
++                       int size, int distance, int flags);
++
++
++/**
++ * Split a URL string into components.
++ *
++ * The pointers to buffers for storing individual components may be null,
++ * in order to ignore that component. Buffers for components not found are
++ * set to empty strings. If the port is not found, it is set to a negative
++ * value.
++ *
++ * @param proto the buffer for the protocol
++ * @param proto_size the size of the proto buffer
++ * @param authorization the buffer for the authorization
++ * @param authorization_size the size of the authorization buffer
++ * @param hostname the buffer for the host name
++ * @param hostname_size the size of the hostname buffer
++ * @param port_ptr a pointer to store the port number in
++ * @param path the buffer for the path
++ * @param path_size the size of the path buffer
++ * @param url the URL to split
++ */
++void av_url_split(char *proto,         int proto_size,
++                  char *authorization, int authorization_size,
++                  char *hostname,      int hostname_size,
++                  int *port_ptr,
++                  char *path,          int path_size,
++                  const char *url);
++
++
++/**
++ * Print detailed information about the input or output format, such as
++ * duration, bitrate, streams, container, programs, metadata, side data,
++ * codec and time base.
++ *
++ * @param ic        the context to analyze
++ * @param index     index of the stream to dump information about
++ * @param url       the URL to print, such as source or destination file
++ * @param is_output Select whether the specified context is an input(0) or output(1)
++ */
++void av_dump_format(AVFormatContext *ic,
++                    int index,
++                    const char *url,
++                    int is_output);
++
++
++#define AV_FRAME_FILENAME_FLAGS_MULTIPLE          1  ///< Allow multiple %d
++#define AV_FRAME_FILENAME_FLAGS_IGNORE_TRUNCATION 2  ///< Ignore truncated output instead of returning an error
++
++/**
++ * Return in 'buf' the path with '%d' replaced by a number.
++ *
++ * Also handles the '%0nd' format where 'n' is the total number
++ * of digits and '%%'.
++ *
++ * @param buf destination buffer
++ * @param buf_size destination buffer size
++ * @param path numbered sequence string
++ * @param number frame number
++ * @param flags AV_FRAME_FILENAME_FLAGS_*
++ * @return 0 if OK, -1 on format error
++ */
++int av_get_frame_filename2(char *buf, int buf_size,
++                          const char *path, int number, int flags);
++
++int av_get_frame_filename(char *buf, int buf_size,
++                          const char *path, int number);
++
++/**
++ * Check whether filename actually is a numbered sequence generator.
++ *
++ * @param filename possible numbered sequence string
++ * @return 1 if a valid numbered sequence string, 0 otherwise
++ */
++int av_filename_number_test(const char *filename);
++
++/**
++ * Generate an SDP for an RTP session.
++ *
++ * Note, this overwrites the id values of AVStreams in the muxer contexts
++ * for getting unique dynamic payload types.
++ *
++ * @param ac array of AVFormatContexts describing the RTP streams. If the
++ *           array is composed by only one context, such context can contain
++ *           multiple AVStreams (one AVStream per RTP stream). Otherwise,
++ *           all the contexts in the array (an AVCodecContext per RTP stream)
++ *           must contain only one AVStream.
++ * @param n_files number of AVCodecContexts contained in ac
++ * @param buf buffer where the SDP will be stored (must be allocated by
++ *            the caller)
++ * @param size the size of the buffer
++ * @return 0 if OK, AVERROR_xxx on error
++ */
++int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size);
++
++/**
++ * Return a positive value if the given filename has one of the given
++ * extensions, 0 otherwise.
++ *
++ * @param filename   file name to check against the given extensions
++ * @param extensions a comma-separated list of filename extensions
++ */
++int av_match_ext(const char *filename, const char *extensions);
++
++/**
++ * Test if the given container can store a codec.
++ *
++ * @param ofmt           container to check for compatibility
++ * @param codec_id       codec to potentially store in container
++ * @param std_compliance standards compliance level, one of FF_COMPLIANCE_*
++ *
++ * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot.
++ *         A negative number if this information is not available.
++ */
++int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,
++                         int std_compliance);
++
++struct AVBPrint;
++/**
++ * Make a RFC 4281/6381 like string describing a codec for MIME types.
++ *
++ * @param par pointer to an AVCodecParameters struct describing the codec
++ * @param frame_rate an AVRational for the frame rate, for deciding the
++ *                   right profile for video codecs. Pass an invalid
++ *                   AVRational (1/0) to indicate that it is unknown.
++ * @param out the AVBPrint to write the output to
++ * @return <0 on error
++ */
++int av_mime_codec_str(const AVCodecParameters *par,
++                      AVRational frame_rate, struct AVBPrint *out);
++
++/**
++ * @defgroup riff_fourcc RIFF FourCCs
++ * @{
++ * Get the tables mapping RIFF FourCCs to libavcodec AVCodecIDs. The tables are
++ * meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the
++ * following code:
++ * @code
++ * uint32_t tag = MKTAG('H', '2', '6', '4');
++ * const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 };
++ * enum AVCodecID id = av_codec_get_id(table, tag);
++ * @endcode
++ */
++/**
++ * @return the table mapping RIFF FourCCs for video to libavcodec AVCodecID.
++ */
++const struct AVCodecTag *avformat_get_riff_video_tags(void);
++/**
++ * @return the table mapping RIFF FourCCs for audio to AVCodecID.
++ */
++const struct AVCodecTag *avformat_get_riff_audio_tags(void);
++/**
++ * @return the table mapping MOV FourCCs for video to libavcodec AVCodecID.
++ */
++const struct AVCodecTag *avformat_get_mov_video_tags(void);
++/**
++ * @return the table mapping MOV FourCCs for audio to AVCodecID.
++ */
++const struct AVCodecTag *avformat_get_mov_audio_tags(void);
++
++/**
++ * @}
++ */
++
++/**
++ * Guess the sample aspect ratio of a frame, based on both the stream and the
++ * frame aspect ratio.
++ *
++ * Since the frame aspect ratio is set by the codec but the stream aspect ratio
++ * is set by the demuxer, these two may not be equal. This function tries to
++ * return the value that you should use if you would like to display the frame.
++ *
++ * Basic logic is to use the stream aspect ratio if it is set to something sane
++ * otherwise use the frame aspect ratio. This way a container setting, which is
++ * usually easy to modify can override the coded value in the frames.
++ *
++ * @param format the format context which the stream is part of
++ * @param stream the stream which the frame is part of
++ * @param frame the frame with the aspect ratio to be determined
++ * @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea
++ */
++AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream,
++                                        struct AVFrame *frame);
++
++/**
++ * Guess the frame rate, based on both the container and codec information.
++ *
++ * @param ctx the format context which the stream is part of
++ * @param stream the stream which the frame is part of
++ * @param frame the frame for which the frame rate should be determined, may be NULL
++ * @return the guessed (valid) frame rate, 0/1 if no idea
++ */
++AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream,
++                               struct AVFrame *frame);
++
++/**
++ * Check if the stream st contained in s is matched by the stream specifier
++ * spec.
++ *
++ * See the "stream specifiers" chapter in the documentation for the syntax
++ * of spec.
++ *
++ * @return  >0 if st is matched by spec;
++ *          0  if st is not matched by spec;
++ *          AVERROR code if spec is invalid
++ *
++ * @note  A stream specifier can match several streams in the format.
++ */
++int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
++                                    const char *spec);
++
++int avformat_queue_attached_pictures(AVFormatContext *s);
++
++/**
++ * @}
++ */
++
++#endif /* AVFORMAT_AVFORMAT_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/avio.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/avio.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/avio.h.ffmpeg9	2026-09-07 12:23:47.675432321 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/avio.h	2026-09-07 12:23:47.675275341 +0200
+@@ -0,0 +1,831 @@
++/*
++ * 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 AVFORMAT_AVIO_H
++#define AVFORMAT_AVIO_H
++
++/**
++ * @file
++ * @ingroup lavf_io
++ * Buffered I/O operations
++ */
++
++#include <stdint.h>
++#include <stdio.h>
++
++#include "libavutil/attributes.h"
++#include "libavutil/dict.h"
++#include "libavutil/log.h"
++
++#include "libavformat/version_major.h"
++
++/**
++ * Seeking works like for a local file.
++ */
++#define AVIO_SEEKABLE_NORMAL (1 << 0)
++
++/**
++ * Seeking by timestamp with avio_seek_time() is possible.
++ */
++#define AVIO_SEEKABLE_TIME   (1 << 1)
++
++/**
++ * Callback for checking whether to abort blocking functions.
++ * AVERROR_EXIT is returned in this case by the interrupted
++ * function. During blocking operations, callback is called with
++ * opaque as parameter. If the callback returns 1, the
++ * blocking operation will be aborted.
++ *
++ * No members can be added to this struct without a major bump, if
++ * new elements have been added after this struct in AVFormatContext
++ * or AVIOContext.
++ */
++typedef struct AVIOInterruptCB {
++    int (*callback)(void*);
++    void *opaque;
++} AVIOInterruptCB;
++
++/**
++ * Directory entry types.
++ */
++enum AVIODirEntryType {
++    AVIO_ENTRY_UNKNOWN,
++    AVIO_ENTRY_BLOCK_DEVICE,
++    AVIO_ENTRY_CHARACTER_DEVICE,
++    AVIO_ENTRY_DIRECTORY,
++    AVIO_ENTRY_NAMED_PIPE,
++    AVIO_ENTRY_SYMBOLIC_LINK,
++    AVIO_ENTRY_SOCKET,
++    AVIO_ENTRY_FILE,
++    AVIO_ENTRY_SERVER,
++    AVIO_ENTRY_SHARE,
++    AVIO_ENTRY_WORKGROUP,
++};
++
++/**
++ * Describes single entry of the directory.
++ *
++ * Only name and type fields are guaranteed be set.
++ * Rest of fields are protocol or/and platform dependent and might be unknown.
++ */
++typedef struct AVIODirEntry {
++    char *name;                           /**< Filename */
++    int type;                             /**< Type of the entry */
++    int utf8;                             /**< Set to 1 when name is encoded with UTF-8, 0 otherwise.
++                                               Name can be encoded with UTF-8 even though 0 is set. */
++    int64_t size;                         /**< File size in bytes, -1 if unknown. */
++    int64_t modification_timestamp;       /**< Time of last modification in microseconds since unix
++                                               epoch, -1 if unknown. */
++    int64_t access_timestamp;             /**< Time of last access in microseconds since unix epoch,
++                                               -1 if unknown. */
++    int64_t status_change_timestamp;      /**< Time of last status change in microseconds since unix
++                                               epoch, -1 if unknown. */
++    int64_t user_id;                      /**< User ID of owner, -1 if unknown. */
++    int64_t group_id;                     /**< Group ID of owner, -1 if unknown. */
++    int64_t filemode;                     /**< Unix file mode, -1 if unknown. */
++} AVIODirEntry;
++
++typedef struct AVIODirContext AVIODirContext;
++
++/**
++ * Different data types that can be returned via the AVIO
++ * write_data_type callback.
++ */
++enum AVIODataMarkerType {
++    /**
++     * Header data; this needs to be present for the stream to be decodeable.
++     */
++    AVIO_DATA_MARKER_HEADER,
++    /**
++     * A point in the output bytestream where a decoder can start decoding
++     * (i.e. a keyframe). A demuxer/decoder given the data flagged with
++     * AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT,
++     * should give decodeable results.
++     */
++    AVIO_DATA_MARKER_SYNC_POINT,
++    /**
++     * A point in the output bytestream where a demuxer can start parsing
++     * (for non self synchronizing bytestream formats). That is, any
++     * non-keyframe packet start point.
++     */
++    AVIO_DATA_MARKER_BOUNDARY_POINT,
++    /**
++     * This is any, unlabelled data. It can either be a muxer not marking
++     * any positions at all, it can be an actual boundary/sync point
++     * that the muxer chooses not to mark, or a later part of a packet/fragment
++     * that is cut into multiple write callbacks due to limited IO buffer size.
++     */
++    AVIO_DATA_MARKER_UNKNOWN,
++    /**
++     * Trailer data, which doesn't contain actual content, but only for
++     * finalizing the output file.
++     */
++    AVIO_DATA_MARKER_TRAILER,
++    /**
++     * A point in the output bytestream where the underlying AVIOContext might
++     * flush the buffer depending on latency or buffering requirements. Typically
++     * means the end of a packet.
++     */
++    AVIO_DATA_MARKER_FLUSH_POINT,
++};
++
++/**
++ * Bytestream IO Context.
++ * New public fields can be added with minor version bumps.
++ * Removal, reordering and changes to existing public fields require
++ * a major version bump.
++ * sizeof(AVIOContext) must not be used outside libav*.
++ *
++ * @note None of the function pointers in AVIOContext should be called
++ *       directly, they should only be set by the client application
++ *       when implementing custom I/O. Normally these are set to the
++ *       function pointers specified in avio_alloc_context()
++ */
++typedef struct AVIOContext {
++    /**
++     * A class for private options.
++     *
++     * If this AVIOContext is created by avio_open2(), av_class is set and
++     * passes the options down to protocols.
++     *
++     * If this AVIOContext is manually allocated, then av_class may be set by
++     * the caller.
++     *
++     * warning -- this field can be NULL, be sure to not pass this AVIOContext
++     * to any av_opt_* functions in that case.
++     */
++    const AVClass *av_class;
++
++    /*
++     * The following shows the relationship between buffer, buf_ptr,
++     * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing
++     * (since AVIOContext is used for both):
++     *
++     **********************************************************************************
++     *                                   READING
++     **********************************************************************************
++     *
++     *                            |              buffer_size              |
++     *                            |---------------------------------------|
++     *                            |                                       |
++     *
++     *                         buffer          buf_ptr       buf_end
++     *                            +---------------+-----------------------+
++     *                            |/ / / / / / / /|/ / / / / / /|         |
++     *  read buffer:              |/ / consumed / | to be read /|         |
++     *                            |/ / / / / / / /|/ / / / / / /|         |
++     *                            +---------------+-----------------------+
++     *
++     *                                                         pos
++     *              +-------------------------------------------+-----------------+
++     *  input file: |                                           |                 |
++     *              +-------------------------------------------+-----------------+
++     *
++     *
++     **********************************************************************************
++     *                                   WRITING
++     **********************************************************************************
++     *
++     *                             |          buffer_size                 |
++     *                             |--------------------------------------|
++     *                             |                                      |
++     *
++     *                                                buf_ptr_max
++     *                          buffer                 (buf_ptr)       buf_end
++     *                             +-----------------------+--------------+
++     *                             |/ / / / / / / / / / / /|              |
++     *  write buffer:              | / / to be flushed / / |              |
++     *                             |/ / / / / / / / / / / /|              |
++     *                             +-----------------------+--------------+
++     *                               buf_ptr can be in this
++     *                               due to a backward seek
++     *
++     *                            pos
++     *               +-------------+----------------------------------------------+
++     *  output file: |             |                                              |
++     *               +-------------+----------------------------------------------+
++     *
++     */
++    unsigned char *buffer;  /**< Start of the buffer. */
++    int buffer_size;        /**< Maximum buffer size */
++    unsigned char *buf_ptr; /**< Current position in the buffer */
++    unsigned char *buf_end; /**< End of the data, may be less than
++                                 buffer+buffer_size if the read function returned
++                                 less data than requested, e.g. for streams where
++                                 no more data has been received yet. */
++    void *opaque;           /**< A private pointer, passed to the read/write/seek/...
++                                 functions. */
++    int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);
++    int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size);
++    int64_t (*seek)(void *opaque, int64_t offset, int whence);
++    int64_t pos;            /**< position in the file of the current buffer */
++    int eof_reached;        /**< true if was unable to read due to error or eof */
++    int error;              /**< contains the error code or 0 if no error happened */
++    int write_flag;         /**< true if open for writing */
++    int max_packet_size;
++    int min_packet_size;    /**< Try to buffer at least this amount of data
++                                 before flushing it. */
++    unsigned long checksum;
++    unsigned char *checksum_ptr;
++    unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
++    /**
++     * Pause or resume playback for network streaming protocols - e.g. MMS.
++     */
++    int (*read_pause)(void *opaque, int pause);
++    /**
++     * Seek to a given timestamp in stream with the specified stream_index.
++     * Needed for some network streaming protocols which don't support seeking
++     * to byte position.
++     */
++    int64_t (*read_seek)(void *opaque, int stream_index,
++                         int64_t timestamp, int flags);
++    /**
++     * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
++     */
++    int seekable;
++
++    /**
++     * avio_read and avio_write should if possible be satisfied directly
++     * instead of going through a buffer, and avio_seek will always
++     * call the underlying seek function directly.
++     */
++    int direct;
++
++    /**
++     * ',' separated list of allowed protocols.
++     */
++    const char *protocol_whitelist;
++
++    /**
++     * ',' separated list of disallowed protocols.
++     */
++    const char *protocol_blacklist;
++
++    /**
++     * A callback that is used instead of write_packet.
++     */
++    int (*write_data_type)(void *opaque, const uint8_t *buf, int buf_size,
++                           enum AVIODataMarkerType type, int64_t time);
++    /**
++     * If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT,
++     * but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly
++     * small chunks of data returned from the callback).
++     */
++    int ignore_boundary_point;
++
++    /**
++     * Maximum reached position before a backward seek in the write buffer,
++     * used keeping track of already written data for a later flush.
++     */
++    unsigned char *buf_ptr_max;
++
++    /**
++     * Read-only statistic of bytes read for this AVIOContext.
++     */
++    int64_t bytes_read;
++
++    /**
++     * Read-only statistic of bytes written for this AVIOContext.
++     */
++    int64_t bytes_written;
++} AVIOContext;
++
++/**
++ * Return the name of the protocol that will handle the passed URL.
++ *
++ * NULL is returned if no protocol could be found for the given URL.
++ *
++ * @return Name of the protocol or NULL.
++ */
++const char *avio_find_protocol_name(const char *url);
++
++/**
++ * Return AVIO_FLAG_* access flags corresponding to the access permissions
++ * of the resource in url, or a negative value corresponding to an
++ * AVERROR code in case of failure. The returned access flags are
++ * masked by the value in flags.
++ *
++ * @note This function is intrinsically unsafe, in the sense that the
++ * checked resource may change its existence or permission status from
++ * one call to another. Thus you should not trust the returned value,
++ * unless you are sure that no other processes are accessing the
++ * checked resource.
++ */
++int avio_check(const char *url, int flags);
++
++/**
++ * Open directory for reading.
++ *
++ * @param s       directory read context. Pointer to a NULL pointer must be passed.
++ * @param url     directory to be listed.
++ * @param options A dictionary filled with protocol-private options. On return
++ *                this parameter will be destroyed and replaced with a dictionary
++ *                containing options that were not found. May be NULL.
++ * @return >=0 on success or negative on error.
++ */
++int avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options);
++
++/**
++ * Get next directory entry.
++ *
++ * Returned entry must be freed with avio_free_directory_entry(). In particular
++ * it may outlive AVIODirContext.
++ *
++ * @param s         directory read context.
++ * @param[out] next next entry or NULL when no more entries.
++ * @return >=0 on success or negative on error. End of list is not considered an
++ *             error.
++ */
++int avio_read_dir(AVIODirContext *s, AVIODirEntry **next);
++
++/**
++ * Close directory.
++ *
++ * @note Entries created using avio_read_dir() are not deleted and must be
++ * freeded with avio_free_directory_entry().
++ *
++ * @param s         directory read context.
++ * @return >=0 on success or negative on error.
++ */
++int avio_close_dir(AVIODirContext **s);
++
++/**
++ * Free entry allocated by avio_read_dir().
++ *
++ * @param entry entry to be freed.
++ */
++void avio_free_directory_entry(AVIODirEntry **entry);
++
++/**
++ * Allocate and initialize an AVIOContext for buffered I/O. It must be later
++ * freed with avio_context_free().
++ *
++ * @param buffer Memory block for input/output operations via AVIOContext.
++ *        The buffer must be allocated with av_malloc() and friends.
++ *        It may be freed and replaced with a new buffer by libavformat.
++ *        AVIOContext.buffer holds the buffer currently in use,
++ *        which must be later freed with av_free().
++ * @param buffer_size The buffer size is very important for performance.
++ *        For protocols with fixed blocksize it should be set to this blocksize.
++ *        For others a typical size is a cache page, e.g. 4kb.
++ * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise.
++ * @param opaque An opaque pointer to user-specific data.
++ * @param read_packet  A function for refilling the buffer, may be NULL.
++ *                     For stream protocols, must never return 0 but rather
++ *                     a proper AVERROR code.
++ * @param write_packet A function for writing the buffer contents, may be NULL.
++ *        The function may not change the input buffers content.
++ * @param seek A function for seeking to specified byte position, may be NULL.
++ *
++ * @return Allocated AVIOContext or NULL on failure.
++ */
++AVIOContext *avio_alloc_context(
++                  unsigned char *buffer,
++                  int buffer_size,
++                  int write_flag,
++                  void *opaque,
++                  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
++                  int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size),
++                  int64_t (*seek)(void *opaque, int64_t offset, int whence));
++
++/**
++ * Free the supplied IO context and everything associated with it.
++ *
++ * @param s Double pointer to the IO context. This function will write NULL
++ * into s.
++ */
++void avio_context_free(AVIOContext **s);
++
++void avio_w8(AVIOContext *s, int b);
++void avio_write(AVIOContext *s, const unsigned char *buf, int size);
++void avio_wl64(AVIOContext *s, uint64_t val);
++void avio_wb64(AVIOContext *s, uint64_t val);
++void avio_wl32(AVIOContext *s, unsigned int val);
++void avio_wb32(AVIOContext *s, unsigned int val);
++void avio_wl24(AVIOContext *s, unsigned int val);
++void avio_wb24(AVIOContext *s, unsigned int val);
++void avio_wl16(AVIOContext *s, unsigned int val);
++void avio_wb16(AVIOContext *s, unsigned int val);
++
++/**
++ * Write a NULL-terminated string.
++ * @return number of bytes written.
++ */
++int avio_put_str(AVIOContext *s, const char *str);
++
++/**
++ * Convert an UTF-8 string to UTF-16LE and write it.
++ * @param s the AVIOContext
++ * @param str NULL-terminated UTF-8 string
++ *
++ * @return number of bytes written.
++ */
++int avio_put_str16le(AVIOContext *s, const char *str);
++
++/**
++ * Convert an UTF-8 string to UTF-16BE and write it.
++ * @param s the AVIOContext
++ * @param str NULL-terminated UTF-8 string
++ *
++ * @return number of bytes written.
++ */
++int avio_put_str16be(AVIOContext *s, const char *str);
++
++/**
++ * Mark the written bytestream as a specific type.
++ *
++ * Zero-length ranges are omitted from the output.
++ *
++ * @param s    the AVIOContext
++ * @param time the stream time the current bytestream pos corresponds to
++ *             (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not
++ *             applicable
++ * @param type the kind of data written starting at the current pos
++ */
++void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type);
++
++/**
++ * Passing this as the "whence" parameter to a seek function causes it to
++ * return the filesize without seeking anywhere. Supporting this is optional.
++ * If it is not supported then the seek function will return <0.
++ */
++#define AVSEEK_SIZE 0x10000
++
++/**
++ * OR'ing this flag into the "whence" parameter to a seek function causes it to
++ * seek by any means (like reopening and linear reading) or other normally unreasonable
++ * means that can be extremely slow.
++ * This is the default and therefore ignored by the seek code since 2010.
++ */
++#define AVSEEK_FORCE 0x20000
++
++/**
++ * fseek() equivalent for AVIOContext.
++ * @return new position or AVERROR.
++ */
++int64_t avio_seek(AVIOContext *s, int64_t offset, int whence);
++
++/**
++ * Skip given number of bytes forward
++ * @return new position or AVERROR.
++ */
++int64_t avio_skip(AVIOContext *s, int64_t offset);
++
++/**
++ * ftell() equivalent for AVIOContext.
++ * @return position or AVERROR.
++ */
++static av_always_inline int64_t avio_tell(AVIOContext *s)
++{
++    return avio_seek(s, 0, SEEK_CUR);
++}
++
++/**
++ * Get the filesize.
++ * @return filesize or AVERROR
++ */
++int64_t avio_size(AVIOContext *s);
++
++/**
++ * Similar to feof() but also returns nonzero on read errors.
++ * @return non zero if and only if at end of file or a read error happened when reading.
++ */
++int avio_feof(AVIOContext *s);
++
++/**
++ * Writes a formatted string to the context taking a va_list.
++ * @return number of bytes written, < 0 on error.
++ */
++int avio_vprintf(AVIOContext *s, const char *fmt, va_list ap);
++
++/**
++ * Writes a formatted string to the context.
++ * @return number of bytes written, < 0 on error.
++ */
++int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3);
++
++/**
++ * Write a NULL terminated array of strings to the context.
++ * Usually you don't need to use this function directly but its macro wrapper,
++ * avio_print.
++ */
++void avio_print_string_array(AVIOContext *s, const char * const strings[]);
++
++/**
++ * Write strings (const char *) to the context.
++ * This is a convenience macro around avio_print_string_array and it
++ * automatically creates the string array from the variable argument list.
++ * For simple string concatenations this function is more performant than using
++ * avio_printf since it does not need a temporary buffer.
++ */
++#define avio_print(s, ...) \
++    avio_print_string_array(s, (const char*[]){__VA_ARGS__, NULL})
++
++/**
++ * Force flushing of buffered data.
++ *
++ * For write streams, force the buffered data to be immediately written to the output,
++ * without to wait to fill the internal buffer.
++ *
++ * For read streams, discard all currently buffered data, and advance the
++ * reported file position to that of the underlying stream. This does not
++ * read new data, and does not perform any seeks.
++ */
++void avio_flush(AVIOContext *s);
++
++/**
++ * Read size bytes from AVIOContext into buf.
++ * @return number of bytes read or AVERROR
++ */
++int avio_read(AVIOContext *s, unsigned char *buf, int size);
++
++/**
++ * Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed
++ * to read fewer bytes than requested. The missing bytes can be read in the next
++ * call. This always tries to read at least 1 byte.
++ * Useful to reduce latency in certain cases.
++ * @return number of bytes read or AVERROR
++ */
++int avio_read_partial(AVIOContext *s, unsigned char *buf, int size);
++
++/**
++ * @name Functions for reading from AVIOContext
++ * @{
++ *
++ * @note return 0 if EOF, so you cannot use it if EOF handling is
++ *       necessary
++ */
++int          avio_r8  (AVIOContext *s);
++unsigned int avio_rl16(AVIOContext *s);
++unsigned int avio_rl24(AVIOContext *s);
++unsigned int avio_rl32(AVIOContext *s);
++uint64_t     avio_rl64(AVIOContext *s);
++unsigned int avio_rb16(AVIOContext *s);
++unsigned int avio_rb24(AVIOContext *s);
++unsigned int avio_rb32(AVIOContext *s);
++uint64_t     avio_rb64(AVIOContext *s);
++/**
++ * @}
++ */
++
++/**
++ * Read a string from pb into buf. The reading will terminate when either
++ * a NULL character was encountered, maxlen bytes have been read, or nothing
++ * more can be read from pb. The result is guaranteed to be NULL-terminated, it
++ * will be truncated if buf is too small.
++ * Note that the string is not interpreted or validated in any way, it
++ * might get truncated in the middle of a sequence for multi-byte encodings.
++ *
++ * @return number of bytes read (is always <= maxlen).
++ * If reading ends on EOF or error, the return value will be one more than
++ * bytes actually read.
++ */
++int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen);
++
++/**
++ * Read a UTF-16 string from pb and convert it to UTF-8.
++ * The reading will terminate when either a null or invalid character was
++ * encountered or maxlen bytes have been read.
++ * @return number of bytes read (is always <= maxlen)
++ */
++int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen);
++int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen);
++
++
++/**
++ * @name URL open modes
++ * The flags argument to avio_open must be one of the following
++ * constants, optionally ORed with other flags.
++ * @{
++ */
++#define AVIO_FLAG_READ  1                                      /**< read-only */
++#define AVIO_FLAG_WRITE 2                                      /**< write-only */
++#define AVIO_FLAG_READ_WRITE (AVIO_FLAG_READ|AVIO_FLAG_WRITE)  /**< read-write pseudo flag */
++/**
++ * @}
++ */
++
++/**
++ * Use non-blocking mode.
++ * If this flag is set, operations on the context will return
++ * AVERROR(EAGAIN) if they can not be performed immediately.
++ * If this flag is not set, operations on the context will never return
++ * AVERROR(EAGAIN).
++ * Note that this flag does not affect the opening/connecting of the
++ * context. Connecting a protocol will always block if necessary (e.g. on
++ * network protocols) but never hang (e.g. on busy devices).
++ * Warning: non-blocking protocols is work-in-progress; this flag may be
++ * silently ignored.
++ */
++#define AVIO_FLAG_NONBLOCK 8
++
++/**
++ * Use direct mode.
++ * avio_read and avio_write should if possible be satisfied directly
++ * instead of going through a buffer, and avio_seek will always
++ * call the underlying seek function directly.
++ */
++#define AVIO_FLAG_DIRECT 0x8000
++
++/**
++ * Create and initialize a AVIOContext for accessing the
++ * resource indicated by url.
++ * @note When the resource indicated by url has been opened in
++ * read+write mode, the AVIOContext can be used only for writing.
++ *
++ * @param s Used to return the pointer to the created AVIOContext.
++ * In case of failure the pointed to value is set to NULL.
++ * @param url resource to access
++ * @param flags flags which control how the resource indicated by url
++ * is to be opened
++ * @return >= 0 in case of success, a negative value corresponding to an
++ * AVERROR code in case of failure
++ */
++int avio_open(AVIOContext **s, const char *url, int flags);
++
++/**
++ * Create and initialize a AVIOContext for accessing the
++ * resource indicated by url.
++ * @note When the resource indicated by url has been opened in
++ * read+write mode, the AVIOContext can be used only for writing.
++ *
++ * @param s Used to return the pointer to the created AVIOContext.
++ * In case of failure the pointed to value is set to NULL.
++ * @param url resource to access
++ * @param flags flags which control how the resource indicated by url
++ * is to be opened
++ * @param int_cb an interrupt callback to be used at the protocols level
++ * @param options  A dictionary filled with protocol-private options. On return
++ * this parameter will be destroyed and replaced with a dict containing options
++ * that were not found. May be NULL.
++ * @return >= 0 in case of success, a negative value corresponding to an
++ * AVERROR code in case of failure
++ */
++int avio_open2(AVIOContext **s, const char *url, int flags,
++               const AVIOInterruptCB *int_cb, AVDictionary **options);
++
++/**
++ * Close the resource accessed by the AVIOContext s and free it.
++ * This function can only be used if s was opened by avio_open().
++ *
++ * The internal buffer is automatically flushed before closing the
++ * resource.
++ *
++ * @return 0 on success, an AVERROR < 0 on error.
++ * @see avio_closep
++ */
++int avio_close(AVIOContext *s);
++
++/**
++ * Close the resource accessed by the AVIOContext *s, free it
++ * and set the pointer pointing to it to NULL.
++ * This function can only be used if s was opened by avio_open().
++ *
++ * The internal buffer is automatically flushed before closing the
++ * resource.
++ *
++ * @return 0 on success, an AVERROR < 0 on error.
++ * @see avio_close
++ */
++int avio_closep(AVIOContext **s);
++
++
++/**
++ * Open a write only memory stream.
++ *
++ * @param s new IO context
++ * @return zero if no error.
++ */
++int avio_open_dyn_buf(AVIOContext **s);
++
++/**
++ * Return the written size and a pointer to the buffer.
++ * The AVIOContext stream is left intact.
++ * The buffer must NOT be freed.
++ * No padding is added to the buffer.
++ *
++ * @param s IO context
++ * @param pbuffer pointer to a byte buffer
++ * @return the length of the byte buffer
++ */
++int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer);
++
++/**
++ * Return the written size and a pointer to the buffer. The buffer
++ * must be freed with av_free().
++ * Padding of AV_INPUT_BUFFER_PADDING_SIZE is added to the buffer.
++ *
++ * @param s IO context
++ * @param pbuffer pointer to a byte buffer
++ * @return the length of the byte buffer
++ */
++int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer);
++
++/**
++ * Iterate through names of available protocols.
++ *
++ * @param opaque A private pointer representing current protocol.
++ *        It must be a pointer to NULL on first iteration and will
++ *        be updated by successive calls to avio_enum_protocols.
++ * @param output If set to 1, iterate over output protocols,
++ *               otherwise over input protocols.
++ *
++ * @return A static string containing the name of current protocol or NULL
++ */
++const char *avio_enum_protocols(void **opaque, int output);
++
++/**
++ * Get AVClass by names of available protocols.
++ *
++ * @return A AVClass of input protocol name or NULL
++ */
++const AVClass *avio_protocol_get_class(const char *name);
++
++/**
++ * Pause and resume playing - only meaningful if using a network streaming
++ * protocol (e.g. MMS).
++ *
++ * @param h     IO context from which to call the read_pause function pointer
++ * @param pause 1 for pause, 0 for resume
++ */
++int     avio_pause(AVIOContext *h, int pause);
++
++/**
++ * Seek to a given timestamp relative to some component stream.
++ * Only meaningful if using a network streaming protocol (e.g. MMS.).
++ *
++ * @param h IO context from which to call the seek function pointers
++ * @param stream_index The stream index that the timestamp is relative to.
++ *        If stream_index is (-1) the timestamp should be in AV_TIME_BASE
++ *        units from the beginning of the presentation.
++ *        If a stream_index >= 0 is used and the protocol does not support
++ *        seeking based on component streams, the call will fail.
++ * @param timestamp timestamp in AVStream.time_base units
++ *        or if there is no stream specified then in AV_TIME_BASE units.
++ * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE
++ *        and AVSEEK_FLAG_ANY. The protocol may silently ignore
++ *        AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will
++ *        fail if used and not supported.
++ * @return >= 0 on success
++ * @see AVInputFormat::read_seek
++ */
++int64_t avio_seek_time(AVIOContext *h, int stream_index,
++                       int64_t timestamp, int flags);
++
++/* Avoid a warning. The header can not be included because it breaks c++. */
++struct AVBPrint;
++
++/**
++ * Read contents of h into print buffer, up to max_size bytes, or up to EOF.
++ *
++ * @return 0 for success (max_size bytes read or EOF reached), negative error
++ * code otherwise
++ */
++int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size);
++
++/**
++ * Accept and allocate a client context on a server context.
++ * @param  s the server context
++ * @param  c the client context, must be unallocated
++ * @return   >= 0 on success or a negative value corresponding
++ *           to an AVERROR on failure
++ */
++int avio_accept(AVIOContext *s, AVIOContext **c);
++
++/**
++ * Perform one step of the protocol handshake to accept a new client.
++ * This function must be called on a client returned by avio_accept() before
++ * using it as a read/write context.
++ * It is separate from avio_accept() because it may block.
++ * A step of the handshake is defined by places where the application may
++ * decide to change the proceedings.
++ * For example, on a protocol with a request header and a reply header, each
++ * one can constitute a step because the application may use the parameters
++ * from the request to change parameters in the reply; or each individual
++ * chunk of the request can constitute a step.
++ * If the handshake is already finished, avio_handshake() does nothing and
++ * returns 0 immediately.
++ *
++ * @param  c the client context to perform the handshake on
++ * @return   0   on a complete and successful handshake
++ *           > 0 if the handshake progressed, but is not complete
++ *           < 0 for an AVERROR code
++ */
++int avio_handshake(AVIOContext *c);
++#endif /* AVFORMAT_AVIO_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/version.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/version.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/version.h.ffmpeg9	2026-09-07 12:23:47.675508743 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/version.h	2026-09-07 12:23:47.675488418 +0200
+@@ -0,0 +1,47 @@
++/*
++ * Version macros.
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General 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 AVFORMAT_VERSION_H
++#define AVFORMAT_VERSION_H
++
++/**
++ * @file
++ * @ingroup libavf
++ * Libavformat version macros
++ */
++
++#include "libavutil/version.h"
++
++#include "version_major.h"
++
++#define LIBAVFORMAT_VERSION_MINOR   1
++#define LIBAVFORMAT_VERSION_MICRO 100
++
++#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
++                                               LIBAVFORMAT_VERSION_MINOR, \
++                                               LIBAVFORMAT_VERSION_MICRO)
++#define LIBAVFORMAT_VERSION     AV_VERSION(LIBAVFORMAT_VERSION_MAJOR,   \
++                                           LIBAVFORMAT_VERSION_MINOR,   \
++                                           LIBAVFORMAT_VERSION_MICRO)
++#define LIBAVFORMAT_BUILD       LIBAVFORMAT_VERSION_INT
++
++#define LIBAVFORMAT_IDENT       "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION)
++
++#endif /* AVFORMAT_VERSION_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/version_major.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/version_major.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/version_major.h.ffmpeg9	2026-09-07 12:23:47.675583916 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavformat/version_major.h	2026-09-07 12:23:47.675561316 +0200
+@@ -0,0 +1,52 @@
++/*
++ * Version macros.
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General 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 AVFORMAT_VERSION_MAJOR_H
++#define AVFORMAT_VERSION_MAJOR_H
++
++/**
++ * @file
++ * @ingroup libavf
++ * Libavformat version macros
++ */
++
++// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
++// Also please add any ticket numbers that you believe might be affected here
++#define LIBAVFORMAT_VERSION_MAJOR  63
++
++/**
++ * 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_COMPUTE_PKT_FIELDS2      (LIBAVFORMAT_VERSION_MAJOR < 64)
++
++#define FF_API_FDEBUG_TS                (LIBAVFORMAT_VERSION_MAJOR < 64)
++
++#define FF_API_LCEVC_STRUCT             (LIBAVFORMAT_VERSION_MAJOR < 64)
++
++#define FF_API_R_FRAME_RATE            1
++
++#endif /* AVFORMAT_VERSION_MAJOR_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/attributes.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/attributes.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/attributes.h.ffmpeg9	2026-09-07 12:23:47.675692930 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/attributes.h	2026-09-07 12:23:47.675680982 +0200
+@@ -0,0 +1,235 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++/**
++ * @file
++ * Macro definitions for various function/variable attributes
++ */
++
++#ifndef AVUTIL_ATTRIBUTES_H
++#define AVUTIL_ATTRIBUTES_H
++
++#ifdef __GNUC__
++#    define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y))
++#    define AV_GCC_VERSION_AT_MOST(x,y)  (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y))
++#else
++#    define AV_GCC_VERSION_AT_LEAST(x,y) 0
++#    define AV_GCC_VERSION_AT_MOST(x,y)  0
++#endif
++
++#ifdef __has_builtin
++#    define AV_HAS_BUILTIN(x) __has_builtin(x)
++#else
++#    define AV_HAS_BUILTIN(x) 0
++#endif
++
++#ifdef __has_attribute
++#    define AV_HAS_ATTRIBUTE(x) __has_attribute(x)
++#else
++#    define AV_HAS_ATTRIBUTE(x) 0
++#endif
++
++#if defined(__cplusplus) && \
++    defined(__has_cpp_attribute) && \
++    __cplusplus >= 201103L
++#    define AV_HAS_STD_ATTRIBUTE(x) __has_cpp_attribute(x)
++#elif !defined(__cplusplus) && \
++      defined(__has_c_attribute) && \
++      defined(__STDC_VERSION__) && \
++      __STDC_VERSION__ >= 202311L
++#    define AV_HAS_STD_ATTRIBUTE(x) __has_c_attribute(x)
++#else
++#    define AV_HAS_STD_ATTRIBUTE(x) 0
++#endif
++
++#if AV_HAS_STD_ATTRIBUTE(fallthrough)
++#    define av_fallthrough [[fallthrough]]
++#elif AV_HAS_ATTRIBUTE(fallthrough)
++#    define av_fallthrough __attribute__((fallthrough))
++#else
++#    define av_fallthrough do {} while(0)
++#endif
++
++#ifndef av_always_inline
++#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__)
++#    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_HAS_STD_ATTRIBUTE(nodiscard)
++#    define av_warn_unused_result [[nodiscard]]
++#elif AV_GCC_VERSION_AT_LEAST(3,4) || defined(__clang__)
++#    define av_warn_unused_result __attribute__((warn_unused_result))
++#else
++#    define av_warn_unused_result
++#endif
++
++#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__)
++#    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(__clang__ )) || AV_HAS_ATTRIBUTE(flatten)
++#    define av_flatten __attribute__((flatten))
++#else
++#    define av_flatten
++#endif
++
++#if AV_HAS_STD_ATTRIBUTE(deprecated)
++#    define attribute_deprecated [[deprecated]]
++#elif AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__)
++#    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 AV_HAS_STD_ATTRIBUTE(maybe_unused)
++#    define av_unused [[maybe_unused]]
++#elif 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
++#else
++#    define av_builtin_constant_p(x) 0
++#endif
++
++// for __MINGW_PRINTF_FORMAT and __MINGW_SCANF_FORMAT
++#ifdef __MINGW32__
++#    include <stdio.h>
++#endif
++
++#ifdef __MINGW_PRINTF_FORMAT
++#    define AV_PRINTF_FMT __MINGW_PRINTF_FORMAT
++#elif AV_HAS_ATTRIBUTE(format)
++#    define AV_PRINTF_FMT __printf__
++#endif
++
++#ifdef __MINGW_SCANF_FORMAT
++#    define AV_SCANF_FMT __MINGW_SCANF_FORMAT
++#elif AV_HAS_ATTRIBUTE(format)
++#    define AV_SCANF_FMT __scanf__
++#endif
++
++#ifdef AV_PRINTF_FMT
++#    define av_printf_format(fmtpos, attrpos) __attribute__((format(AV_PRINTF_FMT, fmtpos, attrpos)))
++#else
++#    define av_printf_format(fmtpos, attrpos)
++#endif
++
++#ifdef AV_SCANF_FMT
++#    define av_scanf_format(fmtpos, attrpos) __attribute__((format(AV_SCANF_FMT, fmtpos, attrpos)))
++#else
++#    define av_scanf_format(fmtpos, attrpos)
++#endif
++
++#if AV_HAS_STD_ATTRIBUTE(noreturn)
++#    define av_noreturn [[noreturn]]
++#elif AV_GCC_VERSION_AT_LEAST(2,5) || defined(__clang__)
++#    define av_noreturn __attribute__((noreturn))
++#else
++#    define av_noreturn
++#endif
++
++#endif /* AVUTIL_ATTRIBUTES_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avconfig.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avconfig.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avconfig.h.ffmpeg9	2026-09-07 12:23:47.675755615 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avconfig.h	2026-09-07 12:23:47.675739041 +0200
+@@ -0,0 +1,24 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General 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_AVCONFIG_H
++#define AVUTIL_AVCONFIG_H
++
++#define AV_HAVE_BIGENDIAN 0
++
++#endif /* AVUTIL_AVCONFIG_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avstring.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avstring.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avstring.h.ffmpeg9	2026-09-07 12:23:47.675897999 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avstring.h	2026-09-07 12:23:47.675807799 +0200
+@@ -0,0 +1,428 @@
++/*
++ * Copyright (c) 2007 Mans Rullgard
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVUTIL_AVSTRING_H
++#define AVUTIL_AVSTRING_H
++
++#include <stddef.h>
++#include <stdint.h>
++#include "attributes.h"
++
++/**
++ * @addtogroup lavu_string
++ * @{
++ */
++
++/**
++ * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to
++ * the address of the first character in str after the prefix.
++ *
++ * @param str input string
++ * @param pfx prefix to test
++ * @param ptr updated if the prefix is matched inside str
++ * @return non-zero if the prefix matches, zero otherwise
++ */
++int av_strstart(const char *str, const char *pfx, const char **ptr);
++
++/**
++ * Return non-zero if pfx is a prefix of str independent of case. If
++ * it is, *ptr is set to the address of the first character in str
++ * after the prefix.
++ *
++ * @param str input string
++ * @param pfx prefix to test
++ * @param ptr updated if the prefix is matched inside str
++ * @return non-zero if the prefix matches, zero otherwise
++ */
++int av_stristart(const char *str, const char *pfx, const char **ptr);
++
++/**
++ * Locate the first case-independent occurrence in the string haystack
++ * of the string needle.  A zero-length string needle is considered to
++ * match at the start of haystack.
++ *
++ * This function is a case-insensitive version of the standard strstr().
++ *
++ * @param haystack string to search in
++ * @param needle   string to search for
++ * @return         pointer to the located match within haystack
++ *                 or a null pointer if no match
++ */
++char *av_stristr(const char *haystack, const char *needle);
++
++/**
++ * Locate the first occurrence of the string needle in the string haystack
++ * where not more than hay_length characters are searched. A zero-length
++ * string needle is considered to match at the start of haystack.
++ *
++ * This function is a length-limited version of the standard strstr().
++ *
++ * @param haystack   string to search in
++ * @param needle     string to search for
++ * @param hay_length length of string to search in
++ * @return           pointer to the located match within haystack
++ *                   or a null pointer if no match
++ */
++char *av_strnstr(const char *haystack, const char *needle, size_t hay_length);
++
++/**
++ * Copy the string src to dst, but no more than size - 1 bytes, and
++ * null-terminate dst.
++ *
++ * This function is the same as BSD strlcpy().
++ *
++ * @param dst destination buffer
++ * @param src source string
++ * @param size size of destination buffer
++ * @return the length of src
++ *
++ * @warning since the return value is the length of src, src absolutely
++ * _must_ be a properly 0-terminated string, otherwise this will read beyond
++ * the end of the buffer and possibly crash.
++ */
++size_t av_strlcpy(char *dst, const char *src, size_t size);
++
++/**
++ * Append the string src to the string dst, but to a total length of
++ * no more than size - 1 bytes, and null-terminate dst.
++ *
++ * This function is similar to BSD strlcat(), but differs when
++ * size <= strlen(dst).
++ *
++ * @param dst destination buffer
++ * @param src source string
++ * @param size size of destination buffer
++ * @return the total length of src and dst
++ *
++ * @warning since the return value use the length of src and dst, these
++ * absolutely _must_ be a properly 0-terminated strings, otherwise this
++ * will read beyond the end of the buffer and possibly crash.
++ */
++size_t av_strlcat(char *dst, const char *src, size_t size);
++
++/**
++ * Append output to a string, according to a format. Never write out of
++ * the destination buffer, and always put a terminating 0 within
++ * the buffer.
++ * @param dst destination buffer (string to which the output is
++ *  appended)
++ * @param size total size of the destination buffer
++ * @param fmt printf-compatible format string, specifying how the
++ *  following parameters are used
++ * @return the length of the string that would have been generated
++ *  if enough space had been available
++ */
++size_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4);
++
++/**
++ * Get the count of continuous non zero chars starting from the beginning.
++ *
++ * @param s   the string whose length to count
++ * @param len maximum number of characters to check in the string, that
++ *            is the maximum value which is returned by the function
++ */
++static inline size_t av_strnlen(const char *s, size_t len)
++{
++    size_t i;
++    for (i = 0; i < len && s[i]; i++)
++        ;
++    return i;
++}
++
++/**
++ * Print arguments following specified format into a large enough auto
++ * allocated buffer. It is similar to GNU asprintf().
++ * @param fmt printf-compatible format string, specifying how the
++ *            following parameters are used.
++ * @return the allocated string
++ * @note You have to free the string yourself with av_free().
++ */
++char *av_asprintf(const char *fmt, ...) av_printf_format(1, 2);
++
++/**
++ * Unescape the given string until a non escaped terminating char,
++ * and return the token corresponding to the unescaped string.
++ *
++ * The normal \ and ' escaping is supported. Leading and trailing
++ * whitespaces are removed, unless they are escaped with '\' or are
++ * enclosed between ''.
++ *
++ * @param buf the buffer to parse, buf will be updated to point to the
++ * terminating char
++ * @param term a 0-terminated list of terminating chars
++ * @return the malloced unescaped string, which must be av_freed by
++ * the user, NULL in case of allocation failure
++ */
++char *av_get_token(const char **buf, const char *term);
++
++/**
++ * Split the string into several tokens which can be accessed by
++ * successive calls to av_strtok().
++ *
++ * A token is defined as a sequence of characters not belonging to the
++ * set specified in delim.
++ *
++ * On the first call to av_strtok(), s should point to the string to
++ * parse, and the value of saveptr is ignored. In subsequent calls, s
++ * should be NULL, and saveptr should be unchanged since the previous
++ * call.
++ *
++ * This function is similar to strtok_r() defined in POSIX.1.
++ *
++ * @param s the string to parse, may be NULL
++ * @param delim 0-terminated list of token delimiters, must be non-NULL
++ * @param saveptr user-provided pointer which points to stored
++ * information necessary for av_strtok() to continue scanning the same
++ * string. saveptr is updated to point to the next character after the
++ * first delimiter found, or to NULL if the string was terminated
++ * @return the found token, or NULL when no token is found
++ */
++char *av_strtok(char *s, const char *delim, char **saveptr);
++
++/**
++ * Locale-independent conversion of ASCII isdigit.
++ */
++static inline av_const int av_isdigit(int c)
++{
++    return c >= '0' && c <= '9';
++}
++
++/**
++ * Locale-independent conversion of ASCII isgraph.
++ */
++static inline av_const int av_isgraph(int c)
++{
++    return c > 32 && c < 127;
++}
++
++/**
++ * Locale-independent conversion of ASCII isspace.
++ */
++static inline av_const int av_isspace(int c)
++{
++    return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' ||
++           c == '\v';
++}
++
++/**
++ * Locale-independent conversion of ASCII characters to uppercase.
++ */
++static inline av_const int av_toupper(int c)
++{
++    if (c >= 'a' && c <= 'z')
++        c ^= 0x20;
++    return c;
++}
++
++/**
++ * Locale-independent conversion of ASCII characters to lowercase.
++ */
++static inline av_const int av_tolower(int c)
++{
++    if (c >= 'A' && c <= 'Z')
++        c ^= 0x20;
++    return c;
++}
++
++/**
++ * Locale-independent conversion of ASCII isxdigit.
++ */
++static inline av_const int av_isxdigit(int c)
++{
++    c = av_tolower(c);
++    return av_isdigit(c) || (c >= 'a' && c <= 'f');
++}
++
++/**
++ * Locale-independent case-insensitive compare.
++ * @note This means only ASCII-range characters are case-insensitive
++ */
++int av_strcasecmp(const char *a, const char *b);
++
++/**
++ * Locale-independent case-insensitive compare.
++ * @note This means only ASCII-range characters are case-insensitive
++ */
++int av_strncasecmp(const char *a, const char *b, size_t n);
++
++/**
++ * Locale-independent strings replace.
++ * @note This means only ASCII-range characters are replaced.
++ */
++char *av_strireplace(const char *str, const char *from, const char *to);
++
++/**
++ * Thread safe basename.
++ * @param path the string to parse, on DOS both \ and / are considered separators.
++ * @return pointer to the basename substring.
++ * If path does not contain a slash, the function returns a copy of path.
++ * If path is a NULL pointer or points to an empty string, a pointer
++ * to a string "." is returned.
++ */
++const char *av_basename(const char *path);
++
++/**
++ * Thread safe dirname.
++ * @param path the string to parse, on DOS both \ and / are considered separators.
++ * @return A pointer to a string that's the parent directory of path.
++ * If path is a NULL pointer or points to an empty string, a pointer
++ * to a string "." is returned.
++ * @note the function may modify the contents of the path, so copies should be passed.
++ */
++const char *av_dirname(char *path);
++
++/**
++ * Match instances of a name in a comma-separated list of names.
++ * List entries are checked from the start to the end of the names list,
++ * the first match ends further processing. If an entry prefixed with '-'
++ * matches, then 0 is returned. The "ALL" list entry is considered to
++ * match all names.
++ *
++ * @param name  Name to look for.
++ * @param names List of names.
++ * @return 1 on match, 0 otherwise.
++ */
++int av_match_name(const char *name, const char *names);
++
++/**
++ * Append path component to the existing path.
++ * Path separator '/' is placed between when needed.
++ * Resulting string have to be freed with av_free().
++ * @param path      base path
++ * @param component component to be appended
++ * @return new path or NULL on error.
++ */
++char *av_append_path_component(const char *path, const char *component);
++
++enum AVEscapeMode {
++    AV_ESCAPE_MODE_AUTO,      ///< Use auto-selected escaping mode.
++    AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping.
++    AV_ESCAPE_MODE_QUOTE,     ///< Use single-quote escaping.
++    AV_ESCAPE_MODE_XML,       ///< Use XML non-markup character data escaping.
++};
++
++/**
++ * Consider spaces special and escape them even in the middle of the
++ * string.
++ *
++ * This is equivalent to adding the whitespace characters to the special
++ * characters lists, except it is guaranteed to use the exact same list
++ * of whitespace characters as the rest of libavutil.
++ */
++#define AV_ESCAPE_FLAG_WHITESPACE (1 << 0)
++
++/**
++ * Escape only specified special characters.
++ * Without this flag, escape also any characters that may be considered
++ * special by av_get_token(), such as the single quote.
++ */
++#define AV_ESCAPE_FLAG_STRICT (1 << 1)
++
++/**
++ * Within AV_ESCAPE_MODE_XML, additionally escape single quotes for single
++ * quoted attributes.
++ */
++#define AV_ESCAPE_FLAG_XML_SINGLE_QUOTES (1 << 2)
++
++/**
++ * Within AV_ESCAPE_MODE_XML, additionally escape double quotes for double
++ * quoted attributes.
++ */
++#define AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES (1 << 3)
++
++
++/**
++ * Escape string in src, and put the escaped string in an allocated
++ * string in *dst, which must be freed with av_free().
++ *
++ * @param dst           pointer where an allocated string is put
++ * @param src           string to escape, must be non-NULL
++ * @param special_chars string containing the special characters which
++ *                      need to be escaped, can be NULL
++ * @param mode          escape mode to employ, see AV_ESCAPE_MODE_* macros.
++ *                      Any unknown value for mode will be considered equivalent to
++ *                      AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without
++ *                      notice.
++ * @param flags         flags which control how to escape, see AV_ESCAPE_FLAG_ macros
++ * @return the length of the allocated string, or a negative error code in case of error
++ * @see av_bprint_escape()
++ */
++av_warn_unused_result
++int av_escape(char **dst, const char *src, const char *special_chars,
++              enum AVEscapeMode mode, int flags);
++
++#define AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES          1 ///< accept codepoints over 0x10FFFF
++#define AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS             2 ///< accept non-characters - 0xFFFE and 0xFFFF
++#define AV_UTF8_FLAG_ACCEPT_SURROGATES                 4 ///< accept UTF-16 surrogates codes
++#define AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES 8 ///< exclude control codes not accepted by XML
++
++#define AV_UTF8_FLAG_ACCEPT_ALL \
++    AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES|AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS|AV_UTF8_FLAG_ACCEPT_SURROGATES
++
++/**
++ * Read and decode a single UTF-8 code point (character) from the
++ * buffer in *buf, and update *buf to point to the next byte to
++ * decode.
++ *
++ * In case of an invalid byte sequence, the pointer will be updated to
++ * the next byte after the invalid sequence and the function will
++ * return an error code.
++ *
++ * Depending on the specified flags, the function will also fail in
++ * case the decoded code point does not belong to a valid range.
++ *
++ * @note For speed-relevant code a carefully implemented use of
++ * GET_UTF8() may be preferred.
++ *
++ * @param codep   pointer used to return the parsed code in case of success.
++ *                The value in *codep is set even in case the range check fails.
++ * @param bufp    pointer to the address the first byte of the sequence
++ *                to decode, updated by the function to point to the
++ *                byte next after the decoded sequence
++ * @param buf_end pointer to the end of the buffer, points to the next
++ *                byte past the last in the buffer. This is used to
++ *                avoid buffer overreads (in case of an unfinished
++ *                UTF-8 sequence towards the end of the buffer).
++ * @param flags   a collection of AV_UTF8_FLAG_* flags
++ * @return >= 0 in case a sequence was successfully read, a negative
++ * value in case of invalid sequence
++ */
++av_warn_unused_result
++int av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end,
++                   unsigned int flags);
++
++/**
++ * Check if a name is in a list.
++ * @returns 0 if not found, or the 1 based index where it has been found in the
++ *            list.
++ */
++int av_match_list(const char *name, const char *list, char separator);
++
++/**
++ * See libc sscanf manual for more information.
++ * Locale-independent sscanf implementation.
++ */
++int av_sscanf(const char *string, const char *format, ...) av_scanf_format(2, 3);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_AVSTRING_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avutil.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avutil.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avutil.h.ffmpeg9	2026-09-07 12:23:47.676003734 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/avutil.h	2026-09-07 12:23:47.675942249 +0200
+@@ -0,0 +1,340 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVUTIL_AVUTIL_H
++#define AVUTIL_AVUTIL_H
++
++/**
++ * @file
++ * @ingroup lavu
++ * Convenience header that includes @ref lavu "libavutil"'s core.
++ */
++
++/**
++ * @mainpage
++ *
++ * @section ffmpeg_intro Introduction
++ *
++ * This document describes the usage of the different libraries
++ * provided by FFmpeg.
++ *
++ * @li @ref libavc "libavcodec" encoding/decoding library
++ * @li @ref lavfi "libavfilter" graph-based frame editing library
++ * @li @ref libavf "libavformat" I/O and muxing/demuxing library
++ * @li @ref lavd "libavdevice" special devices muxing/demuxing library
++ * @li @ref lavu "libavutil" common utility library
++ * @li @ref lswr "libswresample" audio resampling, format conversion and mixing
++ * @li @ref libsws "libswscale" color conversion and scaling library
++ *
++ * @section ffmpeg_versioning Versioning and compatibility
++ *
++ * Each of the FFmpeg libraries contains a version.h header, which defines a
++ * major, minor and micro version number with the
++ * <em>LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO}</em> macros. The major version
++ * number is incremented with backward incompatible changes - e.g. removing
++ * parts of the public API, reordering public struct members, etc. The minor
++ * version number is incremented for backward compatible API changes or major
++ * new features - e.g. adding a new public function or a new decoder. The micro
++ * version number is incremented for smaller changes that a calling program
++ * might still want to check for - e.g. changing behavior in a previously
++ * unspecified situation.
++ *
++ * FFmpeg guarantees backward API and ABI compatibility for each library as long
++ * as its major version number is unchanged. This means that no public symbols
++ * will be removed or renamed. Types and names of the public struct members and
++ * values of public macros and enums will remain the same (unless they were
++ * explicitly declared as not part of the public API). Documented behavior will
++ * not change.
++ *
++ * In other words, any correct program that works with a given FFmpeg snapshot
++ * should work just as well without any changes with any later snapshot with the
++ * same major versions. This applies to both rebuilding the program against new
++ * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program
++ * links against.
++ *
++ * However, new public symbols may be added and new members may be appended to
++ * public structs whose size is not part of public ABI (most public structs in
++ * FFmpeg). New macros and enum values may be added. Behavior in undocumented
++ * situations may change slightly (and be documented). All those are accompanied
++ * by an entry in doc/APIchanges and incrementing either the minor or micro
++ * version number.
++ */
++
++/**
++ * @defgroup lavu libavutil
++ * Common code shared across all FFmpeg libraries.
++ *
++ * @note
++ * libavutil is designed to be modular. In most cases, in order to use the
++ * functions provided by one component of libavutil you must explicitly include
++ * the specific header containing that feature. If you are only using
++ * media-related components, you could simply include libavutil/avutil.h, which
++ * brings in most of the "core" components.
++ *
++ * @{
++ *
++ * @defgroup lavu_crypto Crypto and Hashing
++ *
++ * @{
++ * @}
++ *
++ * @defgroup lavu_math Mathematics
++ * @{
++ *
++ * @}
++ *
++ * @defgroup lavu_string String Manipulation
++ *
++ * @{
++ *
++ * @}
++ *
++ * @defgroup lavu_mem Memory Management
++ *
++ * @{
++ *
++ * @}
++ *
++ * @defgroup lavu_data Data Structures
++ * @{
++ *
++ * @}
++ *
++ * @defgroup lavu_video Video related
++ *
++ * @{
++ *
++ * @}
++ *
++ * @defgroup lavu_audio Audio related
++ *
++ * @{
++ *
++ * @}
++ *
++ * @defgroup lavu_error Error Codes
++ *
++ * @{
++ *
++ * @}
++ *
++ * @defgroup lavu_log Logging Facility
++ *
++ * @{
++ *
++ * @}
++ *
++ * @defgroup lavu_misc Other
++ *
++ * @{
++ *
++ * @defgroup preproc_misc Preprocessor String Macros
++ *
++ * @{
++ *
++ * @}
++ *
++ * @defgroup version_utils Library Version Macros
++ *
++ * @{
++ *
++ * @}
++ */
++
++
++/**
++ * @addtogroup lavu_ver
++ * @{
++ */
++
++/**
++ * Return the LIBAVUTIL_VERSION_INT constant.
++ */
++unsigned avutil_version(void);
++
++/**
++ * Return an informative version string. This usually is the actual release
++ * version number or a git commit description. This string has no fixed format
++ * and can change any time. It should never be parsed by code.
++ */
++const char *av_version_info(void);
++
++/**
++ * Return the libavutil build-time configuration.
++ */
++const char *avutil_configuration(void);
++
++/**
++ * Return the libavutil license.
++ */
++const char *avutil_license(void);
++
++/**
++ * @}
++ */
++
++/**
++ * @addtogroup lavu_media Media Type
++ * @brief Media Type
++ */
++
++enum AVMediaType {
++    AVMEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATA
++    AVMEDIA_TYPE_VIDEO,
++    AVMEDIA_TYPE_AUDIO,
++    AVMEDIA_TYPE_DATA,          ///< Opaque data information usually continuous
++    AVMEDIA_TYPE_SUBTITLE,
++    AVMEDIA_TYPE_ATTACHMENT,    ///< Opaque data information usually sparse
++    AVMEDIA_TYPE_NB
++};
++
++/**
++ * Return a string describing the media_type enum, NULL if media_type
++ * is unknown.
++ */
++const char *av_get_media_type_string(enum AVMediaType media_type);
++
++/**
++ * @defgroup lavu_const Constants
++ * @{
++ *
++ * @defgroup lavu_enc Encoding specific
++ *
++ * @note those definition should move to avcodec
++ * @{
++ */
++
++#define FF_LAMBDA_SHIFT 7
++#define FF_LAMBDA_SCALE (1<<FF_LAMBDA_SHIFT)
++#define FF_QP2LAMBDA 118 ///< factor to convert from H.263 QP to lambda
++#define FF_LAMBDA_MAX (256*128-1)
++
++#define FF_QUALITY_SCALE FF_LAMBDA_SCALE //FIXME maybe remove
++
++/**
++ * @}
++ * @defgroup lavu_time Timestamp specific
++ *
++ * FFmpeg internal timebase and timestamp definitions
++ *
++ * @{
++ */
++
++/**
++ * @brief Undefined timestamp value
++ *
++ * Usually reported by demuxer that work on containers that do not provide
++ * either pts or dts.
++ */
++
++#define AV_NOPTS_VALUE          ((int64_t)UINT64_C(0x8000000000000000))
++
++/**
++ * Internal time base represented as integer
++ */
++
++#define AV_TIME_BASE            1000000
++
++/**
++ * Internal time base represented as fractional value
++ */
++
++#ifdef __cplusplus
++/* ISO C++ forbids compound-literals. */
++#define AV_TIME_BASE_Q          av_make_q(1, AV_TIME_BASE)
++#else
++#define AV_TIME_BASE_Q          (AVRational){1, AV_TIME_BASE}
++#endif
++
++/**
++ * @}
++ * @}
++ * @defgroup lavu_picture Image related
++ *
++ * AVPicture types, pixel formats and basic image planes manipulation.
++ *
++ * @{
++ */
++
++enum AVPictureType {
++    AV_PICTURE_TYPE_NONE = 0, ///< Undefined
++    AV_PICTURE_TYPE_I,     ///< Intra
++    AV_PICTURE_TYPE_P,     ///< Predicted
++    AV_PICTURE_TYPE_B,     ///< Bi-dir predicted
++    AV_PICTURE_TYPE_S,     ///< S(GMC)-VOP MPEG-4
++    AV_PICTURE_TYPE_SI,    ///< Switching Intra
++    AV_PICTURE_TYPE_SP,    ///< Switching Predicted
++    AV_PICTURE_TYPE_BI,    ///< BI type
++};
++
++/**
++ * Return a single letter to describe the given picture type
++ * pict_type.
++ *
++ * @param[in] pict_type the picture type @return a single character
++ * representing the picture type, '?' if pict_type is unknown
++ */
++char av_get_picture_type_char(enum AVPictureType pict_type);
++
++/**
++ * @}
++ */
++
++#include "common.h"
++#include "rational.h"
++#include "version.h"
++#include "macros.h"
++#include "mathematics.h"
++#include "log.h"
++#include "pixfmt.h"
++
++/**
++ * Return x default pointer in case p is NULL.
++ */
++static inline void *av_x_if_null(const void *p, const void *x)
++{
++    return (void *)(intptr_t)(p ? p : x);
++}
++
++/**
++ * 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 -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/buffer.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/buffer.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/buffer.h.ffmpeg9	2026-09-07 12:23:47.676134844 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/buffer.h	2026-09-07 12:23:47.676065979 +0200
+@@ -0,0 +1,322 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++/**
++ * @file
++ * @ingroup lavu_buffer
++ * refcounted data buffer API
++ */
++
++#ifndef AVUTIL_BUFFER_H
++#define AVUTIL_BUFFER_H
++
++#include <stddef.h>
++#include <stdint.h>
++
++/**
++ * @defgroup lavu_buffer AVBuffer
++ * @ingroup lavu_data
++ *
++ * @{
++ * AVBuffer is an API for reference-counted data buffers.
++ *
++ * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer
++ * represents the data buffer itself; it is opaque and not meant to be accessed
++ * by the caller directly, but only through AVBufferRef. However, the caller may
++ * e.g. compare two AVBuffer pointers to check whether two different references
++ * are describing the same data buffer. AVBufferRef represents a single
++ * reference to an AVBuffer and it is the object that may be manipulated by the
++ * caller directly.
++ *
++ * There are two functions provided for creating a new AVBuffer with a single
++ * reference -- av_buffer_alloc() to just allocate a new buffer, and
++ * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing
++ * reference, additional references may be created with av_buffer_ref().
++ * Use av_buffer_unref() to free a reference (this will automatically free the
++ * data once all the references are freed).
++ *
++ * The convention throughout this API and the rest of FFmpeg is such that the
++ * buffer is considered writable if there exists only one reference to it (and
++ * it has not been marked as read-only). The av_buffer_is_writable() function is
++ * provided to check whether this is true and av_buffer_make_writable() will
++ * automatically create a new writable buffer when necessary.
++ * Of course nothing prevents the calling code from violating this convention,
++ * however that is safe only when all the existing references are under its
++ * control.
++ *
++ * @note Referencing and unreferencing the buffers is thread-safe and thus
++ * may be done from multiple threads simultaneously without any need for
++ * additional locking.
++ *
++ * @note Two different references to the same buffer can point to different
++ * parts of the buffer (i.e. their AVBufferRef.data will not be equal).
++ */
++
++/**
++ * A reference counted buffer type. It is opaque and is meant to be used through
++ * references (AVBufferRef).
++ */
++typedef struct AVBuffer AVBuffer;
++
++/**
++ * A reference to a data buffer.
++ *
++ * The size of this struct is not a part of the public ABI and it is not meant
++ * to be allocated directly.
++ */
++typedef struct AVBufferRef {
++    AVBuffer *buffer;
++
++    /**
++     * The data buffer. It is considered writable if and only if
++     * this is the only reference to the buffer, in which case
++     * av_buffer_is_writable() returns 1.
++     */
++    uint8_t *data;
++    /**
++     * Size of data in bytes.
++     */
++    size_t   size;
++} AVBufferRef;
++
++/**
++ * Allocate an AVBuffer of the given size using av_malloc().
++ *
++ * @return an AVBufferRef of given size or NULL when out of memory
++ */
++AVBufferRef *av_buffer_alloc(size_t size);
++
++/**
++ * Same as av_buffer_alloc(), except the returned buffer will be initialized
++ * to zero.
++ */
++AVBufferRef *av_buffer_allocz(size_t size);
++
++/**
++ * Always treat the buffer as read-only, even when it has only one
++ * reference.
++ */
++#define AV_BUFFER_FLAG_READONLY (1 << 0)
++
++/**
++ * Create an AVBuffer from an existing array.
++ *
++ * If this function is successful, data is owned by the AVBuffer. The caller may
++ * only access data through the returned AVBufferRef and references derived from
++ * it.
++ * If this function fails, data is left untouched.
++ * @param data   data array
++ * @param size   size of data in bytes
++ * @param free   a callback for freeing this buffer's data
++ * @param opaque parameter to be got for processing or passed to free
++ * @param flags  a combination of AV_BUFFER_FLAG_*
++ *
++ * @return an AVBufferRef referring to data on success, NULL on failure.
++ */
++AVBufferRef *av_buffer_create(uint8_t *data, size_t size,
++                              void (*free)(void *opaque, uint8_t *data),
++                              void *opaque, int flags);
++
++/**
++ * Default free callback, which calls av_free() on the buffer data.
++ * This function is meant to be passed to av_buffer_create(), not called
++ * directly.
++ */
++void av_buffer_default_free(void *opaque, uint8_t *data);
++
++/**
++ * Create a new reference to an AVBuffer.
++ *
++ * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on
++ * failure.
++ */
++AVBufferRef *av_buffer_ref(const AVBufferRef *buf);
++
++/**
++ * Free a given reference and automatically free the buffer if there are no more
++ * references to it.
++ *
++ * @param buf the reference to be freed. The pointer is set to NULL on return.
++ */
++void av_buffer_unref(AVBufferRef **buf);
++
++/**
++ * @return 1 if the caller may write to the data referred to by buf (which is
++ * true if and only if buf is the only reference to the underlying AVBuffer).
++ * Return 0 otherwise.
++ * A positive answer is valid until av_buffer_ref() is called on buf.
++ */
++int av_buffer_is_writable(const AVBufferRef *buf);
++
++/**
++ * @return the opaque parameter set by av_buffer_create.
++ */
++void *av_buffer_get_opaque(const AVBufferRef *buf);
++
++int av_buffer_get_ref_count(const AVBufferRef *buf);
++
++/**
++ * Create a writable reference from a given buffer reference, avoiding data copy
++ * if possible.
++ *
++ * @param buf buffer reference to make writable. On success, buf is either left
++ *            untouched, or it is unreferenced and a new writable AVBufferRef is
++ *            written in its place. On failure, buf is left untouched.
++ * @return 0 on success, a negative AVERROR on failure.
++ */
++int av_buffer_make_writable(AVBufferRef **buf);
++
++/**
++ * Reallocate a given buffer.
++ *
++ * @param buf  a buffer reference to reallocate. On success, buf will be
++ *             unreferenced and a new reference with the required size will be
++ *             written in its place. On failure buf will be left untouched. *buf
++ *             may be NULL, then a new buffer is allocated.
++ * @param size required new buffer size.
++ * @return 0 on success, a negative AVERROR on failure.
++ *
++ * @note the buffer is actually reallocated with av_realloc() only if it was
++ * initially allocated through av_buffer_realloc(NULL) and there is only one
++ * reference to it (i.e. the one passed to this function). In all other cases
++ * a new buffer is allocated and the data is copied.
++ */
++int av_buffer_realloc(AVBufferRef **buf, size_t size);
++
++/**
++ * Ensure dst refers to the same data as src.
++ *
++ * When *dst is already equivalent to src, do nothing. Otherwise unreference dst
++ * and replace it with a new reference to src.
++ *
++ * @param dst Pointer to either a valid buffer reference or NULL. On success,
++ *            this will point to a buffer reference equivalent to src. On
++ *            failure, dst will be left untouched.
++ * @param src A buffer reference to replace dst with. May be NULL, then this
++ *            function is equivalent to av_buffer_unref(dst).
++ * @return 0 on success
++ *         AVERROR(ENOMEM) on memory allocation failure.
++ */
++int av_buffer_replace(AVBufferRef **dst, const AVBufferRef *src);
++
++/**
++ * @}
++ */
++
++/**
++ * @defgroup lavu_bufferpool AVBufferPool
++ * @ingroup lavu_data
++ *
++ * @{
++ * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers.
++ *
++ * Frequently allocating and freeing large buffers may be slow. AVBufferPool is
++ * meant to solve this in cases when the caller needs a set of buffers of the
++ * same size (the most obvious use case being buffers for raw video or audio
++ * frames).
++ *
++ * At the beginning, the user must call av_buffer_pool_init() to create the
++ * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to
++ * get a reference to a new buffer, similar to av_buffer_alloc(). This new
++ * reference works in all aspects the same way as the one created by
++ * av_buffer_alloc(). However, when the last reference to this buffer is
++ * unreferenced, it is returned to the pool instead of being freed and will be
++ * reused for subsequent av_buffer_pool_get() calls.
++ *
++ * When the caller is done with the pool and no longer needs to allocate any new
++ * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable.
++ * Once all the buffers are released, it will automatically be freed.
++ *
++ * Allocating and releasing buffers with this API is thread-safe as long as
++ * either the default alloc callback is used, or the user-supplied one is
++ * thread-safe.
++ */
++
++/**
++ * The buffer pool. This structure is opaque and not meant to be accessed
++ * directly. It is allocated with av_buffer_pool_init() and freed with
++ * av_buffer_pool_uninit().
++ */
++typedef struct AVBufferPool AVBufferPool;
++
++/**
++ * Allocate and initialize a buffer pool.
++ *
++ * @param size size of each buffer in this pool
++ * @param alloc a function that will be used to allocate new buffers when the
++ * pool is empty. May be NULL, then the default allocator will be used
++ * (av_buffer_alloc()).
++ * @return newly created buffer pool on success, NULL on error.
++ */
++AVBufferPool *av_buffer_pool_init(size_t size, AVBufferRef* (*alloc)(size_t size));
++
++/**
++ * Allocate and initialize a buffer pool with a more complex allocator.
++ *
++ * @param size size of each buffer in this pool
++ * @param opaque arbitrary user data used by the allocator
++ * @param alloc a function that will be used to allocate new buffers when the
++ *              pool is empty. May be NULL, then the default allocator will be
++ *              used (av_buffer_alloc()).
++ * @param pool_free a function that will be called immediately before the pool
++ *                  is freed. I.e. after av_buffer_pool_uninit() is called
++ *                  by the caller and all the frames are returned to the pool
++ *                  and freed. It is intended to uninitialize the user opaque
++ *                  data. May be NULL.
++ * @return newly created buffer pool on success, NULL on error.
++ */
++AVBufferPool *av_buffer_pool_init2(size_t size, void *opaque,
++                                   AVBufferRef* (*alloc)(void *opaque, size_t size),
++                                   void (*pool_free)(void *opaque));
++
++/**
++ * Mark the pool as being available for freeing. It will actually be freed only
++ * once all the allocated buffers associated with the pool are released. Thus it
++ * is safe to call this function while some of the allocated buffers are still
++ * in use.
++ *
++ * @param pool pointer to the pool to be freed. It will be set to NULL.
++ */
++void av_buffer_pool_uninit(AVBufferPool **pool);
++
++/**
++ * Allocate a new AVBuffer, reusing an old buffer from the pool when available.
++ * This function may be called simultaneously from multiple threads.
++ *
++ * @return a reference to the new buffer on success, NULL on error.
++ */
++AVBufferRef *av_buffer_pool_get(AVBufferPool *pool);
++
++/**
++ * Query the original opaque parameter of an allocated buffer in the pool.
++ *
++ * @param ref a buffer reference to a buffer returned by av_buffer_pool_get.
++ * @return the opaque parameter set by the buffer allocator function of the
++ *         buffer pool.
++ *
++ * @note the opaque parameter of ref is used by the buffer pool implementation,
++ * therefore you have to use this function to access the original opaque
++ * parameter of an allocated buffer.
++ */
++void *av_buffer_pool_buffer_get_opaque(const AVBufferRef *ref);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_BUFFER_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/channel_layout.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/channel_layout.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/channel_layout.h.ffmpeg9	2026-09-07 12:23:47.676345289 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/channel_layout.h	2026-09-07 12:23:47.676183553 +0200
+@@ -0,0 +1,762 @@
++/*
++ * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
++ * Copyright (c) 2008 Peter Ross
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVUTIL_CHANNEL_LAYOUT_H
++#define AVUTIL_CHANNEL_LAYOUT_H
++
++#include <stdint.h>
++#include <stdlib.h>
++
++#include "version.h"
++#include "attributes.h"
++
++/**
++ * @file
++ * @ingroup lavu_audio_channels
++ * Public libavutil channel layout APIs header.
++ */
++
++
++/**
++ * @defgroup lavu_audio_channels Audio channels
++ * @ingroup lavu_audio
++ *
++ * Audio channel layout utility functions
++ *
++ * @{
++ */
++
++enum AVChannel {
++    /// Invalid channel index
++    AV_CHAN_NONE = -1,
++    AV_CHAN_FRONT_LEFT,
++    AV_CHAN_FRONT_RIGHT,
++    AV_CHAN_FRONT_CENTER,
++    AV_CHAN_LOW_FREQUENCY,
++    AV_CHAN_BACK_LEFT,
++    AV_CHAN_BACK_RIGHT,
++    AV_CHAN_FRONT_LEFT_OF_CENTER,
++    AV_CHAN_FRONT_RIGHT_OF_CENTER,
++    AV_CHAN_BACK_CENTER,
++    AV_CHAN_SIDE_LEFT,
++    AV_CHAN_SIDE_RIGHT,
++    AV_CHAN_TOP_CENTER,
++    AV_CHAN_TOP_FRONT_LEFT,
++    AV_CHAN_TOP_FRONT_CENTER,
++    AV_CHAN_TOP_FRONT_RIGHT,
++    AV_CHAN_TOP_BACK_LEFT,
++    AV_CHAN_TOP_BACK_CENTER,
++    AV_CHAN_TOP_BACK_RIGHT,
++    /** Stereo downmix. */
++    AV_CHAN_STEREO_LEFT = 29,
++    /** See above. */
++    AV_CHAN_STEREO_RIGHT,
++    AV_CHAN_WIDE_LEFT,
++    AV_CHAN_WIDE_RIGHT,
++    AV_CHAN_SURROUND_DIRECT_LEFT,
++    AV_CHAN_SURROUND_DIRECT_RIGHT,
++    AV_CHAN_LOW_FREQUENCY_2,
++    AV_CHAN_TOP_SIDE_LEFT,
++    AV_CHAN_TOP_SIDE_RIGHT,
++    AV_CHAN_BOTTOM_FRONT_CENTER,
++    AV_CHAN_BOTTOM_FRONT_LEFT,
++    AV_CHAN_BOTTOM_FRONT_RIGHT,
++    AV_CHAN_SIDE_SURROUND_LEFT,     ///<  +90 degrees, Lss, SiL
++    AV_CHAN_SIDE_SURROUND_RIGHT,    ///<  -90 degrees, Rss, SiR
++    AV_CHAN_TOP_SURROUND_LEFT,      ///< +110 degrees, Lvs, TpLS
++    AV_CHAN_TOP_SURROUND_RIGHT,     ///< -110 degrees, Rvs, TpRS
++
++    AV_CHAN_BINAURAL_LEFT = 61,
++    AV_CHAN_BINAURAL_RIGHT,
++
++    /** Channel is empty can be safely skipped. */
++    AV_CHAN_UNUSED = 0x200,
++
++    /** Channel contains data, but its position is unknown. */
++    AV_CHAN_UNKNOWN = 0x300,
++
++    /**
++     * Range of channels between AV_CHAN_AMBISONIC_BASE and
++     * AV_CHAN_AMBISONIC_END represent Ambisonic components using the ACN system.
++     *
++     * Given a channel id `<i>` between AV_CHAN_AMBISONIC_BASE and
++     * AV_CHAN_AMBISONIC_END (inclusive), the ACN index of the channel `<n>` is
++     * `<n> = <i> - AV_CHAN_AMBISONIC_BASE`.
++     *
++     * @note these values are only used for AV_CHANNEL_ORDER_CUSTOM channel
++     * orderings, the AV_CHANNEL_ORDER_AMBISONIC ordering orders the channels
++     * implicitly by their position in the stream.
++     */
++    AV_CHAN_AMBISONIC_BASE = 0x400,
++    // leave space for 1024 ids, which correspond to maximum order-32 harmonics,
++    // which should be enough for the foreseeable use cases
++    AV_CHAN_AMBISONIC_END  = 0x7ff,
++};
++
++enum AVChannelOrder {
++    /**
++     * Only the channel count is specified, without any further information
++     * about the channel order.
++     */
++    AV_CHANNEL_ORDER_UNSPEC,
++    /**
++     * The native channel order, i.e. the channels are in the same order in
++     * which they are defined in the AVChannel enum. This supports up to 63
++     * different channels.
++     */
++    AV_CHANNEL_ORDER_NATIVE,
++    /**
++     * The channel order does not correspond to any other predefined order and
++     * is stored as an explicit map. For example, this could be used to support
++     * layouts with 64 or more channels, or with empty/skipped (AV_CHAN_UNUSED)
++     * channels at arbitrary positions.
++     */
++    AV_CHANNEL_ORDER_CUSTOM,
++    /**
++     * The audio is represented as the decomposition of the sound field into
++     * spherical harmonics. Each channel corresponds to a single expansion
++     * component. Channels are ordered according to ACN (Ambisonic Channel
++     * Number).
++     *
++     * The channel with the index n in the stream contains the spherical
++     * harmonic of degree l and order m given by
++     * @code{.unparsed}
++     *   l   = floor(sqrt(n)),
++     *   m   = n - l * (l + 1).
++     * @endcode
++     *
++     * Conversely given a spherical harmonic of degree l and order m, the
++     * corresponding channel index n is given by
++     * @code{.unparsed}
++     *   n = l * (l + 1) + m.
++     * @endcode
++     *
++     * Normalization is assumed to be SN3D (Schmidt Semi-Normalization)
++     * as defined in AmbiX format $ 2.1.
++     */
++    AV_CHANNEL_ORDER_AMBISONIC,
++    /**
++     * Number of channel orders, not part of ABI/API
++     */
++    FF_CHANNEL_ORDER_NB
++};
++
++
++/**
++ * @defgroup channel_masks Audio channel masks
++ *
++ * A channel layout is a 64-bits integer with a bit set for every channel.
++ * The number of bits set must be equal to the number of channels.
++ * The value 0 means that the channel layout is not known.
++ * @note this data structure is not powerful enough to handle channels
++ * combinations that have the same channel multiple times, such as
++ * dual-mono.
++ *
++ * @{
++ */
++#define AV_CH_FRONT_LEFT             (1ULL << AV_CHAN_FRONT_LEFT           )
++#define AV_CH_FRONT_RIGHT            (1ULL << AV_CHAN_FRONT_RIGHT          )
++#define AV_CH_FRONT_CENTER           (1ULL << AV_CHAN_FRONT_CENTER         )
++#define AV_CH_LOW_FREQUENCY          (1ULL << AV_CHAN_LOW_FREQUENCY        )
++#define AV_CH_BACK_LEFT              (1ULL << AV_CHAN_BACK_LEFT            )
++#define AV_CH_BACK_RIGHT             (1ULL << AV_CHAN_BACK_RIGHT           )
++#define AV_CH_FRONT_LEFT_OF_CENTER   (1ULL << AV_CHAN_FRONT_LEFT_OF_CENTER )
++#define AV_CH_FRONT_RIGHT_OF_CENTER  (1ULL << AV_CHAN_FRONT_RIGHT_OF_CENTER)
++#define AV_CH_BACK_CENTER            (1ULL << AV_CHAN_BACK_CENTER          )
++#define AV_CH_SIDE_LEFT              (1ULL << AV_CHAN_SIDE_LEFT            )
++#define AV_CH_SIDE_RIGHT             (1ULL << AV_CHAN_SIDE_RIGHT           )
++#define AV_CH_TOP_CENTER             (1ULL << AV_CHAN_TOP_CENTER           )
++#define AV_CH_TOP_FRONT_LEFT         (1ULL << AV_CHAN_TOP_FRONT_LEFT       )
++#define AV_CH_TOP_FRONT_CENTER       (1ULL << AV_CHAN_TOP_FRONT_CENTER     )
++#define AV_CH_TOP_FRONT_RIGHT        (1ULL << AV_CHAN_TOP_FRONT_RIGHT      )
++#define AV_CH_TOP_BACK_LEFT          (1ULL << AV_CHAN_TOP_BACK_LEFT        )
++#define AV_CH_TOP_BACK_CENTER        (1ULL << AV_CHAN_TOP_BACK_CENTER      )
++#define AV_CH_TOP_BACK_RIGHT         (1ULL << AV_CHAN_TOP_BACK_RIGHT       )
++#define AV_CH_STEREO_LEFT            (1ULL << AV_CHAN_STEREO_LEFT          )
++#define AV_CH_STEREO_RIGHT           (1ULL << AV_CHAN_STEREO_RIGHT         )
++#define AV_CH_WIDE_LEFT              (1ULL << AV_CHAN_WIDE_LEFT            )
++#define AV_CH_WIDE_RIGHT             (1ULL << AV_CHAN_WIDE_RIGHT           )
++#define AV_CH_SURROUND_DIRECT_LEFT   (1ULL << AV_CHAN_SURROUND_DIRECT_LEFT )
++#define AV_CH_SURROUND_DIRECT_RIGHT  (1ULL << AV_CHAN_SURROUND_DIRECT_RIGHT)
++#define AV_CH_LOW_FREQUENCY_2        (1ULL << AV_CHAN_LOW_FREQUENCY_2      )
++#define AV_CH_TOP_SIDE_LEFT          (1ULL << AV_CHAN_TOP_SIDE_LEFT        )
++#define AV_CH_TOP_SIDE_RIGHT         (1ULL << AV_CHAN_TOP_SIDE_RIGHT       )
++#define AV_CH_BOTTOM_FRONT_CENTER    (1ULL << AV_CHAN_BOTTOM_FRONT_CENTER  )
++#define AV_CH_BOTTOM_FRONT_LEFT      (1ULL << AV_CHAN_BOTTOM_FRONT_LEFT    )
++#define AV_CH_BOTTOM_FRONT_RIGHT     (1ULL << AV_CHAN_BOTTOM_FRONT_RIGHT   )
++#define AV_CH_SIDE_SURROUND_LEFT     (1ULL << AV_CHAN_SIDE_SURROUND_LEFT   )
++#define AV_CH_SIDE_SURROUND_RIGHT    (1ULL << AV_CHAN_SIDE_SURROUND_RIGHT  )
++#define AV_CH_TOP_SURROUND_LEFT      (1ULL << AV_CHAN_TOP_SURROUND_LEFT    )
++#define AV_CH_TOP_SURROUND_RIGHT     (1ULL << AV_CHAN_TOP_SURROUND_RIGHT   )
++#define AV_CH_BINAURAL_LEFT          (1ULL << AV_CHAN_BINAURAL_LEFT        )
++#define AV_CH_BINAURAL_RIGHT         (1ULL << AV_CHAN_BINAURAL_RIGHT       )
++
++/**
++ * @}
++ * @defgroup channel_mask_c Audio channel layouts
++ * @{
++ * */
++#define AV_CH_LAYOUT_MONO              (AV_CH_FRONT_CENTER)
++#define AV_CH_LAYOUT_STEREO            (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)
++#define AV_CH_LAYOUT_2POINT1           (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY)
++#define AV_CH_LAYOUT_2_1               (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER)
++#define AV_CH_LAYOUT_SURROUND          (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER)
++#define AV_CH_LAYOUT_3POINT1           (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY)
++#define AV_CH_LAYOUT_4POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER)
++#define AV_CH_LAYOUT_4POINT1           (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY)
++#define AV_CH_LAYOUT_2_2               (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
++#define AV_CH_LAYOUT_QUAD              (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
++#define AV_CH_LAYOUT_5POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)
++#define AV_CH_LAYOUT_5POINT1           (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY)
++#define AV_CH_LAYOUT_5POINT0_BACK      (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
++#define AV_CH_LAYOUT_5POINT1_BACK      (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY)
++#define AV_CH_LAYOUT_6POINT0           (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER)
++#define AV_CH_LAYOUT_6POINT0_FRONT     (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
++#define AV_CH_LAYOUT_HEXAGONAL         (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER)
++#define AV_CH_LAYOUT_3POINT1POINT2     (AV_CH_LAYOUT_3POINT1|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)
++#define AV_CH_LAYOUT_6POINT1           (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER)
++#define AV_CH_LAYOUT_6POINT1_BACK      (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER)
++#define AV_CH_LAYOUT_6POINT1_FRONT     (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY)
++#define AV_CH_LAYOUT_7POINT0           (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
++#define AV_CH_LAYOUT_7POINT0_FRONT     (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
++#define AV_CH_LAYOUT_7POINT1           (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)
++#define AV_CH_LAYOUT_7POINT1_WIDE      (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
++#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
++#define AV_CH_LAYOUT_5POINT1POINT2     (AV_CH_LAYOUT_5POINT1|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)
++#define AV_CH_LAYOUT_5POINT1POINT2_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)
++#define AV_CH_LAYOUT_OCTAGONAL         (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT)
++#define AV_CH_LAYOUT_CUBE              (AV_CH_LAYOUT_QUAD|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT)
++#define AV_CH_LAYOUT_5POINT1POINT4_BACK (AV_CH_LAYOUT_5POINT1POINT2|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT)
++#define AV_CH_LAYOUT_7POINT1POINT2     (AV_CH_LAYOUT_7POINT1|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)
++#define AV_CH_LAYOUT_7POINT1POINT4_BACK (AV_CH_LAYOUT_7POINT1POINT2|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT)
++#define AV_CH_LAYOUT_7POINT2POINT3     (AV_CH_LAYOUT_7POINT1POINT2|AV_CH_TOP_BACK_CENTER|AV_CH_LOW_FREQUENCY_2)
++#define AV_CH_LAYOUT_9POINT1POINT4_BACK (AV_CH_LAYOUT_7POINT1POINT4_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)
++#define AV_CH_LAYOUT_9POINT1POINT6     (AV_CH_LAYOUT_9POINT1POINT4_BACK|AV_CH_TOP_SIDE_LEFT|AV_CH_TOP_SIDE_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_BINAURAL          (AV_CH_BINAURAL_LEFT|AV_CH_BINAURAL_RIGHT)
++#define AV_CH_LAYOUT_STEREO_DOWNMIX    (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)
++#define AV_CH_LAYOUT_22POINT2          (AV_CH_LAYOUT_9POINT1POINT6|AV_CH_BACK_CENTER|AV_CH_LOW_FREQUENCY_2|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_CENTER|AV_CH_TOP_BACK_CENTER|AV_CH_BOTTOM_FRONT_CENTER|AV_CH_BOTTOM_FRONT_LEFT|AV_CH_BOTTOM_FRONT_RIGHT)
++
++#define AV_CH_LAYOUT_7POINT1_TOP_BACK AV_CH_LAYOUT_5POINT1POINT2_BACK
++
++enum AVMatrixEncoding {
++    AV_MATRIX_ENCODING_NONE,
++    AV_MATRIX_ENCODING_DOLBY,
++    AV_MATRIX_ENCODING_DPLII,
++    AV_MATRIX_ENCODING_DPLIIX,
++    AV_MATRIX_ENCODING_DPLIIZ,
++    AV_MATRIX_ENCODING_DOLBYEX,
++    AV_MATRIX_ENCODING_DOLBYHEADPHONE,
++    AV_MATRIX_ENCODING_NB
++};
++
++/**
++ * @}
++ */
++
++/**
++ * An AVChannelCustom defines a single channel within a custom order layout
++ *
++ * Unlike most structures in FFmpeg, sizeof(AVChannelCustom) is a part of the
++ * public ABI.
++ *
++ * No new fields may be added to it without a major version bump.
++ */
++typedef struct AVChannelCustom {
++    enum AVChannel id;
++    char name[16];
++    void *opaque;
++} AVChannelCustom;
++
++/**
++ * An AVChannelLayout holds information about the channel layout of audio data.
++ *
++ * A channel layout here is defined as a set of channels ordered in a specific
++ * way (unless the channel order is AV_CHANNEL_ORDER_UNSPEC, in which case an
++ * AVChannelLayout carries only the channel count).
++ * All orders may be treated as if they were AV_CHANNEL_ORDER_UNSPEC by
++ * ignoring everything but the channel count, as long as av_channel_layout_check()
++ * considers they are valid.
++ *
++ * Unlike most structures in FFmpeg, sizeof(AVChannelLayout) is a part of the
++ * public ABI and may be used by the caller. E.g. it may be allocated on stack
++ * or embedded in caller-defined structs.
++ *
++ * AVChannelLayout can be initialized as follows:
++ * - default initialization with {0}, followed by setting all used fields
++ *   correctly;
++ * - by assigning one of the predefined AV_CHANNEL_LAYOUT_* initializers;
++ * - with a constructor function, such as av_channel_layout_default(),
++ *   av_channel_layout_from_mask() or av_channel_layout_from_string().
++ *
++ * The channel layout must be uninitialized 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. Otherwise it must be zeroed.
++         */
++        AVChannelCustom *map;
++    } u;
++
++    /**
++     * For some private data of the user.
++     */
++    void *opaque;
++} AVChannelLayout;
++
++/**
++ * Macro to define native channel layouts
++ *
++ * @note This doesn't use designated initializers for compatibility with C++ 17 and older.
++ */
++#define AV_CHANNEL_LAYOUT_MASK(nb, m) \
++    { /* .order */ AV_CHANNEL_ORDER_NATIVE, \
++      /* .nb_channels */  (nb), \
++      /* .u.mask */ { m }, \
++      /* .opaque */ NULL }
++
++/**
++ * @name Common pre-defined channel layouts
++ * @{
++ */
++#define AV_CHANNEL_LAYOUT_MONO              AV_CHANNEL_LAYOUT_MASK(1,  AV_CH_LAYOUT_MONO)
++#define AV_CHANNEL_LAYOUT_STEREO            AV_CHANNEL_LAYOUT_MASK(2,  AV_CH_LAYOUT_STEREO)
++#define AV_CHANNEL_LAYOUT_2POINT1           AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_2POINT1)
++#define AV_CHANNEL_LAYOUT_2_1               AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_2_1)
++#define AV_CHANNEL_LAYOUT_SURROUND          AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_SURROUND)
++#define AV_CHANNEL_LAYOUT_3POINT1           AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_3POINT1)
++#define AV_CHANNEL_LAYOUT_4POINT0           AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_4POINT0)
++#define AV_CHANNEL_LAYOUT_4POINT1           AV_CHANNEL_LAYOUT_MASK(5,  AV_CH_LAYOUT_4POINT1)
++#define AV_CHANNEL_LAYOUT_2_2               AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_2_2)
++#define AV_CHANNEL_LAYOUT_QUAD              AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_QUAD)
++#define AV_CHANNEL_LAYOUT_5POINT0           AV_CHANNEL_LAYOUT_MASK(5,  AV_CH_LAYOUT_5POINT0)
++#define AV_CHANNEL_LAYOUT_5POINT1           AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_5POINT1)
++#define AV_CHANNEL_LAYOUT_5POINT0_BACK      AV_CHANNEL_LAYOUT_MASK(5,  AV_CH_LAYOUT_5POINT0_BACK)
++#define AV_CHANNEL_LAYOUT_5POINT1_BACK      AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_5POINT1_BACK)
++#define AV_CHANNEL_LAYOUT_6POINT0           AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_6POINT0)
++#define AV_CHANNEL_LAYOUT_6POINT0_FRONT     AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_6POINT0_FRONT)
++#define AV_CHANNEL_LAYOUT_3POINT1POINT2     AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_3POINT1POINT2)
++#define AV_CHANNEL_LAYOUT_HEXAGONAL         AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_HEXAGONAL)
++#define AV_CHANNEL_LAYOUT_6POINT1           AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_6POINT1)
++#define AV_CHANNEL_LAYOUT_6POINT1_BACK      AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_6POINT1_BACK)
++#define AV_CHANNEL_LAYOUT_6POINT1_FRONT     AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_6POINT1_FRONT)
++#define AV_CHANNEL_LAYOUT_7POINT0           AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_7POINT0)
++#define AV_CHANNEL_LAYOUT_7POINT0_FRONT     AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_7POINT0_FRONT)
++#define AV_CHANNEL_LAYOUT_7POINT1           AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_7POINT1)
++#define AV_CHANNEL_LAYOUT_7POINT1_WIDE      AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_7POINT1_WIDE)
++#define AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_7POINT1_WIDE_BACK)
++#define AV_CHANNEL_LAYOUT_5POINT1POINT2     AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_5POINT1POINT2)
++#define AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_5POINT1POINT2_BACK)
++#define AV_CHANNEL_LAYOUT_OCTAGONAL         AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_OCTAGONAL)
++#define AV_CHANNEL_LAYOUT_CUBE              AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_CUBE)
++#define AV_CHANNEL_LAYOUT_5POINT1POINT4_BACK AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_5POINT1POINT4_BACK)
++#define AV_CHANNEL_LAYOUT_7POINT1POINT2     AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_7POINT1POINT2)
++#define AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT1POINT4_BACK)
++#define AV_CHANNEL_LAYOUT_7POINT2POINT3     AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT2POINT3)
++#define AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK AV_CHANNEL_LAYOUT_MASK(14, AV_CH_LAYOUT_9POINT1POINT4_BACK)
++#define AV_CHANNEL_LAYOUT_9POINT1POINT6     AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_9POINT1POINT6)
++#define AV_CHANNEL_LAYOUT_HEXADECAGONAL     AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_HEXADECAGONAL)
++#define AV_CHANNEL_LAYOUT_BINAURAL          AV_CHANNEL_LAYOUT_MASK(2,  AV_CH_LAYOUT_BINAURAL)
++#define AV_CHANNEL_LAYOUT_STEREO_DOWNMIX    AV_CHANNEL_LAYOUT_MASK(2,  AV_CH_LAYOUT_STEREO_DOWNMIX)
++#define AV_CHANNEL_LAYOUT_22POINT2          AV_CHANNEL_LAYOUT_MASK(24, AV_CH_LAYOUT_22POINT2)
++
++#define AV_CHANNEL_LAYOUT_7POINT1_TOP_BACK  AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK
++
++#define AV_CHANNEL_LAYOUT_AMBISONIC_FIRST_ORDER \
++    { /* .order */ AV_CHANNEL_ORDER_AMBISONIC, \
++      /* .nb_channels */ 4, \
++      /* .u.mask */ { 0 }, \
++      /* .opaque */ NULL }
++/** @} */
++
++struct AVBPrint;
++
++/**
++ * Get a human readable string in an abbreviated form describing a given channel.
++ * This is the inverse function of @ref av_channel_from_string().
++ *
++ * @param buf pre-allocated buffer where to put the generated string
++ * @param buf_size size in bytes of the buffer.
++ * @param channel the AVChannel whose name to get
++ * @return amount of bytes needed to hold the output string, or a negative AVERROR
++ *         on failure. If the returned value is bigger than buf_size, then the
++ *         string was truncated.
++ */
++int av_channel_name(char *buf, size_t buf_size, enum AVChannel channel);
++
++/**
++ * bprint variant of av_channel_name().
++ *
++ * @note the string will be appended to the bprint buffer.
++ */
++void av_channel_name_bprint(struct AVBPrint *bp, enum AVChannel channel_id);
++
++/**
++ * Get a human readable string describing a given channel.
++ *
++ * @param buf pre-allocated buffer where to put the generated string
++ * @param buf_size size in bytes of the buffer.
++ * @param channel the AVChannel whose description to get
++ * @return amount of bytes needed to hold the output string, or a negative AVERROR
++ *         on failure. If the returned value is bigger than buf_size, then the
++ *         string was truncated.
++ */
++int av_channel_description(char *buf, size_t buf_size, enum AVChannel channel);
++
++/**
++ * bprint variant of av_channel_description().
++ *
++ * @note the string will be appended to the bprint buffer.
++ */
++void av_channel_description_bprint(struct AVBPrint *bp, enum AVChannel channel_id);
++
++/**
++ * This is the inverse function of @ref av_channel_name().
++ *
++ * @return the channel with the given name
++ *         AV_CHAN_NONE when name does not identify a known channel
++ */
++enum AVChannel av_channel_from_string(const char *name);
++
++/**
++ * Initialize a custom channel layout with the specified number of channels.
++ * The channel map will be allocated and the designation of all channels will
++ * be set to AV_CHAN_UNKNOWN.
++ *
++ * This is only a convenience helper function, a custom channel layout can also
++ * be constructed without using this.
++ *
++ * @param channel_layout the layout structure to be initialized
++ * @param nb_channels the number of channels
++ *
++ * @return 0 on success
++ *         AVERROR(EINVAL) if the number of channels <= 0
++ *         AVERROR(ENOMEM) if the channel map could not be allocated
++ */
++int av_channel_layout_custom_init(AVChannelLayout *channel_layout, int nb_channels);
++
++/**
++ * Initialize a native channel layout from a bitmask indicating which channels
++ * are present.
++ *
++ * @param channel_layout the layout structure to be initialized
++ * @param mask bitmask describing the channel layout
++ *
++ * @return 0 on success
++ *         AVERROR(EINVAL) for invalid mask values
++ */
++int av_channel_layout_from_mask(AVChannelLayout *channel_layout, uint64_t mask);
++
++/**
++ * Initialize a channel layout from a given string description.
++ * The input string can be represented by:
++ *  - the formal channel layout name (returned by av_channel_layout_describe())
++ *  - single or multiple channel names (returned by av_channel_name(), eg. "FL",
++ *    or concatenated with "+", each optionally containing a custom name after
++ *    a "@", eg. "FL@Left+FR@Right+LFE")
++ *  - a decimal or hexadecimal value of a native channel layout (eg. "4" or "0x4")
++ *  - the number of channels with default layout (eg. "4c")
++ *  - the number of unordered channels (eg. "4C" or "4 channels")
++ *  - the ambisonic order followed by optional non-diegetic channels (eg.
++ *    "ambisonic 2+stereo")
++ * On error, the channel layout will remain uninitialized, but not necessarily
++ * untouched.
++ *
++ * @param channel_layout uninitialized channel layout for the result
++ * @param str string describing the channel layout
++ * @return 0 on success parsing the channel layout
++ *         AVERROR(EINVAL) if an invalid channel layout string was provided
++ *         AVERROR(ENOMEM) if there was not enough memory
++ */
++int av_channel_layout_from_string(AVChannelLayout *channel_layout,
++                                  const char *str);
++
++/**
++ * Get the default channel layout for a given number of channels.
++ *
++ * @param ch_layout the layout structure to be initialized
++ * @param nb_channels number of channels
++ */
++void av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels);
++
++/**
++ * Iterate over all standard channel layouts.
++ *
++ * @param opaque a pointer where libavutil will store the iteration state. Must
++ *               point to NULL to start the iteration.
++ *
++ * @return the standard channel layout or NULL when the iteration is
++ *         finished
++ */
++const AVChannelLayout *av_channel_layout_standard(void **opaque);
++
++/**
++ * Free any allocated data in the channel layout and reset the channel
++ * count to 0.
++ *
++ * @param channel_layout the layout structure to be uninitialized
++ */
++void av_channel_layout_uninit(AVChannelLayout *channel_layout);
++
++/**
++ * Make a copy of a channel layout. This differs from just assigning src to dst
++ * in that it allocates and copies the map for AV_CHANNEL_ORDER_CUSTOM.
++ *
++ * @note the destination channel_layout will be always uninitialized before copy.
++ *
++ * @param dst destination channel layout
++ * @param src source channel layout
++ * @return 0 on success, a negative AVERROR on error.
++ */
++int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src);
++
++/**
++ * Get a human-readable string describing the channel layout properties.
++ * The string will be in the same format that is accepted by
++ * @ref av_channel_layout_from_string(), allowing to rebuild the same
++ * channel layout, except for opaque pointers.
++ *
++ * @param channel_layout channel layout to be described
++ * @param buf pre-allocated buffer where to put the generated string
++ * @param buf_size size in bytes of the buffer.
++ * @return amount of bytes needed to hold the output string, or a negative AVERROR
++ *         on failure. If the returned value is bigger than buf_size, then the
++ *         string was truncated.
++ */
++int av_channel_layout_describe(const AVChannelLayout *channel_layout,
++                               char *buf, size_t buf_size);
++
++/**
++ * bprint variant of av_channel_layout_describe().
++ *
++ * @note the string will be appended to the bprint buffer.
++ * @return 0 on success, or a negative AVERROR value on failure.
++ */
++int av_channel_layout_describe_bprint(const AVChannelLayout *channel_layout,
++                                      struct AVBPrint *bp);
++
++/**
++ * Get the channel with the given index in a channel layout.
++ *
++ * @param channel_layout input channel layout
++ * @param idx index of the channel
++ * @return channel with the index idx in channel_layout on success or
++ *         AV_CHAN_NONE on failure (if idx is not valid or the channel order is
++ *         unspecified)
++ */
++enum AVChannel
++av_channel_layout_channel_from_index(const AVChannelLayout *channel_layout, unsigned int idx);
++
++/**
++ * Get the index of a given channel in a channel layout. In case multiple
++ * channels are found, only the first match will be returned.
++ *
++ * @param channel_layout input channel layout
++ * @param channel the channel whose index to obtain
++ * @return index of channel in channel_layout on success or a negative number if
++ *         channel is not present in channel_layout.
++ */
++int av_channel_layout_index_from_channel(const AVChannelLayout *channel_layout,
++                                         enum AVChannel channel);
++
++/**
++ * Get the index in a channel layout of a channel described by the given string.
++ * In case multiple channels are found, only the first match will be returned.
++ *
++ * This function accepts channel names in the same format as
++ * @ref av_channel_from_string().
++ *
++ * @param channel_layout input channel layout
++ * @param name string describing the channel whose index to obtain
++ * @return a channel index described by the given string, or a negative AVERROR
++ *         value.
++ */
++int av_channel_layout_index_from_string(const AVChannelLayout *channel_layout,
++                                        const char *name);
++
++/**
++ * Get a channel described by the given string.
++ *
++ * This function accepts channel names in the same format as
++ * @ref av_channel_from_string().
++ *
++ * @param channel_layout input channel layout
++ * @param name string describing the channel to obtain
++ * @return a channel described by the given string in channel_layout on success
++ *         or AV_CHAN_NONE on failure (if the string is not valid or the channel
++ *         order is unspecified)
++ */
++enum AVChannel
++av_channel_layout_channel_from_string(const AVChannelLayout *channel_layout,
++                                      const char *name);
++
++/**
++ * Find out what channels from a given set are present in a channel layout,
++ * without regard for their positions.
++ *
++ * @param channel_layout input channel layout
++ * @param mask a combination of AV_CH_* representing a set of channels
++ * @return a bitfield representing all the channels from mask that are present
++ *         in channel_layout
++ */
++uint64_t av_channel_layout_subset(const AVChannelLayout *channel_layout,
++                                  uint64_t mask);
++
++/**
++ * Check whether a channel layout is valid, i.e. can possibly describe audio
++ * data.
++ *
++ * @param channel_layout input channel layout
++ * @return 1 if channel_layout is valid, 0 otherwise.
++ */
++int av_channel_layout_check(const AVChannelLayout *channel_layout);
++
++/**
++ * Check whether two channel layouts are semantically the same, i.e. the same
++ * channels are present on the same positions in both.
++ *
++ * If one of the channel layouts is AV_CHANNEL_ORDER_UNSPEC, while the other is
++ * not, they are considered to be unequal. If both are AV_CHANNEL_ORDER_UNSPEC,
++ * they are considered equal iff the channel counts are the same in both.
++ *
++ * @param chl input channel layout
++ * @param chl1 input channel layout
++ * @return 0 if chl and chl1 are equal, 1 if they are not equal. A negative
++ *         AVERROR code if one or both are invalid.
++ */
++int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1);
++
++/**
++ * Return the order if the layout is n-th order standard-order ambisonic.
++ * The presence of optional extra non-diegetic channels at the end is not taken
++ * into account.
++ *
++ * @param channel_layout input channel layout
++ * @return the order of the layout, a negative error code otherwise.
++ */
++int av_channel_layout_ambisonic_order(const AVChannelLayout *channel_layout);
++
++/**
++ * The conversion must be lossless.
++ */
++#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS (1 << 0)
++
++/**
++ * The specified retype target order is ignored and the simplest possible
++ * (canonical) order is used for which the input layout can be losslessy
++ * represented.
++ */
++#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL (1 << 1)
++
++/**
++ * Change the AVChannelOrder of a channel layout.
++ *
++ * Change of AVChannelOrder can be either lossless or lossy. In case of a
++ * lossless conversion all the channel designations and the associated channel
++ * names (if any) are kept. On a lossy conversion the channel names and channel
++ * designations might be lost depending on the capabilities of the desired
++ * AVChannelOrder. Note that some conversions are simply not possible in which
++ * case this function returns AVERROR(ENOSYS).
++ *
++ * The following conversions are supported:
++ *
++ * Any       -> Custom     : Always possible, always lossless.
++ * Any       -> Unspecified: Always possible, lossless if channel designations
++ *   are all unknown and channel names are not used, lossy otherwise.
++ * Custom    -> Ambisonic  : Possible if it contains ambisonic channels with
++ *   optional non-diegetic channels in the end. Lossy if the channels have
++ *   custom names, lossless otherwise.
++ * Custom    -> Native     : Possible if it contains native channels in native
++ *     order. Lossy if the channels have custom names, lossless otherwise.
++ *
++ * On error this function keeps the original channel layout untouched.
++ *
++ * @param channel_layout channel layout which will be changed
++ * @param order the desired channel layout order
++ * @param flags a combination of AV_CHANNEL_LAYOUT_RETYPE_FLAG_* constants
++ * @return 0 if the conversion was successful and lossless or if the channel
++ *           layout was already in the desired order
++ *         >0 if the conversion was successful but lossy
++ *         AVERROR(ENOSYS) if the conversion was not possible (or would be
++ *           lossy and AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS was specified)
++ *         AVERROR(EINVAL), AVERROR(ENOMEM) on error
++ */
++int av_channel_layout_retype(AVChannelLayout *channel_layout, enum AVChannelOrder order, int flags);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_CHANNEL_LAYOUT_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/common.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/common.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/common.h.ffmpeg9	2026-09-07 12:23:47.676500014 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/common.h	2026-09-07 12:23:47.676398783 +0200
+@@ -0,0 +1,578 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++/**
++ * @file
++ * common internal and external API header
++ */
++
++#ifndef AVUTIL_COMMON_H
++#define AVUTIL_COMMON_H
++
++#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C)
++#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
++#endif
++
++#include <errno.h>
++#include <inttypes.h>
++#include <limits.h>
++#include <math.h>
++#include <stdint.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include "attributes.h"
++#include "error.h"
++#include "macros.h"
++#include "version.h"
++
++#ifdef HAVE_AV_CONFIG_H
++#   include "config.h"
++#   include "intmath.h"
++#   include "internal.h"
++#else
++#   include "mem.h"
++#endif /* HAVE_AV_CONFIG_H */
++
++//rounded division & shift
++#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
++/* assume b>0 */
++#define ROUNDED_DIV(a,b) (((a)>=0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
++/* Fast a/(1<<b) rounded toward +inf. Assume a>=0 and b>=0 */
++#define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \
++                                                       : ((a) + (1<<(b)) - 1) >> (b))
++/* Backwards compat. */
++#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT
++
++#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b))
++#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b))
++
++/**
++ * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they
++ * are not representable as absolute values of their type. This is the same
++ * as with *abs()
++ * @see FFNABS()
++ */
++#define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
++#define FFSIGN(a) ((a) > 0 ? 1 : -1)
++
++/**
++ * Negative Absolute value.
++ * this works for all integers of all types.
++ * As with many macros, this evaluates its argument twice, it thus must not have
++ * a sideeffect, that is FFNABS(x++) has undefined behavior.
++ */
++#define FFNABS(a) ((a) <= 0 ? (a) : (-(a)))
++
++/**
++ * Unsigned Absolute value.
++ * This takes the absolute value of a signed int and returns it as a unsigned.
++ * This also works with INT_MIN which would otherwise not be representable
++ * As with many macros, this evaluates its argument twice.
++ */
++#define FFABSU(a) ((a) <= 0 ? -(unsigned)(a) : (unsigned)(a))
++#define FFABS64U(a) ((a) <= 0 ? -(uint64_t)(a) : (uint64_t)(a))
++
++/* misc math functions */
++
++#ifndef av_ceil_log2
++#   define av_ceil_log2     av_ceil_log2_c
++#endif
++#ifndef av_clip
++#   define av_clip          av_clip_c
++#endif
++#ifndef av_clip64
++#   define av_clip64        av_clip64_c
++#endif
++#ifndef av_clip_uint8
++#   define av_clip_uint8    av_clip_uint8_c
++#endif
++#ifndef av_clip_int8
++#   define av_clip_int8     av_clip_int8_c
++#endif
++#ifndef av_clip_uint16
++#   define av_clip_uint16   av_clip_uint16_c
++#endif
++#ifndef av_clip_int16
++#   define av_clip_int16    av_clip_int16_c
++#endif
++#ifndef av_clipl_int32
++#   define av_clipl_int32   av_clipl_int32_c
++#endif
++#ifndef av_clip_intp2
++#   define av_clip_intp2    av_clip_intp2_c
++#endif
++#ifndef av_clip_uintp2
++#   define av_clip_uintp2   av_clip_uintp2_c
++#endif
++#ifndef av_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_zero_extend
++#   define av_zero_extend   av_zero_extend_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+UINT64_C(0x80000000)) & ~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 + (1U << p)) & ~((2U << 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 & ~((1U<<p) - 1)) return (~a) >> 31 & ((1U<<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. Must be between 0 and 31.
++ * @return clipped value
++ */
++static av_always_inline av_const unsigned av_zero_extend_c(unsigned a, unsigned p)
++{
++#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
++    if (p > 31) abort();
++#endif
++    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= (uint8_t)(GET_BYTE);\
++    {\
++        uint32_t top = (val & 128) >> 1;\
++        if ((val & 0xc0) == 0x80 || val >= 0xFE)\
++            {ERROR}\
++        while (val & top) {\
++            unsigned int tmp = (uint8_t)(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 = (uint16_t)(GET_16BIT);\
++    {\
++        unsigned int hi = val - 0xD800;\
++        if (hi < 0x800) {\
++            val = (uint16_t)(GET_16BIT) - 0xDC00;\
++            if (val > 0x3FFU || hi > 0x3FFU)\
++                {ERROR}\
++            val += (hi<<10) + 0x10000;\
++        }\
++    }\
++
++/**
++ * @def PUT_UTF8(val, tmp, PUT_BYTE)
++ * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
++ * @param val is an input-only argument and should be of type uint32_t. It holds
++ * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If
++ * val is given as a function it is executed only once.
++ * @param tmp is a temporary variable and should be of type uint8_t. It
++ * represents an intermediate value during conversion that is to be
++ * output by PUT_BYTE.
++ * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
++ * It could be a function or a statement, and uses tmp as the input byte.
++ * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
++ * executed up to 4 times for values in the valid UTF-8 range and up to
++ * 7 times in the general case, depending on the length of the converted
++ * Unicode character.
++ */
++#define PUT_UTF8(val, tmp, PUT_BYTE)\
++    {\
++        int bytes, shift;\
++        uint32_t in = val;\
++        if (in < 0x80) {\
++            tmp = in;\
++            PUT_BYTE\
++        } else {\
++            bytes = (av_log2(in) + 4) / 5;\
++            shift = (bytes - 1) * 6;\
++            tmp = (256 - (256 >> bytes)) | (in >> shift);\
++            PUT_BYTE\
++            while (shift >= 6) {\
++                shift -= 6;\
++                tmp = 0x80 | ((in >> shift) & 0x3f);\
++                PUT_BYTE\
++            }\
++        }\
++    }
++
++/**
++ * @def PUT_UTF16(val, tmp, PUT_16BIT)
++ * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
++ * @param val is an input-only argument and should be of type uint32_t. It holds
++ * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If
++ * val is given as a function it is executed only once.
++ * @param tmp is a temporary variable and should be of type uint16_t. It
++ * represents an intermediate value during conversion that is to be
++ * output by PUT_16BIT.
++ * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
++ * in desired endianness. It could be a function or a statement, and uses tmp
++ * as the input byte.  For example, PUT_BYTE could be "*output++ = tmp;"
++ * PUT_BYTE will be executed 1 or 2 times depending on input character.
++ */
++#define PUT_UTF16(val, tmp, PUT_16BIT)\
++    {\
++        uint32_t in = val;\
++        if (in < 0x10000) {\
++            tmp = in;\
++            PUT_16BIT\
++        } else {\
++            tmp = 0xD800 | ((in - 0x10000) >> 10);\
++            PUT_16BIT\
++            tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\
++            PUT_16BIT\
++        }\
++    }\
++
++#endif /* AVUTIL_COMMON_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/dict.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/dict.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/dict.h.ffmpeg9	2026-09-07 12:23:47.676610454 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/dict.h	2026-09-07 12:23:47.676552280 +0200
+@@ -0,0 +1,242 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General 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 */
++#define AV_DICT_DEDUP         128   /**< If inserting a value that already exists for a key, do nothing. Only relevant with AV_DICT_MULTIKEY. */
++/**
++ * @}
++ */
++
++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 containing 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 -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/error.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/error.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/error.h.ffmpeg9	2026-09-07 12:23:47.676704236 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/error.h	2026-09-07 12:23:47.676664988 +0200
+@@ -0,0 +1,129 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++/**
++ * @file
++ * error code definitions
++ */
++
++#ifndef AVUTIL_ERROR_H
++#define AVUTIL_ERROR_H
++
++#include <errno.h>
++#include <stddef.h>
++
++#include "macros.h"
++
++/**
++ * @addtogroup lavu_error
++ *
++ * @{
++ */
++
++
++/* error handling */
++#if EDOM > 0
++#define AVERROR(e) (-(e))   ///< Returns a negative error code from a POSIX error code, to return from library functions.
++#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value.
++#else
++/* Some platforms have E* and errno already negated. */
++#define AVERROR(e) (e)
++#define AVUNERROR(e) (e)
++#endif
++
++#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d))
++
++#define AVERROR_BSF_NOT_FOUND      FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found
++#define AVERROR_BUG                FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2
++#define AVERROR_BUFFER_TOO_SMALL   FFERRTAG( 'B','U','F','S') ///< Buffer too small
++#define AVERROR_DECODER_NOT_FOUND  FFERRTAG(0xF8,'D','E','C') ///< Decoder not found
++#define AVERROR_DEMUXER_NOT_FOUND  FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found
++#define AVERROR_ENCODER_NOT_FOUND  FFERRTAG(0xF8,'E','N','C') ///< Encoder not found
++#define AVERROR_EOF                FFERRTAG( 'E','O','F',' ') ///< End of file
++#define AVERROR_EXIT               FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted
++#define AVERROR_EXTERNAL           FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library
++#define AVERROR_FILTER_NOT_FOUND   FFERRTAG(0xF8,'F','I','L') ///< Filter not found
++#define AVERROR_INVALIDDATA        FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input
++#define AVERROR_MUXER_NOT_FOUND    FFERRTAG(0xF8,'M','U','X') ///< Muxer not found
++#define AVERROR_OPTION_NOT_FOUND   FFERRTAG(0xF8,'O','P','T') ///< Option not found
++#define AVERROR_PATCHWELCOME       FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome
++#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found
++
++#define AVERROR_STREAM_NOT_FOUND   FFERRTAG(0xF8,'S','T','R') ///< Stream not found
++/**
++ * This is semantically identical to AVERROR_BUG
++ * it has been introduced in Libav after our AVERROR_BUG and with a modified value.
++ */
++#define AVERROR_BUG2               FFERRTAG( 'B','U','G',' ')
++#define AVERROR_UNKNOWN            FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library
++#define AVERROR_EXPERIMENTAL       (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.
++#define AVERROR_INPUT_CHANGED      (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED)
++#define AVERROR_OUTPUT_CHANGED     (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED)
++/* HTTP & RTSP errors */
++#define AVERROR_HTTP_BAD_REQUEST   FFERRTAG(0xF8,'4','0','0')
++#define AVERROR_HTTP_UNAUTHORIZED  FFERRTAG(0xF8,'4','0','1')
++#define AVERROR_HTTP_FORBIDDEN     FFERRTAG(0xF8,'4','0','3')
++#define AVERROR_HTTP_NOT_FOUND     FFERRTAG(0xF8,'4','0','4')
++#define AVERROR_HTTP_TOO_MANY_REQUESTS FFERRTAG(0xF8,'4','2','9')
++#define AVERROR_HTTP_OTHER_4XX     FFERRTAG(0xF8,'4','X','X')
++#define AVERROR_HTTP_SERVER_ERROR  FFERRTAG(0xF8,'5','X','X')
++
++#define AV_ERROR_MAX_STRING_SIZE 64
++
++/**
++ * Put a description of the AVERROR code errnum in errbuf.
++ * In case of failure the global variable errno is set to indicate the
++ * error. Even in case of failure av_strerror() will print a generic
++ * error message indicating the errnum provided to errbuf.
++ *
++ * @param errnum      error code to describe
++ * @param errbuf      buffer to which description is written
++ * @param errbuf_size the size in bytes of errbuf
++ * @return 0 on success, a negative value if a description for errnum
++ * cannot be found
++ */
++int av_strerror(int errnum, char *errbuf, size_t errbuf_size);
++
++/**
++ * Fill the provided buffer with a string containing an error string
++ * corresponding to the AVERROR code errnum.
++ *
++ * @param errbuf         a buffer
++ * @param errbuf_size    size in bytes of errbuf
++ * @param errnum         error code to describe
++ * @return the buffer in input, filled with the error description
++ * @see av_strerror()
++ */
++static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum)
++{
++    av_strerror(errnum, errbuf, errbuf_size);
++    return errbuf;
++}
++
++/**
++ * Convenience macro, the return value should be used only directly in
++ * function arguments but never stand-alone.
++ */
++#define av_err2str(errnum) \
++    av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum)
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_ERROR_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/frame.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/frame.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/frame.h.ffmpeg9	2026-09-07 12:23:47.676982278 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/frame.h	2026-09-07 12:23:47.676756327 +0200
+@@ -0,0 +1,1215 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General 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,
++    /**
++     * Recommends skipping the specified number of samples. This is exported
++     * only if the "skip_manual" AVOption is set in libavcodec.
++     * This has the same format as AV_PKT_DATA_SKIP_SAMPLES.
++     * @code
++     * u32le number of samples to skip from start of this packet
++     * u32le number of samples to skip from end of this packet
++     * u8    reason for start skip
++     * u8    reason for end   skip (0=padding silence, 1=convergence)
++     * @endcode
++     */
++    AV_FRAME_DATA_SKIP_SAMPLES,
++    /**
++     * This side data must be associated with an audio frame and corresponds to
++     * enum AVAudioServiceType defined in avcodec.h.
++     */
++    AV_FRAME_DATA_AUDIO_SERVICE_TYPE,
++    /**
++     * Mastering display metadata associated with a video frame. The payload is
++     * an AVMasteringDisplayMetadata type and contains information about the
++     * mastering display color volume.
++     */
++    AV_FRAME_DATA_MASTERING_DISPLAY_METADATA,
++    /**
++     * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer.
++     * This is set on the first frame of a GOP that has a temporal reference of 0.
++     */
++    AV_FRAME_DATA_GOP_TIMECODE,
++
++    /**
++     * The data represents the AVSphericalMapping structure defined in
++     * libavutil/spherical.h.
++     */
++    AV_FRAME_DATA_SPHERICAL,
++
++    /**
++     * Content light level (based on CTA-861.3). This payload contains data in
++     * the form of the AVContentLightMetadata struct.
++     */
++    AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
++
++    /**
++     * The data contains an ICC profile as an opaque octet buffer following the
++     * format described by ISO 15076-1 with an optional name defined in the
++     * metadata key entry "name".
++     */
++    AV_FRAME_DATA_ICC_PROFILE,
++
++    /**
++     * Timecode which conforms to SMPTE ST 12-1. The data is an array of 4 uint32_t
++     * where the first uint32_t describes how many (1-3) of the other timecodes are used.
++     * The timecode format is described in the documentation of av_timecode_get_smpte_from_framenum()
++     * function in libavutil/timecode.h.
++     */
++    AV_FRAME_DATA_S12M_TIMECODE,
++
++    /**
++     * HDR dynamic metadata associated with a video frame. The payload is
++     * an AVDynamicHDRPlus type and contains information for color
++     * volume transform - application 4 of SMPTE 2094-40:2016 standard.
++     */
++    AV_FRAME_DATA_DYNAMIC_HDR_PLUS,
++
++    /**
++     * Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of
++     * array element is implied by AVFrameSideData.size / AVRegionOfInterest.self_size.
++     */
++    AV_FRAME_DATA_REGIONS_OF_INTEREST,
++
++    /**
++     * Encoding parameters for a video frame, as described by AVVideoEncParams.
++     */
++    AV_FRAME_DATA_VIDEO_ENC_PARAMS,
++
++    /**
++     * User data unregistered metadata associated with a video frame.
++     * This is the H.26[45] UDU SEI message, and shouldn't be used for any other purpose
++     * The data is stored as uint8_t in AVFrameSideData.data which is 16 bytes of
++     * uuid_iso_iec_11578 followed by AVFrameSideData.size - 16 bytes of user_data_payload_byte.
++     */
++    AV_FRAME_DATA_SEI_UNREGISTERED,
++
++    /**
++     * Film grain parameters for a frame, described by AVFilmGrainParams.
++     * Must be present for every frame which should have film grain applied.
++     *
++     * May be present multiple times, for example when there are multiple
++     * alternative parameter sets for different video signal characteristics.
++     * The user should select the most appropriate set for the application.
++     */
++    AV_FRAME_DATA_FILM_GRAIN_PARAMS,
++
++    /**
++     * Bounding boxes for object detection and classification,
++     * as described by AVDetectionBBoxHeader.
++     */
++    AV_FRAME_DATA_DETECTION_BBOXES,
++
++    /**
++     * Dolby Vision RPU raw data, suitable for passing to x265
++     * or other libraries. Array of uint8_t, with NAL emulation
++     * bytes intact.
++     */
++    AV_FRAME_DATA_DOVI_RPU_BUFFER,
++
++    /**
++     * Parsed Dolby Vision metadata, suitable for passing to a software
++     * implementation. The payload is the AVDOVIMetadata struct defined in
++     * libavutil/dovi_meta.h.
++     */
++    AV_FRAME_DATA_DOVI_METADATA,
++
++    /**
++     * HDR Vivid dynamic metadata associated with a video frame. The payload is
++     * an AVDynamicHDRVivid type and contains information for color
++     * volume transform - CUVA 005.1-2021.
++     */
++    AV_FRAME_DATA_DYNAMIC_HDR_VIVID,
++
++    /**
++     * Ambient viewing environment metadata, as defined by H.274.
++     */
++    AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT,
++
++    /**
++     * Provide encoder-specific hinting information about changed/unchanged
++     * portions of a frame.  It can be used to pass information about which
++     * macroblocks can be skipped because they didn't change from the
++     * corresponding ones in the previous frame. This could be useful for
++     * applications which know this information in advance to speed up
++     * encoding.
++     */
++    AV_FRAME_DATA_VIDEO_HINT,
++
++    /**
++     * Raw LCEVC payload data, as a uint8_t array, with NAL emulation
++     * bytes intact.
++     */
++    AV_FRAME_DATA_LCEVC,
++
++    /**
++     * This side data must be associated with a video frame.
++     * The presence of this side data indicates that the video stream is
++     * composed of multiple views (e.g. stereoscopic 3D content,
++     * cf. H.264 Annex H or H.265 Annex G).
++     * The data is an int storing the view ID.
++     */
++    AV_FRAME_DATA_VIEW_ID,
++
++    /**
++     * This side data contains information about the reference display width(s)
++     * and reference viewing distance(s) as well as information about the
++     * corresponding reference stereo pair(s), i.e., the pair(s) of views to be
++     * displayed for the viewer's left and right eyes on the reference display
++     * at the reference viewing distance.
++     * The payload is the AV3DReferenceDisplaysInfo struct defined in
++     * libavutil/tdrdi.h.
++     */
++    AV_FRAME_DATA_3D_REFERENCE_DISPLAYS,
++
++    /**
++     * Exchangeable image file format metadata. The payload is a buffer containing
++     * EXIF metadata, starting with either 49 49 2a 00, or 4d 4d 00 2a. These four
++     * bytes signify the endianness, and occur as the first part of the TIFF header.
++     */
++    AV_FRAME_DATA_EXIF,
++
++    /**
++     * HDR dynamic metadata associated with a video frame. The payload is
++     * an AVDynamicHDRSmpte2094App5 type and contains information for color
++     * volume transform as specified in the SMPTE 2094-50 standard.
++     */
++    AV_FRAME_DATA_DYNAMIC_HDR_SMPTE_2094_APP5,
++
++    /**
++     * IAMF Mix Gain Parameter Data associated with the audio frame. This metadata
++     * is in the form of the AVIAMFParamDefinition struct and contains information
++     * defined in sections 3.6.1 and 3.8.1 of the Immersive Audio Model and
++     * Formats standard.
++     */
++    AV_FRAME_DATA_IAMF_MIX_GAIN_PARAM,
++
++    /**
++    * IAMF Demixing Info Parameter Data associated with the audio frame. This
++    * metadata is in the form of the AVIAMFParamDefinition struct and contains
++    * information defined in sections 3.6.1 and 3.8.2 of the Immersive Audio Model
++    * and Formats standard.
++    */
++    AV_FRAME_DATA_IAMF_DEMIXING_INFO_PARAM,
++
++    /**
++    * IAMF Recon Gain Info Parameter Data associated with the audio frame. This
++    * metadata is in the form of the AVIAMFParamDefinition struct and contains
++    * information defined in sections 3.6.1 and 3.8.3 of the Immersive Audio Model
++    * and Formats standard.
++    */
++    AV_FRAME_DATA_IAMF_RECON_GAIN_INFO_PARAM,
++
++    /**
++     * Color information from a RAW camera codecs, needed to correctly process
++     * the video data. The payload is an AVRawColorParams struct defined in
++     * libavutil/raw_color_params.h.
++     */
++    AV_FRAME_DATA_RAW_COLOR_PARAMS,
++};
++
++enum AVActiveFormatDescription {
++    AV_AFD_SAME         = 8,
++    AV_AFD_4_3          = 9,
++    AV_AFD_16_9         = 10,
++    AV_AFD_14_9         = 11,
++    AV_AFD_4_3_SP_14_9  = 13,
++    AV_AFD_16_9_SP_14_9 = 14,
++    AV_AFD_SP_4_3       = 15,
++};
++
++
++/**
++ * Structure to hold side data for an AVFrame.
++ *
++ * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added
++ * to the end with a minor bump.
++ */
++typedef struct AVFrameSideData {
++    enum AVFrameSideDataType type;
++    uint8_t *data;
++    size_t   size;
++    AVDictionary *metadata;
++    AVBufferRef *buf;
++} AVFrameSideData;
++
++enum AVSideDataProps {
++    /**
++     * The side data type can be used in stream-global structures.
++     * Side data types without this property are only meaningful on per-frame
++     * basis.
++     */
++    AV_SIDE_DATA_PROP_GLOBAL = (1 << 0),
++
++    /**
++     * Multiple instances of this side data type can be meaningfully present in
++     * a single side data array.
++     */
++    AV_SIDE_DATA_PROP_MULTI  = (1 << 1),
++
++    /**
++     * Side data depends on the video dimensions. Side data with this property
++     * loses its meaning when rescaling or cropping the image, unless
++     * either recomputed or adjusted to the new resolution.
++     */
++    AV_SIDE_DATA_PROP_SIZE_DEPENDENT = (1 << 2),
++
++    /**
++     * Side data depends on the video color space. Side data with this property
++     * loses its meaning when changing the video color encoding, e.g. by
++     * adapting to a different set of primaries or transfer characteristics.
++     */
++    AV_SIDE_DATA_PROP_COLOR_DEPENDENT = (1 << 3),
++
++    /**
++     * Side data depends on the channel layout. Side data with this property
++     * loses its meaning when downmixing or upmixing, unless either recomputed
++     * or adjusted to the new layout.
++     */
++    AV_SIDE_DATA_PROP_CHANNEL_DEPENDENT = (1 << 4),
++};
++
++/**
++ * This struct describes the properties of a side data type. Its instance
++ * corresponding to a given type can be obtained from av_frame_side_data_desc().
++ */
++typedef struct AVSideDataDescriptor {
++    /**
++     * Human-readable side data description.
++     */
++    const char      *name;
++
++    /**
++     * Side data property flags, a combination of AVSideDataProps values.
++     */
++    unsigned         props;
++} AVSideDataDescriptor;
++
++/**
++ * Structure describing a single Region Of Interest.
++ *
++ * When multiple regions are defined in a single side-data block, they
++ * should be ordered from most to least important - some encoders are only
++ * capable of supporting a limited number of distinct regions, so will have
++ * to truncate the list.
++ *
++ * When overlapping regions are defined, the first region containing a given
++ * area of the frame applies.
++ */
++typedef struct AVRegionOfInterest {
++    /**
++     * Must be set to the size of this data structure (that is,
++     * sizeof(AVRegionOfInterest)).
++     */
++    uint32_t self_size;
++    /**
++     * Distance in pixels from the top edge of the frame to the top and
++     * bottom edges and from the left edge of the frame to the left and
++     * right edges of the rectangle defining this region of interest.
++     *
++     * The constraints on a region are encoder dependent, so the region
++     * actually affected may be slightly larger for alignment or other
++     * reasons.
++     */
++    int top;
++    int bottom;
++    int left;
++    int right;
++    /**
++     * Quantisation offset.
++     *
++     * Must be in the range -1 to +1.  A value of zero indicates no quality
++     * change.  A negative value asks for better quality (less quantisation),
++     * while a positive value asks for worse quality (greater quantisation).
++     *
++     * The range is calibrated so that the extreme values indicate the
++     * largest possible offset - if the rest of the frame is encoded with the
++     * worst possible quality, an offset of -1 indicates that this region
++     * should be encoded with the best possible quality anyway.  Intermediate
++     * values are then interpolated in some codec-dependent way.
++     *
++     * For example, in 10-bit H.264 the quantisation parameter varies between
++     * -12 and 51.  A typical qoffset value of -1/10 therefore indicates that
++     * this region should be encoded with a QP around one-tenth of the full
++     * range better than the rest of the frame.  So, if most of the frame
++     * were to be encoded with a QP of around 30, this region would get a QP
++     * of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3).
++     * An extreme value of -1 would indicate that this region should be
++     * encoded with the best possible quality regardless of the treatment of
++     * the rest of the frame - that is, should be encoded at a QP of -12.
++     */
++    AVRational qoffset;
++} AVRegionOfInterest;
++
++/**
++ * This structure describes decoded (raw) audio or video data.
++ *
++ * AVFrame must be allocated using av_frame_alloc(). Note that this only
++ * allocates the AVFrame itself, the buffers for the data must be managed
++ * through other means (see below).
++ * AVFrame must be freed with av_frame_free().
++ *
++ * AVFrame is typically allocated once and then reused multiple times to hold
++ * different data (e.g. a single AVFrame to hold frames received from a
++ * decoder). In such a case, av_frame_unref() will free any references held by
++ * the frame and reset it to its original clean state before it
++ * is reused again.
++ *
++ * The data described by an AVFrame is usually reference counted through the
++ * AVBuffer API. The underlying buffer references are stored in AVFrame.buf /
++ * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at
++ * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case,
++ * every single data plane must be contained in one of the buffers in
++ * AVFrame.buf or AVFrame.extended_buf.
++ * There may be a single buffer for all the data, or one separate buffer for
++ * each plane, or anything in between.
++ *
++ * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added
++ * to the end with a minor bump.
++ *
++ * Fields can be accessed through AVOptions, the name string used, matches the
++ * C structure field name for fields accessible through AVOptions.
++ */
++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;
++
++    /**
++     * Picture type of the frame.
++     */
++    enum AVPictureType pict_type;
++
++    /**
++     * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
++     */
++    AVRational sample_aspect_ratio;
++
++    /**
++     * Presentation timestamp in time_base units (time when frame should be shown to user).
++     */
++    int64_t pts;
++
++    /**
++     * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used)
++     * This is also the Presentation time of this AVFrame calculated from
++     * only AVPacket.dts values without pts values.
++     */
++    int64_t pkt_dts;
++
++    /**
++     * Time base for the timestamps in this frame.
++     * In the future, this field may be set on frames output by decoders or
++     * filters, but its value will be by default ignored on input to encoders
++     * or filters.
++     */
++    AVRational time_base;
++
++    /**
++     * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
++     */
++    int quality;
++
++    /**
++     * Frame owner's private data.
++     *
++     * This field may be set by the code that allocates/owns the frame data.
++     * It is then not touched by any library functions, except:
++     * - it is copied to other references by av_frame_copy_props() (and hence by
++     *   av_frame_ref());
++     * - it is set to NULL when the frame is cleared by av_frame_unref()
++     * - on the caller's explicit request. E.g. libavcodec encoders/decoders
++     *   will copy this field to/from @ref AVPacket "AVPackets" if the caller sets
++     *   @ref AV_CODEC_FLAG_COPY_OPAQUE.
++     *
++     * @see opaque_ref the reference-counted analogue
++     */
++    void *opaque;
++
++    /**
++     * Number of fields in this frame which should be repeated, i.e. the total
++     * duration of this frame should be repeat_pict + 2 normal field durations.
++     *
++     * For interlaced frames this field may be set to 1, which signals that this
++     * frame should be presented as 3 fields: beginning with the first field (as
++     * determined by AV_FRAME_FLAG_TOP_FIELD_FIRST being set or not), followed
++     * by the second field, and then the first field again.
++     *
++     * For progressive frames this field may be set to a multiple of 2, which
++     * signals that this frame's duration should be (repeat_pict + 2) / 2
++     * normal frame durations.
++     *
++     * @note This field is computed from MPEG2 repeat_first_field flag and its
++     * associated flags, H.264 pic_struct from picture timing SEI, and
++     * their analogues in other codecs. Typically it should only be used when
++     * higher-layer timing information is not available.
++     */
++    int repeat_pict;
++
++    /**
++     * Sample rate of the audio data.
++     */
++    int sample_rate;
++
++    /**
++     * AVBuffer references backing the data for this frame. All the pointers in
++     * data and extended_data must point inside one of the buffers in buf or
++     * extended_buf. This array must be filled contiguously -- if buf[i] is
++     * non-NULL then buf[j] must also be non-NULL for all j < i.
++     *
++     * There may be at most one AVBuffer per data plane, so for video this array
++     * always contains all the references. For planar audio with more than
++     * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in
++     * this array. Then the extra AVBufferRef pointers are stored in the
++     * extended_buf array.
++     */
++    AVBufferRef *buf[AV_NUM_DATA_POINTERS];
++
++    /**
++     * For planar audio which requires more than AV_NUM_DATA_POINTERS
++     * AVBufferRef pointers, this array will hold all the references which
++     * cannot fit into AVFrame.buf.
++     *
++     * Note that this is different from AVFrame.extended_data, which always
++     * contains all the pointers. This array only contains the extra pointers,
++     * which cannot fit into AVFrame.buf.
++     *
++     * This array is always allocated using av_malloc() by whoever constructs
++     * the frame. It is freed in av_frame_unref().
++     */
++    AVBufferRef **extended_buf;
++    /**
++     * Number of elements in extended_buf.
++     */
++    int        nb_extended_buf;
++
++    AVFrameSideData **side_data;
++    int            nb_side_data;
++
++/**
++ * @defgroup lavu_frame_flags AV_FRAME_FLAGS
++ * @ingroup lavu_frame
++ * Flags describing additional frame properties.
++ *
++ * @{
++ */
++
++/**
++ * The frame data may be corrupted, e.g. due to decoding errors.
++ */
++#define AV_FRAME_FLAG_CORRUPT       (1 << 0)
++/**
++ * A flag to mark frames that are keyframes.
++ */
++#define AV_FRAME_FLAG_KEY (1 << 1)
++/**
++ * A flag to mark the frames which need to be decoded, but shouldn't be output.
++ */
++#define AV_FRAME_FLAG_DISCARD   (1 << 2)
++/**
++ * A flag to mark frames whose content is interlaced.
++ */
++#define AV_FRAME_FLAG_INTERLACED (1 << 3)
++/**
++ * A flag to mark frames where the top field is displayed first if the content
++ * is interlaced.
++ */
++#define AV_FRAME_FLAG_TOP_FIELD_FIRST (1 << 4)
++/**
++ * A decoder can use this flag to mark frames which were originally encoded losslessly.
++ *
++ * For coding bitstream formats which support both lossless and lossy
++ * encoding, it is sometimes possible for a decoder to determine which method
++ * was used when the bitstream was encoded.
++ */
++#define AV_FRAME_FLAG_LOSSLESS        (1 << 5)
++/**
++ * @}
++ */
++
++    /**
++     * 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;
++
++    /**
++     * 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
++
++    /**
++     * For hwaccel-format frames, this should be a reference to the
++     * AVHWFramesContext describing the frame.
++     */
++    AVBufferRef *hw_frames_ctx;
++
++    /**
++     * Frame owner's private data.
++     *
++     * This field may be set by the code that allocates/owns the frame data.
++     * It is then not touched by any library functions, except:
++     * - a new reference to the underlying buffer is propagated by
++     *   av_frame_copy_props() (and hence by av_frame_ref());
++     * - it is unreferenced in av_frame_unref();
++     * - on the caller's explicit request. E.g. libavcodec encoders/decoders
++     *   will propagate a new reference to/from @ref AVPacket "AVPackets" if the
++     *   caller sets @ref AV_CODEC_FLAG_COPY_OPAQUE.
++     *
++     * @see opaque the plain pointer analogue
++     */
++    AVBufferRef *opaque_ref;
++
++    /**
++     * @anchor cropping
++     * @name Cropping
++     * Video frames only. The number of pixels to discard from the
++     * 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;
++    /**
++     * @}
++     */
++
++    /**
++     * RefStruct reference 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 must never check or change private_ref.
++     */
++    void *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;
++
++    /**
++     * Indicates how the alpha channel of the video is to be handled.
++     * - encoding: Set by user
++     * - decoding: Set by libavcodec
++     */
++    enum AVAlphaMode alpha_mode;
++} AVFrame;
++
++
++/**
++ * Allocate an AVFrame and set its fields to default values.  The resulting
++ * struct must be freed using av_frame_free().
++ *
++ * @return An AVFrame filled with default values or NULL on failure.
++ *
++ * @note this only allocates the AVFrame itself, not the data buffers. Those
++ * must be allocated through other means, e.g. with av_frame_get_buffer() or
++ * manually.
++ */
++AVFrame *av_frame_alloc(void);
++
++/**
++ * Free the frame and any dynamically allocated objects in it,
++ * e.g. extended_data. If the frame is reference counted, it will be
++ * unreferenced first.
++ *
++ * @param frame frame to be freed. The pointer will be set to NULL.
++ */
++void av_frame_free(AVFrame **frame);
++
++/**
++ * Set up a new reference to the data described by the source frame.
++ *
++ * Copy frame properties from src to dst and create a new reference for each
++ * AVBufferRef from src.
++ *
++ * If src is not reference counted, new buffers are allocated and the data is
++ * copied.
++ *
++ * @warning: dst MUST have been either unreferenced with av_frame_unref(dst),
++ *           or newly allocated with av_frame_alloc() before calling this
++ *           function, or undefined behavior will occur.
++ *
++ * @return 0 on success, a negative AVERROR on error
++ */
++int av_frame_ref(AVFrame *dst, const AVFrame *src);
++
++/**
++ * Ensure the destination frame refers to the same data described by the source
++ * frame, either by creating a new reference for each AVBufferRef from src if
++ * they differ from those in dst, by allocating new buffers and copying data if
++ * src is not reference counted, or by unreferencing it if src is empty.
++ *
++ * Frame properties on dst will be replaced by those from src.
++ *
++ * @return 0 on success, a negative AVERROR on error. On error, dst is
++ *         unreferenced.
++ */
++int av_frame_replace(AVFrame *dst, const AVFrame *src);
++
++/**
++ * Create a new frame that references the same data as src.
++ *
++ * This is a shortcut for av_frame_alloc()+av_frame_ref().
++ *
++ * @return newly created AVFrame on success, NULL on error.
++ */
++AVFrame *av_frame_clone(const AVFrame *src);
++
++/**
++ * Unreference all the buffers referenced by frame and reset the frame fields.
++ */
++void av_frame_unref(AVFrame *frame);
++
++/**
++ * Move everything contained in src to dst and reset src.
++ *
++ * @warning: dst is not unreferenced, but directly overwritten without reading
++ *           or deallocating its contents. Call av_frame_unref(dst) manually
++ *           before calling this function to ensure that no memory is leaked.
++ */
++void av_frame_move_ref(AVFrame *dst, AVFrame *src);
++
++/**
++ * Allocate new buffer(s) for audio or video data.
++ *
++ * The following fields must be set on frame before calling this function:
++ * - format (pixel format for video, sample format for audio)
++ * - width and height for video
++ * - nb_samples and ch_layout for audio
++ *
++ * This function will fill AVFrame.data and AVFrame.buf arrays and, if
++ * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf.
++ * For planar formats, one buffer will be allocated for each plane.
++ *
++ * @warning: if frame already has been allocated, calling this function will
++ *           leak memory. In addition, undefined behavior can occur in certain
++ *           cases.
++ *
++ * @param frame frame in which to store the new buffers.
++ * @param align Required buffer size and data pointer alignment. If equal to 0,
++ *              alignment will be chosen automatically for the current CPU.
++ *              It is highly recommended to pass 0 here unless you know what
++ *              you are doing.
++ *
++ * @return 0 on success, a negative AVERROR on error.
++ */
++int av_frame_get_buffer(AVFrame *frame, int align);
++
++/**
++ * Check if the frame data is writable.
++ *
++ * @return A positive value if the frame data is writable (which is true if and
++ * only if each of the underlying buffers has only one reference, namely the one
++ * stored in this frame). Return 0 otherwise.
++ *
++ * If 1 is returned the answer is valid until av_buffer_ref() is called on any
++ * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly).
++ *
++ * @see av_frame_make_writable(), av_buffer_is_writable()
++ */
++int av_frame_is_writable(AVFrame *frame);
++
++/**
++ * Ensure that the frame data is writable, avoiding data copy if possible.
++ *
++ * Do nothing if the frame is writable, allocate new buffers and copy the data
++ * if it is not. Non-refcounted frames behave as non-writable, i.e. a copy
++ * is always made.
++ *
++ * @return 0 on success, a negative AVERROR on error.
++ *
++ * @see av_frame_is_writable(), av_buffer_is_writable(),
++ * av_buffer_make_writable()
++ */
++int av_frame_make_writable(AVFrame *frame);
++
++/**
++ * Copy the frame data from src to dst.
++ *
++ * This function does not allocate anything, dst must be already initialized and
++ * allocated with the same parameters as src.
++ *
++ * This function only copies the frame data (i.e. the contents of the data /
++ * extended data arrays), not any other properties.
++ *
++ * @return >= 0 on success, a negative AVERROR on error.
++ */
++int av_frame_copy(AVFrame *dst, const AVFrame *src);
++
++/**
++ * Copy only "metadata" fields from src to dst.
++ *
++ * Metadata for the purpose of this function are those fields that do not affect
++ * the data layout in the buffers.  E.g. pts, sample rate (for audio) or sample
++ * aspect ratio (for video), but not width/height or channel layout.
++ * Side data is also copied.
++ */
++int av_frame_copy_props(AVFrame *dst, const AVFrame *src);
++
++/**
++ * Get the buffer reference a given data plane is stored in.
++ *
++ * @param frame the frame to get the plane's buffer from
++ * @param plane index of the data plane of interest in frame->extended_data.
++ *
++ * @return the buffer reference that contains the plane or NULL if the input
++ * frame is not valid.
++ */
++AVBufferRef *av_frame_get_plane_buffer(const AVFrame *frame, int plane);
++
++/**
++ * Add a new side data to a frame.
++ *
++ * @param frame a frame to which the side data should be added
++ * @param type type of the added side data
++ * @param size size of the side data
++ *
++ * @return newly added side data on success, NULL on error
++ */
++AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
++                                        enum AVFrameSideDataType type,
++                                        size_t size);
++
++/**
++ * Add a new side data to a frame from an existing AVBufferRef
++ *
++ * @param frame a frame to which the side data should be added
++ * @param type  the type of the added side data
++ * @param buf   an AVBufferRef to add as side data. The ownership of
++ *              the reference is transferred to the frame.
++ *
++ * @return newly added side data on success, NULL on error. On failure
++ *         the frame is unchanged and the AVBufferRef remains owned by
++ *         the caller.
++ */
++AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
++                                                 enum AVFrameSideDataType type,
++                                                 AVBufferRef *buf);
++
++/**
++ * @return a pointer to the side data of a given type on success, NULL if there
++ * is no side data with such type in this frame.
++ */
++AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
++                                        enum AVFrameSideDataType type);
++
++/**
++ * Remove and free all side data instances of the given type.
++ */
++void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type);
++
++
++/**
++ * Flags for frame cropping.
++ */
++enum {
++    /**
++     * Apply the maximum possible cropping, even if it requires setting the
++     * AVFrame.data[] entries to unaligned pointers. Passing unaligned data
++     * to FFmpeg API is generally not allowed, and causes undefined behavior
++     * (such as crashes). You can pass unaligned data only to FFmpeg APIs that
++     * are explicitly documented to accept it. Use this flag only if you
++     * absolutely know what you are doing.
++     */
++    AV_FRAME_CROP_UNALIGNED     = 1 << 0,
++};
++
++/**
++ * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/
++ * crop_bottom fields. If cropping is successful, the function will adjust the
++ * data pointers and the width/height fields, and set the crop fields to 0.
++ *
++ * In all cases, the cropping boundaries will be rounded to the inherent
++ * alignment of the pixel format. In some cases, such as for opaque hwaccel
++ * formats, the left/top cropping is ignored. The crop fields are set to 0 even
++ * if the cropping was rounded or ignored.
++ *
++ * @param frame the frame which should be cropped
++ * @param flags Some combination of AV_FRAME_CROP_* flags, or 0.
++ *
++ * @return >= 0 on success, a negative AVERROR on error. If the cropping fields
++ * were invalid, AVERROR(ERANGE) is returned, and nothing is changed.
++ */
++int av_frame_apply_cropping(AVFrame *frame, int flags);
++
++/**
++ * @return a string identifying the side data type
++ */
++const char *av_frame_side_data_name(enum AVFrameSideDataType type);
++
++/**
++ * @return side data descriptor corresponding to a given side data type, NULL
++ *         when not available.
++ */
++const AVSideDataDescriptor *av_frame_side_data_desc(enum AVFrameSideDataType type);
++
++/**
++ * Free all side data entries and their contents, then zeroes out the
++ * values which the pointers are pointing to.
++ *
++ * @param sd    pointer to array of side data to free. Will be set to NULL
++ *              upon return.
++ * @param nb_sd pointer to an integer containing the number of entries in
++ *              the array. Will be set to 0 upon return.
++ */
++void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd);
++
++/**
++ * Remove existing entries before adding new ones.
++ */
++#define AV_FRAME_SIDE_DATA_FLAG_UNIQUE (1 << 0)
++/**
++ * Don't add a new entry if another of the same type exists.
++ * Applies only for side data types without the AV_SIDE_DATA_PROP_MULTI prop.
++ */
++#define AV_FRAME_SIDE_DATA_FLAG_REPLACE (1 << 1)
++/**
++ * Create a new reference to the passed in buffer instead of taking ownership
++ * of it.
++ */
++#define AV_FRAME_SIDE_DATA_FLAG_NEW_REF (1 << 2)
++
++/**
++ * Add new side data entry to an array.
++ *
++ * @param sd    pointer to array of side data to which to add another entry,
++ *              or to NULL in order to start a new array.
++ * @param nb_sd pointer to an integer containing the number of entries in
++ *              the array.
++ * @param type  type of the added side data
++ * @param size  size of the side data
++ * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.
++ *
++ * @return newly added side data on success, NULL on error.
++ * @note In case of AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of
++ *       matching AVFrameSideDataType will be removed before the addition
++ *       is attempted.
++ * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an
++ *       entry of the same type already exists, it will be replaced instead.
++ */
++AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
++                                        enum AVFrameSideDataType type,
++                                        size_t size, unsigned int flags);
++
++/**
++ * Add a new side data entry to an array from an existing AVBufferRef.
++ *
++ * @param sd    pointer to array of side data to which to add another entry,
++ *              or to NULL in order to start a new array.
++ * @param nb_sd pointer to an integer containing the number of entries in
++ *              the array.
++ * @param type  type of the added side data
++ * @param buf   Pointer to AVBufferRef to add to the array. On success,
++ *              the function takes ownership of the AVBufferRef and *buf is
++ *              set to NULL, unless AV_FRAME_SIDE_DATA_FLAG_NEW_REF is set
++ *              in which case the ownership will remain with the caller.
++ * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.
++ *
++ * @return newly added side data on success, NULL on error.
++ * @note In case of AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of
++ *       matching AVFrameSideDataType will be removed before the addition
++ *       is attempted.
++ * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an
++ *       entry of the same type already exists, it will be replaced instead.
++ *
++ */
++AVFrameSideData *av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd,
++                                        enum AVFrameSideDataType type,
++                                        AVBufferRef **buf, unsigned int flags);
++
++/**
++ * Add a new side data entry to an array based on existing side data, taking
++ * a reference towards the contained AVBufferRef.
++ *
++ * @param sd    pointer to array of side data to which to add another entry,
++ *              or to NULL in order to start a new array.
++ * @param nb_sd pointer to an integer containing the number of entries in
++ *              the array.
++ * @param src   side data to be cloned, with a new reference utilized
++ *              for the buffer.
++ * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.
++ *
++ * @return negative error code on failure, >=0 on success.
++ * @note In case of AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of
++ *       matching AVFrameSideDataType will be removed before the addition
++ *       is attempted.
++ * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an
++ *       entry of the same type already exists, it will be replaced instead.
++ */
++int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd,
++                             const AVFrameSideData *src, unsigned int flags);
++
++/**
++ * Get a side data entry of a specific type from an array.
++ *
++ * @param sd    array of side data.
++ * @param nb_sd integer containing the number of entries in the array.
++ * @param type  type of side data to be queried
++ *
++ * @return a pointer to the side data of a given type on success, NULL if there
++ *         is no side data with such type in this set.
++ */
++const AVFrameSideData *av_frame_side_data_get_c(const AVFrameSideData * const *sd,
++                                                const int nb_sd,
++                                                enum AVFrameSideDataType type);
++
++/**
++ * Wrapper around av_frame_side_data_get_c() to workaround the limitation
++ * that for any type T the conversion from T * const * to const T * const *
++ * is not performed automatically in C.
++ * @see av_frame_side_data_get_c()
++ */
++static inline
++const AVFrameSideData *av_frame_side_data_get(AVFrameSideData * const *sd,
++                                              const int nb_sd,
++                                              enum AVFrameSideDataType type)
++{
++    return av_frame_side_data_get_c((const AVFrameSideData * const *)sd,
++                                    nb_sd, type);
++}
++
++/**
++ * Remove and free all side data instances of the given type from an array.
++ */
++void av_frame_side_data_remove(AVFrameSideData ***sd, int *nb_sd,
++                               enum AVFrameSideDataType type);
++
++/**
++ * Remove and free all side data instances that match any of the given
++ * side data properties. (See enum AVSideDataProps)
++ */
++void av_frame_side_data_remove_by_props(AVFrameSideData ***sd, int *nb_sd,
++                                        int props);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_FRAME_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/hwcontext.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/hwcontext.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/hwcontext.h.ffmpeg9	2026-09-07 12:23:47.677159456 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/hwcontext.h	2026-09-07 12:23:47.677034915 +0200
+@@ -0,0 +1,601 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVUTIL_HWCONTEXT_H
++#define AVUTIL_HWCONTEXT_H
++
++#include "buffer.h"
++#include "frame.h"
++#include "log.h"
++#include "pixfmt.h"
++
++enum AVHWDeviceType {
++    AV_HWDEVICE_TYPE_NONE,
++    AV_HWDEVICE_TYPE_VDPAU,
++    AV_HWDEVICE_TYPE_CUDA,
++    AV_HWDEVICE_TYPE_VAAPI,
++    AV_HWDEVICE_TYPE_DXVA2,
++    AV_HWDEVICE_TYPE_QSV,
++    AV_HWDEVICE_TYPE_VIDEOTOOLBOX,
++    AV_HWDEVICE_TYPE_D3D11VA,
++    AV_HWDEVICE_TYPE_DRM,
++    AV_HWDEVICE_TYPE_OPENCL,
++    AV_HWDEVICE_TYPE_MEDIACODEC,
++    AV_HWDEVICE_TYPE_VULKAN,
++    AV_HWDEVICE_TYPE_D3D12VA,
++    AV_HWDEVICE_TYPE_AMF,
++    /* OpenHarmony Codec device */
++    AV_HWDEVICE_TYPE_OHCODEC,
++};
++
++/**
++ * This struct aggregates all the (hardware/vendor-specific) "high-level" state,
++ * i.e. state that is not tied to a concrete processing configuration.
++ * E.g., in an API that supports hardware-accelerated encoding and decoding,
++ * this struct will (if possible) wrap the state that is common to both encoding
++ * and decoding and from which specific instances of encoders or decoders can be
++ * derived.
++ *
++ * This struct is reference-counted with the AVBuffer mechanism. The
++ * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field
++ * points to the actual AVHWDeviceContext. Further objects derived from
++ * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with
++ * specific properties) will hold an internal reference to it. After all the
++ * references are released, the AVHWDeviceContext itself will be freed,
++ * optionally invoking a user-specified callback for uninitializing the hardware
++ * state.
++ */
++typedef struct AVHWDeviceContext {
++    /**
++     * A class for logging. Set by av_hwdevice_ctx_alloc().
++     */
++    const AVClass *av_class;
++
++    /**
++     * This field identifies the underlying API used for hardware access.
++     *
++     * This field is set when this struct is allocated and never changed
++     * afterwards.
++     */
++    enum AVHWDeviceType type;
++
++    /**
++     * The format-specific data, allocated and freed by libavutil along with
++     * this context.
++     *
++     * Should be cast by the user to the format-specific context defined in the
++     * corresponding header (hwcontext_*.h) and filled as described in the
++     * documentation before calling av_hwdevice_ctx_init().
++     *
++     * After calling av_hwdevice_ctx_init() this struct should not be modified
++     * by the caller.
++     */
++    void *hwctx;
++
++    /**
++     * This field may be set by the caller before calling av_hwdevice_ctx_init().
++     *
++     * If non-NULL, this callback will be called when the last reference to
++     * this context is unreferenced, immediately before it is freed.
++     *
++     * @note when other objects (e.g an AVHWFramesContext) are derived from this
++     *       struct, this callback will be invoked after all such child objects
++     *       are fully uninitialized and their respective destructors invoked.
++     */
++    void (*free)(struct AVHWDeviceContext *ctx);
++
++    /**
++     * Arbitrary user data, to be used e.g. by the free() callback.
++     */
++    void *user_opaque;
++} AVHWDeviceContext;
++
++/**
++ * This struct describes a set or pool of "hardware" frames (i.e. those with
++ * data not located in normal system memory). All the frames in the pool are
++ * assumed to be allocated in the same way and interchangeable.
++ *
++ * This struct is reference-counted with the AVBuffer mechanism and tied to a
++ * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor
++ * yields a reference, whose data field points to the actual AVHWFramesContext
++ * struct.
++ */
++typedef struct AVHWFramesContext {
++    /**
++     * A class for logging.
++     */
++    const AVClass *av_class;
++
++    /**
++     * A reference to the parent AVHWDeviceContext. This reference is owned and
++     * managed by the enclosing AVHWFramesContext, but the caller may derive
++     * additional references from it.
++     */
++    AVBufferRef *device_ref;
++
++    /**
++     * The parent AVHWDeviceContext. This is simply a pointer to
++     * device_ref->data provided for convenience.
++     *
++     * Set by libavutil in av_hwframe_ctx_init().
++     */
++    AVHWDeviceContext *device_ctx;
++
++    /**
++     * The format-specific data, allocated and freed automatically along with
++     * this context.
++     *
++     * The user shall ignore this field if the corresponding format-specific
++     * header (hwcontext_*.h) does not define a context to be used as
++     * AVHWFramesContext.hwctx.
++     *
++     * Otherwise, it should be cast by the user to said context and filled
++     * as described in the documentation before calling av_hwframe_ctx_init().
++     *
++     * After any frames using this context are created, the contents of this
++     * struct should not be modified by the caller.
++     */
++    void *hwctx;
++
++    /**
++     * This field may be set by the caller before calling av_hwframe_ctx_init().
++     *
++     * If non-NULL, this callback will be called when the last reference to
++     * this context is unreferenced, immediately before it is freed.
++     */
++    void (*free)(struct AVHWFramesContext *ctx);
++
++    /**
++     * Arbitrary user data, to be used e.g. by the free() callback.
++     */
++    void *user_opaque;
++
++    /**
++     * A pool from which the frames are allocated by av_hwframe_get_buffer().
++     * This field may be set by the caller before calling av_hwframe_ctx_init().
++     * The buffers returned by calling av_buffer_pool_get() on this pool must
++     * have the properties described in the documentation in the corresponding hw
++     * type's header (hwcontext_*.h). The pool will be freed strictly before
++     * this struct's free() callback is invoked.
++     *
++     * This field may be NULL, then libavutil will attempt to allocate a pool
++     * internally. Note that certain device types enforce pools allocated at
++     * fixed size (frame count), which cannot be extended dynamically. In such a
++     * case, initial_pool_size must be set appropriately.
++     */
++    AVBufferPool *pool;
++
++    /**
++     * Initial size of the frame pool. If a device type does not support
++     * dynamically resizing the pool, then this is also the maximum pool size.
++     *
++     * May be set by the caller before calling av_hwframe_ctx_init(). Must be
++     * set if pool is NULL and the device type does not support dynamic pools.
++     */
++    int initial_pool_size;
++
++    /**
++     * The pixel format identifying the underlying HW surface type.
++     *
++     * Must be a hwaccel format, i.e. the corresponding descriptor must have the
++     * AV_PIX_FMT_FLAG_HWACCEL flag set.
++     *
++     * Must be set by the user before calling av_hwframe_ctx_init().
++     */
++    enum AVPixelFormat format;
++
++    /**
++     * The pixel format identifying the actual data layout of the hardware
++     * frames.
++     *
++     * Must be set by the caller before calling av_hwframe_ctx_init().
++     *
++     * @note when the underlying API does not provide the exact data layout, but
++     * only the colorspace/bit depth, this field should be set to the fully
++     * planar version of that format (e.g. for 8-bit 420 YUV it should be
++     * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else).
++     */
++    enum AVPixelFormat sw_format;
++
++    /**
++     * The allocated dimensions of the frames in this pool.
++     *
++     * Must be set by the user before calling av_hwframe_ctx_init().
++     */
++    int width, height;
++} AVHWFramesContext;
++
++/**
++ * Look up an AVHWDeviceType by name.
++ *
++ * @param name String name of the device type (case-insensitive).
++ * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if
++ *         not found.
++ */
++enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name);
++
++/** Get the string name of an AVHWDeviceType.
++ *
++ * @param type Type from enum AVHWDeviceType.
++ * @return Pointer to a static string containing the name, or NULL if the type
++ *         is not valid.
++ */
++const char *av_hwdevice_get_type_name(enum AVHWDeviceType type);
++
++/**
++ * Iterate over supported device types.
++ *
++ * @param prev AV_HWDEVICE_TYPE_NONE initially, then the previous type
++ *             returned by this function in subsequent iterations.
++ * @return The next usable device type from enum AVHWDeviceType, or
++ *         AV_HWDEVICE_TYPE_NONE if there are no more.
++ */
++enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev);
++
++/**
++ * Allocate an AVHWDeviceContext for a given hardware type.
++ *
++ * @param type the type of the hardware device to allocate.
++ * @return a reference to the newly created AVHWDeviceContext on success or NULL
++ *         on failure.
++ */
++AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type);
++
++/**
++ * Finalize the device context before use. This function must be called after
++ * the context is filled with all the required information and before it is
++ * used in any way.
++ *
++ * @param ref a reference to the AVHWDeviceContext
++ * @return 0 on success, a negative AVERROR code on failure
++ */
++int av_hwdevice_ctx_init(AVBufferRef *ref);
++
++/**
++ * Open a device of the specified type and create an AVHWDeviceContext for it.
++ *
++ * This is a convenience function intended to cover the simple cases. Callers
++ * who need to fine-tune device creation/management should open the device
++ * manually and then wrap it in an AVHWDeviceContext using
++ * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init().
++ *
++ * The returned context is already initialized and ready for use, the caller
++ * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of
++ * the created AVHWDeviceContext are set by this function and should not be
++ * touched by the caller.
++ *
++ * @param device_ctx On success, a reference to the newly-created device context
++ *                   will be written here. The reference is owned by the caller
++ *                   and must be released with av_buffer_unref() when no longer
++ *                   needed. On failure, NULL will be written to this pointer.
++ * @param type The type of the device to create.
++ * @param device A type-specific string identifying the device to open.
++ * @param opts A dictionary of additional (type-specific) options to use in
++ *             opening the device. The dictionary remains owned by the caller.
++ * @param flags currently unused
++ *
++ * @return 0 on success, a negative AVERROR code on failure.
++ */
++int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type,
++                           const char *device, AVDictionary *opts, int flags);
++
++/**
++ * Create a new device of the specified type from an existing device.
++ *
++ * If the source device is a device of the target type or was originally
++ * derived from such a device (possibly through one or more intermediate
++ * devices of other types), then this will return a reference to the
++ * existing device of the same type as is requested.
++ *
++ * Otherwise, it will attempt to derive a new device from the given source
++ * device.  If direct derivation to the new type is not implemented, it will
++ * attempt the same derivation from each ancestor of the source device in
++ * turn looking for an implemented derivation method.
++ *
++ * @param dst_ctx On success, a reference to the newly-created
++ *                AVHWDeviceContext.
++ * @param type    The type of the new device to create.
++ * @param src_ctx A reference to an existing AVHWDeviceContext which will be
++ *                used to create the new device.
++ * @param flags   Currently unused; should be set to zero.
++ * @return        Zero on success, a negative AVERROR code on failure.
++ */
++int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx,
++                                   enum AVHWDeviceType type,
++                                   AVBufferRef *src_ctx, int flags);
++
++/**
++ * Create a new device of the specified type from an existing device.
++ *
++ * This function performs the same action as av_hwdevice_ctx_create_derived,
++ * however, it is able to set options for the new device to be derived.
++ *
++ * @param dst_ctx On success, a reference to the newly-created
++ *                AVHWDeviceContext.
++ * @param type    The type of the new device to create.
++ * @param src_ctx A reference to an existing AVHWDeviceContext which will be
++ *                used to create the new device.
++ * @param options Options for the new device to create, same format as in
++ *                av_hwdevice_ctx_create.
++ * @param flags   Currently unused; should be set to zero.
++ * @return        Zero on success, a negative AVERROR code on failure.
++ */
++int av_hwdevice_ctx_create_derived_opts(AVBufferRef **dst_ctx,
++                                        enum AVHWDeviceType type,
++                                        AVBufferRef *src_ctx,
++                                        AVDictionary *options, int flags);
++
++/**
++ * Allocate an AVHWFramesContext tied to a given device context.
++ *
++ * @param device_ctx a reference to a AVHWDeviceContext. This function will make
++ *                   a new reference for internal use, the one passed to the
++ *                   function remains owned by the caller.
++ * @return a reference to the newly created AVHWFramesContext on success or NULL
++ *         on failure.
++ */
++AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx);
++
++/**
++ * Finalize the context before use. This function must be called after the
++ * context is filled with all the required information and before it is attached
++ * to any frames.
++ *
++ * @param ref a reference to the AVHWFramesContext
++ * @return 0 on success, a negative AVERROR code on failure
++ */
++int av_hwframe_ctx_init(AVBufferRef *ref);
++
++/**
++ * Allocate a new frame attached to the given AVHWFramesContext.
++ *
++ * @param hwframe_ctx a reference to an AVHWFramesContext
++ * @param frame an empty (freshly allocated or unreffed) frame to be filled with
++ *              newly allocated buffers.
++ * @param flags currently unused, should be set to zero
++ * @return 0 on success, a negative AVERROR code on failure
++ */
++int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags);
++
++/**
++ * Copy data to or from a hw surface. At least one of dst/src must have an
++ * AVHWFramesContext attached.
++ *
++ * If src has an AVHWFramesContext attached, then the format of dst (if set)
++ * must use one of the formats returned by av_hwframe_transfer_get_formats(src,
++ * AV_HWFRAME_TRANSFER_DIRECTION_FROM).
++ * If dst has an AVHWFramesContext attached, then the format of src must use one
++ * of the formats returned by av_hwframe_transfer_get_formats(dst,
++ * AV_HWFRAME_TRANSFER_DIRECTION_TO)
++ *
++ * dst may be "clean" (i.e. with data/buf pointers unset), in which case the
++ * data buffers will be allocated by this function using av_frame_get_buffer().
++ * If dst->format is set, then this format will be used, otherwise (when
++ * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen.
++ *
++ * The two frames must have matching allocated dimensions (i.e. equal to
++ * AVHWFramesContext.width/height), since not all device types support
++ * transferring a sub-rectangle of the whole surface. The display dimensions
++ * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but
++ * also have to be equal for both frames. When the display dimensions are
++ * smaller than the allocated dimensions, the content of the padding in the
++ * destination frame is unspecified.
++ *
++ * @param dst the destination frame. dst is not touched on failure.
++ * @param src the source frame.
++ * @param flags currently unused, should be set to zero
++ * @return 0 on success, a negative AVERROR error code on failure.
++ */
++int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags);
++
++enum AVHWFrameTransferDirection {
++    /**
++     * Transfer the data from the queried hw frame.
++     */
++    AV_HWFRAME_TRANSFER_DIRECTION_FROM,
++
++    /**
++     * Transfer the data to the queried hw frame.
++     */
++    AV_HWFRAME_TRANSFER_DIRECTION_TO,
++};
++
++/**
++ * Get a list of possible source or target formats usable in
++ * av_hwframe_transfer_data().
++ *
++ * @param hwframe_ctx the frame context to obtain the information for
++ * @param dir the direction of the transfer
++ * @param formats the pointer to the output format list will be written here.
++ *                The list is terminated with AV_PIX_FMT_NONE and must be freed
++ *                by the caller when no longer needed using av_free().
++ *                If this function returns successfully, the format list will
++ *                have at least one item (not counting the terminator).
++ *                On failure, the contents of this pointer are unspecified.
++ * @param flags currently unused, should be set to zero
++ * @return 0 on success, a negative AVERROR code on failure.
++ */
++int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx,
++                                    enum AVHWFrameTransferDirection dir,
++                                    enum AVPixelFormat **formats, int flags);
++
++
++/**
++ * This struct describes the constraints on hardware frames attached to
++ * a given device with a hardware-specific configuration.  This is returned
++ * by av_hwdevice_get_hwframe_constraints() and must be freed by
++ * av_hwframe_constraints_free() after use.
++ */
++typedef struct AVHWFramesConstraints {
++    /**
++     * A list of possible values for format in the hw_frames_ctx,
++     * terminated by AV_PIX_FMT_NONE.  This member will always be filled.
++     */
++    enum AVPixelFormat *valid_hw_formats;
++
++    /**
++     * A list of possible values for sw_format in the hw_frames_ctx,
++     * terminated by AV_PIX_FMT_NONE.  Can be NULL if this information is
++     * not known.
++     */
++    enum AVPixelFormat *valid_sw_formats;
++
++    /**
++     * The minimum size of frames in this hw_frames_ctx.
++     * (Zero if not known.)
++     */
++    int min_width;
++    int min_height;
++
++    /**
++     * The maximum size of frames in this hw_frames_ctx.
++     * (INT_MAX if not known / no limit.)
++     */
++    int max_width;
++    int max_height;
++} AVHWFramesConstraints;
++
++/**
++ * Allocate a HW-specific configuration structure for a given HW device.
++ * After use, the user must free all members as required by the specific
++ * hardware structure being used, then free the structure itself with
++ * av_free().
++ *
++ * @param device_ctx a reference to the associated AVHWDeviceContext.
++ * @return The newly created HW-specific configuration structure on
++ *         success or NULL on failure.
++ */
++void *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx);
++
++/**
++ * Get the constraints on HW frames given a device and the HW-specific
++ * configuration to be used with that device.  If no HW-specific
++ * configuration is provided, returns the maximum possible capabilities
++ * of the device.
++ *
++ * @param ref a reference to the associated AVHWDeviceContext.
++ * @param hwconfig a filled HW-specific configuration structure, or NULL
++ *        to return the maximum possible capabilities of the device.
++ * @return AVHWFramesConstraints structure describing the constraints
++ *         on the device, or NULL if not available.
++ */
++AVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref,
++                                                           const void *hwconfig);
++
++/**
++ * Free an AVHWFrameConstraints structure.
++ *
++ * @param constraints The (filled or unfilled) AVHWFrameConstraints structure.
++ */
++void av_hwframe_constraints_free(AVHWFramesConstraints **constraints);
++
++
++/**
++ * Flags to apply to frame mappings.
++ */
++enum {
++    /**
++     * The mapping must be readable.
++     */
++    AV_HWFRAME_MAP_READ      = 1 << 0,
++    /**
++     * The mapping must be writeable.
++     */
++    AV_HWFRAME_MAP_WRITE     = 1 << 1,
++    /**
++     * The mapped frame will be overwritten completely in subsequent
++     * operations, so the current frame data need not be loaded.  Any values
++     * which are not overwritten are unspecified.
++     */
++    AV_HWFRAME_MAP_OVERWRITE = 1 << 2,
++    /**
++     * The mapping must be direct.  That is, there must not be any copying in
++     * the map or unmap steps.  Note that performance of direct mappings may
++     * be much lower than normal memory.
++     */
++    AV_HWFRAME_MAP_DIRECT    = 1 << 3,
++};
++
++/**
++ * Map a hardware frame.
++ *
++ * This has a number of different possible effects, depending on the format
++ * and origin of the src and dst frames.  On input, src should be a usable
++ * frame with valid buffers and dst should be blank (typically as just created
++ * by av_frame_alloc()).  src should have an associated hwframe context, and
++ * dst may optionally have a format and associated hwframe context.
++ *
++ * If src was created by mapping a frame from the hwframe context of dst,
++ * then this function undoes the mapping - dst is replaced by a reference to
++ * the frame that src was originally mapped from.
++ *
++ * If both src and dst have an associated hwframe context, then this function
++ * attempts to map the src frame from its hardware context to that of dst and
++ * then fill dst with appropriate data to be usable there.  This will only be
++ * possible if the hwframe contexts and associated devices are compatible -
++ * given compatible devices, av_hwframe_ctx_create_derived() can be used to
++ * create a hwframe context for dst in which mapping should be possible.
++ *
++ * If src has a hwframe context but dst does not, then the src frame is
++ * mapped to normal memory and should thereafter be usable as a normal frame.
++ * If the format is set on dst, then the mapping will attempt to create dst
++ * with that format and fail if it is not possible.  If format is unset (is
++ * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate
++ * format to use is (probably the sw_format of the src hwframe context).
++ *
++ * A return value of AVERROR(ENOSYS) indicates that the mapping is not
++ * possible with the given arguments and hwframe setup, while other return
++ * values indicate that it failed somehow.
++ *
++ * On failure, the destination frame will be left blank, except for the
++ * hw_frames_ctx/format fields they 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 -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/imgutils.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/imgutils.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/imgutils.h.ffmpeg9	2026-09-07 12:23:47.677310216 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/imgutils.h	2026-09-07 12:23:47.677215554 +0200
+@@ -0,0 +1,377 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General 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_IMGUTILS_H
++#define AVUTIL_IMGUTILS_H
++
++/**
++ * @file
++ * misc image utilities
++ *
++ * @addtogroup lavu_picture
++ * @{
++ */
++
++#include <stddef.h>
++#include <stdint.h>
++#include "pixdesc.h"
++#include "pixfmt.h"
++#include "rational.h"
++
++/**
++ * Compute the max pixel step for each plane of an image with a
++ * format described by pixdesc.
++ *
++ * The pixel step is the distance in bytes between the first byte of
++ * the group of bytes which describe a pixel component and the first
++ * byte of the successive group in the same plane for the same
++ * component.
++ *
++ * @param max_pixsteps an array which is filled with the max pixel step
++ * for each plane. Since a plane may contain different pixel
++ * components, the computed max_pixsteps[plane] is relative to the
++ * component in the plane with the max pixel step.
++ * @param max_pixstep_comps an array which is filled with the component
++ * for each plane which has the max pixel step. May be NULL.
++ * @param pixdesc the AVPixFmtDescriptor for the image, describing its format
++ */
++void av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4],
++                                const AVPixFmtDescriptor *pixdesc);
++
++/**
++ * Compute the size of an image line with format pix_fmt and width
++ * width for the plane plane.
++ *
++ * @return the computed size in bytes
++ */
++int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane);
++
++/**
++ * Fill plane linesizes for an image with pixel format pix_fmt and
++ * width width.
++ *
++ * @param linesizes array to be filled with the linesize for each plane
++ * @param pix_fmt the AVPixelFormat of the image
++ * @param width width of the image in pixels
++ * @return >= 0 in case of success, a negative error code otherwise
++ */
++int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width);
++
++/**
++ * Fill plane sizes for an image with pixel format pix_fmt and height height.
++ *
++ * @param size the array to be filled with the size of each image plane
++ * @param pix_fmt the AVPixelFormat of the image
++ * @param height height of the image in pixels
++ * @param linesizes the array containing the linesize for each
++ *        plane, should be filled by av_image_fill_linesizes()
++ * @return >= 0 in case of success, a negative error code otherwise
++ *
++ * @note The linesize parameters have the type ptrdiff_t here, while they are
++ *       int for av_image_fill_linesizes().
++ */
++int av_image_fill_plane_sizes(size_t size[4], enum AVPixelFormat pix_fmt,
++                              int height, const ptrdiff_t linesizes[4]);
++
++/**
++ * Fill plane data pointers for an image with pixel format pix_fmt and
++ * height height.
++ *
++ * @param data pointers array to be filled with the pointer for each image plane
++ * @param pix_fmt the AVPixelFormat of the image
++ * @param height height of the image in pixels
++ * @param ptr the pointer to a buffer which will contain the image
++ * @param linesizes the array containing the linesize for each
++ * plane, should be filled by av_image_fill_linesizes()
++ * @return the size in bytes required for the image buffer, a negative
++ * error code in case of failure
++ */
++int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height,
++                           uint8_t *ptr, const int linesizes[4]);
++
++/**
++ * Allocate an image with size w and h and pixel format pix_fmt, and
++ * fill pointers and linesizes accordingly.
++ * The allocated image buffer has to be freed by using
++ * av_freep(&pointers[0]).
++ *
++ * @param pointers array to be filled with the pointer for each image plane
++ * @param linesizes the array filled with the linesize for each plane
++ * @param w width of the image in pixels
++ * @param h height of the image in pixels
++ * @param pix_fmt the AVPixelFormat of the image
++ * @param align the value to use for buffer size alignment
++ * @return the size in bytes required for the image buffer, a negative
++ * error code in case of failure
++ */
++int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
++                   int w, int h, enum AVPixelFormat pix_fmt, int align);
++
++/**
++ * Copy image plane from src to dst.
++ * That is, copy "height" number of lines of "bytewidth" bytes each.
++ * The first byte of each successive line is separated by *_linesize
++ * bytes.
++ *
++ * bytewidth must be contained by both absolute values of dst_linesize
++ * and src_linesize, otherwise the function behavior is undefined.
++ *
++ * @param dst          destination plane to copy to
++ * @param dst_linesize linesize for the image plane in dst
++ * @param src          source plane to copy from
++ * @param src_linesize linesize for the image plane in src
++ * @param height       height (number of lines) of the plane
++ */
++void av_image_copy_plane(uint8_t       *dst, int dst_linesize,
++                         const uint8_t *src, int src_linesize,
++                         int bytewidth, int height);
++
++/**
++ * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where
++ * available, this function will use special functionality for reading from such
++ * memory, which may result in greatly improved performance compared to plain
++ * av_image_copy_plane().
++ *
++ * bytewidth must be contained by both absolute values of dst_linesize
++ * and src_linesize, otherwise the function behavior is undefined.
++ *
++ * @note The linesize parameters have the type ptrdiff_t here, while they are
++ *       int for av_image_copy_plane().
++ * @note On x86, the linesizes currently need to be aligned to the cacheline
++ *       size (i.e. 64) to get improved performance.
++ */
++void av_image_copy_plane_uc_from(uint8_t       *dst, ptrdiff_t dst_linesize,
++                                 const uint8_t *src, ptrdiff_t src_linesize,
++                                 ptrdiff_t bytewidth, int height);
++
++/**
++ * Copy image in src_data to dst_data.
++ *
++ * @param dst_data      destination image data buffer to copy to
++ * @param dst_linesizes linesizes for the image in dst_data
++ * @param src_data      source image data buffer to copy from
++ * @param src_linesizes linesizes for the image in src_data
++ * @param pix_fmt       the AVPixelFormat of the image
++ * @param width         width of the image in pixels
++ * @param height        height of the image in pixels
++ */
++void av_image_copy(uint8_t * const dst_data[4], const int dst_linesizes[4],
++                   const uint8_t * const src_data[4], const int src_linesizes[4],
++                   enum AVPixelFormat pix_fmt, int width, int height);
++
++/**
++ * Wrapper around av_image_copy() to workaround the limitation
++ * that the conversion from uint8_t * const * to const uint8_t * const *
++ * is not performed automatically in C.
++ * @see av_image_copy()
++ */
++static inline
++void av_image_copy2(uint8_t * const dst_data[4], const int dst_linesizes[4],
++                    uint8_t * const src_data[4], const int src_linesizes[4],
++                    enum AVPixelFormat pix_fmt, int width, int height)
++{
++    av_image_copy(dst_data, dst_linesizes,
++                  (const uint8_t * const *)src_data, src_linesizes,
++                  pix_fmt, width, height);
++}
++
++/**
++ * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where
++ * available, this function will use special functionality for reading from such
++ * memory, which may result in greatly improved performance compared to plain
++ * av_image_copy().
++ *
++ * The data pointers and the linesizes must be aligned to the maximum required
++ * by the CPU architecture.
++ *
++ * @note The linesize parameters have the type ptrdiff_t here, while they are
++ *       int for av_image_copy().
++ * @note On x86, the linesizes currently need to be aligned to the cacheline
++ *       size (i.e. 64) to get improved performance.
++ */
++void av_image_copy_uc_from(uint8_t * const dst_data[4],       const ptrdiff_t dst_linesizes[4],
++                           const uint8_t * const src_data[4], const ptrdiff_t src_linesizes[4],
++                           enum AVPixelFormat pix_fmt, int width, int height);
++
++/**
++ * Setup the data pointers and linesizes based on the specified image
++ * parameters and the provided array.
++ *
++ * The fields of the given image are filled in by using the src
++ * address which points to the image data buffer. Depending on the
++ * specified pixel format, one or multiple image data pointers and
++ * line sizes will be set.  If a planar format is specified, several
++ * pointers will be set pointing to the different picture planes and
++ * the line sizes of the different planes will be stored in the
++ * lines_sizes array. Call with src == NULL to get the required
++ * size for the src buffer.
++ *
++ * To allocate the buffer and fill in the dst_data and dst_linesize in
++ * one call, use av_image_alloc().
++ *
++ * @param dst_data      data pointers to be filled in
++ * @param dst_linesize  linesizes for the image in dst_data to be filled in
++ * @param src           buffer which will contain or contains the actual image data, can be NULL
++ * @param pix_fmt       the pixel format of the image
++ * @param width         the width of the image in pixels
++ * @param height        the height of the image in pixels
++ * @param align         the value used in src for linesize alignment
++ * @return the size in bytes required for src, a negative error code
++ * in case of failure
++ */
++int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4],
++                         const uint8_t *src,
++                         enum AVPixelFormat pix_fmt, int width, int height, int align);
++
++/**
++ * Return the size in bytes of the amount of data required to store an
++ * image with the given parameters.
++ *
++ * @param pix_fmt  the pixel format of the image
++ * @param width    the width of the image in pixels
++ * @param height   the height of the image in pixels
++ * @param align    the assumed linesize alignment
++ * @return the buffer size in bytes, a negative error code in case of failure
++ */
++int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);
++
++/**
++ * Copy image data from an image into a buffer.
++ *
++ * av_image_get_buffer_size() can be used to compute the required size
++ * for the buffer to fill.
++ *
++ * @param dst           a buffer into which picture data will be copied
++ * @param dst_size      the size in bytes of dst
++ * @param src_data      pointers containing the source image data
++ * @param src_linesize  linesizes for the image in src_data
++ * @param pix_fmt       the pixel format of the source image
++ * @param width         the width of the source image in pixels
++ * @param height        the height of the source image in pixels
++ * @param align         the assumed linesize alignment for dst
++ * @return the number of bytes written to dst, or a negative value
++ * (error code) on error
++ */
++int av_image_copy_to_buffer(uint8_t *dst, int dst_size,
++                            const uint8_t * const src_data[4], const int src_linesize[4],
++                            enum AVPixelFormat pix_fmt, int width, int height, int align);
++
++/**
++ * Check if the given dimension of an image is valid, meaning that all
++ * bytes of the image can be addressed with a signed int.
++ *
++ * @param w the width of the picture
++ * @param h the height of the picture
++ * @param log_offset the offset to sum to the log level for logging with log_ctx
++ * @param log_ctx the parent logging context, it may be NULL
++ * @return >= 0 if valid, a negative error code otherwise
++ */
++int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx);
++
++/**
++ * Check if the given dimension of an image is valid, meaning that all
++ * bytes of a plane of an image with the specified pix_fmt can be addressed
++ * with a signed int.
++ *
++ * @param w the width of the picture
++ * @param h the height of the picture
++ * @param max_pixels the maximum number of pixels the user wants to accept
++ * @param pix_fmt the pixel format, can be AV_PIX_FMT_NONE if unknown.
++ * @param log_offset the offset to sum to the log level for logging with log_ctx
++ * @param log_ctx the parent logging context, it may be NULL
++ * @return >= 0 if valid, a negative error code otherwise
++ */
++int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx);
++
++/**
++ * Check if the given sample aspect ratio of an image is valid.
++ *
++ * It is considered invalid if the denominator is 0 or if applying the ratio
++ * to the image size would make the smaller dimension less than 1. If the
++ * sar numerator is 0, it is considered unknown and will return as valid.
++ *
++ * @param w width of the image
++ * @param h height of the image
++ * @param sar sample aspect ratio of the image
++ * @return 0 if valid, a negative AVERROR code otherwise
++ */
++int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar);
++
++/**
++ * Overwrite the image data with black. This is suitable for filling a
++ * sub-rectangle of an image, meaning the padding between the right most pixel
++ * and the left most pixel on the next line will not be overwritten. For some
++ * formats, the image size might be rounded up due to inherent alignment.
++ *
++ * If the pixel format has alpha, the alpha is cleared to opaque.
++ *
++ * This can return an error if the pixel format is not supported. Normally, all
++ * non-hwaccel pixel formats should be supported.
++ *
++ * Passing NULL for dst_data is allowed. Then the function returns whether the
++ * operation would have succeeded. (It can return an error if the pix_fmt is
++ * not supported.)
++ *
++ * @param dst_data      data pointers to destination image
++ * @param dst_linesize  linesizes for the destination image
++ * @param pix_fmt       the pixel format of the image
++ * @param range         the color range of the image (important for colorspaces such as YUV)
++ * @param width         the width of the image in pixels
++ * @param height        the height of the image in pixels
++ * @return 0 if the image data was cleared, a negative AVERROR code otherwise
++ */
++int av_image_fill_black(uint8_t * const dst_data[4], const ptrdiff_t dst_linesize[4],
++                        enum AVPixelFormat pix_fmt, enum AVColorRange range,
++                        int width, int height);
++
++/**
++ * Overwrite the image data with a color. This is suitable for filling a
++ * sub-rectangle of an image, meaning the padding between the right most pixel
++ * and the left most pixel on the next line will not be overwritten. For some
++ * formats, the image size might be rounded up due to inherent alignment.
++ *
++ * If the pixel format has alpha, it is also replaced. Color component values
++ * are interpreted as native integers (or intfloats) regardless of actual pixel
++ * format endianness.
++ *
++ * This can return an error if the pixel format is not supported. Normally, all
++ * non-hwaccel pixel formats should be supported.
++ *
++ * Passing NULL for dst_data is allowed. Then the function returns whether the
++ * operation would have succeeded. (It can return an error if the pix_fmt is
++ * not supported.)
++ *
++ * @param dst_data      data pointers to destination image
++ * @param dst_linesize  linesizes for the destination image
++ * @param pix_fmt       the pixel format of the image
++ * @param color         the color components to be used for the fill
++ * @param width         the width of the image in pixels
++ * @param height        the height of the image in pixels
++ * @param flags         currently unused
++ * @return 0 if the image data was filled, a negative AVERROR code otherwise
++ */
++int av_image_fill_color(uint8_t * const dst_data[4], const ptrdiff_t dst_linesize[4],
++                        enum AVPixelFormat pix_fmt, const uint32_t color[4],
++                        int width, int height, int flags);
++
++/**
++ * @}
++ */
++
++
++#endif /* AVUTIL_IMGUTILS_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/intfloat.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/intfloat.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/intfloat.h.ffmpeg9	2026-09-07 12:23:47.677385942 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/intfloat.h	2026-09-07 12:23:47.677362072 +0200
+@@ -0,0 +1,77 @@
++/*
++ * Copyright (c) 2011 Mans Rullgard
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVUTIL_INTFLOAT_H
++#define AVUTIL_INTFLOAT_H
++
++#include <stdint.h>
++#include "attributes.h"
++
++union av_intfloat32 {
++    uint32_t i;
++    float    f;
++};
++
++union av_intfloat64 {
++    uint64_t i;
++    double   f;
++};
++
++/**
++ * Reinterpret a 32-bit integer as a float.
++ */
++static av_always_inline float av_int2float(uint32_t i)
++{
++    union av_intfloat32 v;
++    v.i = i;
++    return v.f;
++}
++
++/**
++ * Reinterpret a float as a 32-bit integer.
++ */
++static av_always_inline uint32_t av_float2int(float f)
++{
++    union av_intfloat32 v;
++    v.f = f;
++    return v.i;
++}
++
++/**
++ * Reinterpret a 64-bit integer as a double.
++ */
++static av_always_inline double av_int2double(uint64_t i)
++{
++    union av_intfloat64 v;
++    v.i = i;
++    return v.f;
++}
++
++/**
++ * Reinterpret a double as a 64-bit integer.
++ */
++static av_always_inline uint64_t av_double2int(double f)
++{
++    union av_intfloat64 v;
++    v.f = f;
++    return v.i;
++}
++
++#endif /* AVUTIL_INTFLOAT_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/log.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/log.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/log.h.ffmpeg9	2026-09-07 12:23:47.677527630 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/log.h	2026-09-07 12:23:47.677445894 +0200
+@@ -0,0 +1,427 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVUTIL_LOG_H
++#define AVUTIL_LOG_H
++
++#include <stdarg.h>
++#include "attributes.h"
++#include "version.h"
++
++typedef enum {
++    AV_CLASS_CATEGORY_NA = 0,
++    AV_CLASS_CATEGORY_INPUT,
++    AV_CLASS_CATEGORY_OUTPUT,
++    AV_CLASS_CATEGORY_MUXER,
++    AV_CLASS_CATEGORY_DEMUXER,
++    AV_CLASS_CATEGORY_ENCODER,
++    AV_CLASS_CATEGORY_DECODER,
++    AV_CLASS_CATEGORY_FILTER,
++    AV_CLASS_CATEGORY_BITSTREAM_FILTER,
++    AV_CLASS_CATEGORY_SWSCALER,
++    AV_CLASS_CATEGORY_SWRESAMPLER,
++    AV_CLASS_CATEGORY_HWDEVICE,
++    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;
++
++enum AVClassStateFlags {
++    /**
++     * Object initialization has finished and it is now in the 'runtime' stage.
++     * This affects e.g. what options can be set on the object (only
++     * AV_OPT_FLAG_RUNTIME_PARAM options can be set on initialized objects).
++     */
++    AV_CLASS_STATE_INITIALIZED         = (1 << 0),
++};
++
++#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);
++
++    /**
++     * An array of options for the structure or NULL.
++     * When non-NULL, the array must be terminated by an option with a NULL
++     * name.
++     *
++     * @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 to AVClass without requiring
++     * major version bumps everywhere.
++     */
++
++    int version;
++
++    /**
++     * Offset in the structure where the log level offset is stored. The log
++     * level offset is an int added to the log level for logging with this
++     * object as the context.
++     *
++     * 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.
++     *
++     * When the pointer is NULL, or this offset is zero, the object is assumed
++     * to have no parent.
++     */
++    int parent_log_context_offset;
++
++    /**
++     * Category used for visualization (like color).
++     *
++     * Only used when ::get_category() is NULL. Use this field when all
++     * instances of this class have the same category, use ::get_category()
++     * otherwise.
++     */
++    AVClassCategory category;
++
++    /**
++     * Callback to return the instance category. Use this callback when
++     * different instances of this class may have different categories,
++     * ::category otherwise.
++     */
++    AVClassCategory (*get_category)(void* ctx);
++
++    /**
++     * Callback to return the supported/allowed ranges.
++     */
++    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 ::child_class_iterate()
++     *       is that ::child_next() iterates over _actual_ children of an
++     *       _existing_ object instance, while ::child_class_iterate() iterates
++     *       over the classes of all _potential_ children of any possible
++     *       instance of this class.
++     */
++    const struct AVClass* (*child_class_iterate)(void **iter);
++
++    /**
++     * When non-zero, offset in the object to an unsigned int holding object
++     * state flags, a combination of AVClassStateFlags values. The flags are
++     * updated by the object to signal its state to the generic code.
++     *
++     * Added in version 59.41.100.
++     */
++    int state_flags_offset;
++} 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 occurrence.
++ * @param subsequent_level importance level of the message expressed using a @ref
++ *        lavu_log_constants "Logging Constant" after the first occurrence.
++ * @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
++
++/**
++ * Include system time in log output.
++ */
++#define AV_LOG_PRINT_TIME 4
++
++/**
++ * Include system date and time in log output.
++ */
++#define AV_LOG_PRINT_DATETIME 8
++
++void av_log_set_flags(int arg);
++int av_log_get_flags(void);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_LOG_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/macros.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/macros.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/macros.h.ffmpeg9	2026-09-07 12:23:47.677612990 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/macros.h	2026-09-07 12:23:47.677588192 +0200
+@@ -0,0 +1,80 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++/**
++ * @file
++ * @ingroup lavu
++ * Utility Preprocessor macros
++ */
++
++#ifndef AVUTIL_MACROS_H
++#define AVUTIL_MACROS_H
++
++#include "libavutil/avconfig.h"
++
++#if AV_HAVE_BIGENDIAN
++#   define AV_NE(be, le) (be)
++#else
++#   define AV_NE(be, le) (le)
++#endif
++
++/**
++ * Comparator.
++ * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0
++ * if x == y. This is useful for instance in a qsort comparator callback.
++ * Furthermore, compilers are able to optimize this to branchless code, and
++ * there is no risk of overflow with signed types.
++ * As with many macros, this evaluates its argument multiple times, it thus
++ * must not have a side-effect.
++ */
++#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y)))
++
++#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
++#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
++#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
++#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c)
++
++#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
++#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
++
++#define MKTAG(a,b,c,d)   ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
++#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))
++
++/**
++ * @addtogroup preproc_misc Preprocessor String Macros
++ *
++ * String manipulation macros
++ *
++ * @{
++ */
++
++#define AV_STRINGIFY(s)         AV_TOSTRING(s)
++#define AV_TOSTRING(s) #s
++
++#define AV_GLUE(a, b) a ## b
++#define AV_JOIN(a, b) AV_GLUE(a, b)
++
++/**
++ * @}
++ */
++
++#define AV_PRAGMA(s) _Pragma(#s)
++
++#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))
++
++#endif /* AVUTIL_MACROS_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/mathematics.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/mathematics.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/mathematics.h.ffmpeg9	2026-09-07 12:23:47.677728310 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/mathematics.h	2026-09-07 12:23:47.677666230 +0200
+@@ -0,0 +1,300 @@
++/*
++ * copyright (c) 2005-2012 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++/**
++ * @file
++ * @addtogroup lavu_math
++ * Mathematical utilities for working with timestamp and time base.
++ */
++
++#ifndef AVUTIL_MATHEMATICS_H
++#define AVUTIL_MATHEMATICS_H
++
++#include <stdint.h>
++#include <math.h>
++#include "attributes.h"
++#include "rational.h"
++#include "intfloat.h"
++
++#ifndef M_E
++#define M_E            2.7182818284590452354   /* e */
++#endif
++#ifndef M_Ef
++#define M_Ef           2.7182818284590452354f  /* e */
++#endif
++#ifndef M_LN2
++#define M_LN2          0.69314718055994530942  /* log_e 2 */
++#endif
++#ifndef M_LN2f
++#define M_LN2f         0.69314718055994530942f /* log_e 2 */
++#endif
++#ifndef M_LN10
++#define M_LN10         2.30258509299404568402  /* log_e 10 */
++#endif
++#ifndef M_LN10f
++#define M_LN10f        2.30258509299404568402f /* log_e 10 */
++#endif
++#ifndef M_LOG2_10
++#define M_LOG2_10      3.32192809488736234787  /* log_2 10 */
++#endif
++#ifndef M_LOG2_10f
++#define M_LOG2_10f     3.32192809488736234787f /* log_2 10 */
++#endif
++#ifndef M_PHI
++#define M_PHI          1.61803398874989484820   /* phi / golden ratio */
++#endif
++#ifndef M_PHIf
++#define M_PHIf         1.61803398874989484820f  /* phi / golden ratio */
++#endif
++#ifndef M_PI
++#define M_PI           3.14159265358979323846  /* pi */
++#endif
++#ifndef M_PIf
++#define M_PIf          3.14159265358979323846f /* pi */
++#endif
++#ifndef M_PI_2
++#define M_PI_2         1.57079632679489661923  /* pi/2 */
++#endif
++#ifndef M_PI_2f
++#define M_PI_2f        1.57079632679489661923f /* pi/2 */
++#endif
++#ifndef M_PI_4
++#define M_PI_4         0.78539816339744830962  /* pi/4 */
++#endif
++#ifndef M_PI_4f
++#define M_PI_4f        0.78539816339744830962f /* pi/4 */
++#endif
++#ifndef M_1_PI
++#define M_1_PI         0.31830988618379067154  /* 1/pi */
++#endif
++#ifndef M_1_PIf
++#define M_1_PIf        0.31830988618379067154f /* 1/pi */
++#endif
++#ifndef M_2_PI
++#define M_2_PI         0.63661977236758134308  /* 2/pi */
++#endif
++#ifndef M_2_PIf
++#define M_2_PIf        0.63661977236758134308f /* 2/pi */
++#endif
++#ifndef M_2_SQRTPI
++#define M_2_SQRTPI     1.12837916709551257390  /* 2/sqrt(pi) */
++#endif
++#ifndef M_2_SQRTPIf
++#define M_2_SQRTPIf    1.12837916709551257390f /* 2/sqrt(pi) */
++#endif
++#ifndef M_SQRT1_2
++#define M_SQRT1_2      0.70710678118654752440  /* 1/sqrt(2) */
++#endif
++#ifndef M_SQRT1_2f
++#define M_SQRT1_2f     0.70710678118654752440f /* 1/sqrt(2) */
++#endif
++#ifndef M_SQRT2
++#define M_SQRT2        1.41421356237309504880  /* sqrt(2) */
++#endif
++#ifndef M_SQRT2f
++#define M_SQRT2f       1.41421356237309504880f /* sqrt(2) */
++#endif
++#ifndef NAN
++#define NAN            av_int2float(0x7fc00000)
++#endif
++#ifndef INFINITY
++#define INFINITY       av_int2float(0x7f800000)
++#endif
++
++/**
++ * @addtogroup lavu_math
++ *
++ * @{
++ */
++
++/**
++ * Rounding methods.
++ */
++enum AVRounding {
++    AV_ROUND_ZERO     = 0, ///< Round toward zero.
++    AV_ROUND_INF      = 1, ///< Round away from zero.
++    AV_ROUND_DOWN     = 2, ///< Round toward -infinity.
++    AV_ROUND_UP       = 3, ///< Round toward +infinity.
++    AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero.
++    /**
++     * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through
++     * unchanged, avoiding special cases for #AV_NOPTS_VALUE.
++     *
++     * Unlike other values of the enumeration AVRounding, this value is a
++     * bitmask that must be used in conjunction with another value of the
++     * enumeration through a bitwise OR, in order to set behavior for normal
++     * cases.
++     *
++     * @code{.c}
++     * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
++     * // Rescaling 3:
++     * //     Calculating 3 * 1 / 2
++     * //     3 / 2 is rounded up to 2
++     * //     => 2
++     *
++     * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
++     * // Rescaling AV_NOPTS_VALUE:
++     * //     AV_NOPTS_VALUE == INT64_MIN
++     * //     AV_NOPTS_VALUE is passed through
++     * //     => AV_NOPTS_VALUE
++     * @endcode
++     */
++    AV_ROUND_PASS_MINMAX = 8192,
++};
++
++/**
++ * Compute the greatest common divisor of two integer operands.
++ *
++ * @param a Operand
++ * @param b Operand
++ * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0;
++ * if a == 0 and b == 0, returns 0.
++ */
++int64_t av_const av_gcd(int64_t a, int64_t b);
++
++/**
++ * Rescale a 64-bit integer with rounding to nearest.
++ *
++ * The operation is mathematically equivalent to `a * b / c`, but writing that
++ * directly can overflow.
++ *
++ * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF.
++ *
++ * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd()
++ */
++int64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const;
++
++/**
++ * Rescale a 64-bit integer with specified rounding.
++ *
++ * The operation is mathematically equivalent to `a * b / c`, but writing that
++ * directly can overflow, and does not support different rounding methods.
++ * If the result is not representable then INT64_MIN is returned.
++ *
++ * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd()
++ */
++int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const;
++
++/**
++ * Rescale a 64-bit integer by 2 rational numbers.
++ *
++ * The operation is mathematically equivalent to `a * bq / cq`.
++ *
++ * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF.
++ *
++ * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd()
++ */
++int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;
++
++/**
++ * Rescale a 64-bit integer by 2 rational numbers with specified rounding.
++ *
++ * The operation is mathematically equivalent to `a * bq / cq`.
++ *
++ * @see av_rescale(), av_rescale_rnd(), av_rescale_q()
++ */
++int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq,
++                         enum AVRounding rnd) av_const;
++
++/**
++ * Compare two timestamps each in its own time base.
++ *
++ * @return One of the following values:
++ *         - -1 if `ts_a` is before `ts_b`
++ *         - 1 if `ts_a` is after `ts_b`
++ *         - 0 if they represent the same position
++ *
++ * @warning
++ * The result of the function is undefined if one of the timestamps is outside
++ * the `int64_t` range when represented in the other's timebase.
++ */
++int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);
++
++/**
++ * Compare the remainders of two integer operands divided by a common divisor.
++ *
++ * In other words, compare the least significant `log2(mod)` bits of integers
++ * `a` and `b`.
++ *
++ * @code{.c}
++ * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10  (0x1) < 0x02 % 0x10  (0x2)
++ * av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11) > 0x02 % 0x20 (0x02)
++ * @endcode
++ *
++ * @param a Operand
++ * @param b Operand
++ * @param mod Divisor; must be a power of 2
++ * @return
++ *         - a negative value if `a % mod < b % mod`
++ *         - a positive value if `a % mod > b % mod`
++ *         - zero             if `a % mod == b % mod`
++ */
++int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);
++
++/**
++ * Rescale a timestamp while preserving known durations.
++ *
++ * This function is designed to be called per audio packet to scale the input
++ * timestamp to a different time base. Compared to a simple av_rescale_q()
++ * call, this function is robust against possible inconsistent frame durations.
++ *
++ * The `last` parameter is a state variable that must be preserved for all
++ * subsequent calls for the same stream. For the first call, `*last` should be
++ * initialized to #AV_NOPTS_VALUE.
++ *
++ * @param[in]     in_tb    Input time base
++ * @param[in]     in_ts    Input timestamp
++ * @param[in]     fs_tb    Duration time base; typically this is finer-grained
++ *                         (greater) than `in_tb` and `out_tb`
++ * @param[in]     duration Duration till the next call to this function (i.e.
++ *                         duration of the current packet/frame)
++ * @param[in,out] last     Pointer to a timestamp expressed in terms of
++ *                         `fs_tb`, acting as a state variable
++ * @param[in]     out_tb   Output timebase
++ * @return        Timestamp expressed in terms of `out_tb`
++ *
++ * @note In the context of this function, "duration" is in term of samples, not
++ *       seconds.
++ */
++int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts,  AVRational fs_tb, int duration, int64_t *last, AVRational out_tb);
++
++/**
++ * Add a value to a timestamp.
++ *
++ * This function guarantees that when the same value is repeatedly added that
++ * no accumulation of rounding errors occurs.
++ *
++ * @param[in] ts     Input timestamp
++ * @param[in] ts_tb  Input timestamp time base
++ * @param[in] inc    Value to be added
++ * @param[in] inc_tb Time base of `inc`
++ */
++int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc);
++
++/**
++ * 0th order modified bessel function of the first kind.
++ */
++double av_bessel_i0(double x);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_MATHEMATICS_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/mem.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/mem.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/mem.h.ffmpeg9	2026-09-07 12:23:47.677913697 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/mem.h	2026-09-07 12:23:47.677796677 +0200
+@@ -0,0 +1,607 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++/**
++ * @file
++ * @ingroup lavu_mem
++ * Memory handling functions
++ */
++
++#ifndef AVUTIL_MEM_H
++#define AVUTIL_MEM_H
++
++#include <stddef.h>
++#include <stdint.h>
++
++#include "attributes.h"
++
++/**
++ * @addtogroup lavu_mem
++ * Utilities for manipulating memory.
++ *
++ * FFmpeg has several applications of memory that are not required of a typical
++ * program. For example, the computing-heavy components like video decoding and
++ * encoding can be sped up significantly through the use of aligned memory.
++ *
++ * However, for each of FFmpeg's applications of memory, there might not be a
++ * recognized or standardized API for that specific use. Memory alignment, for
++ * instance, varies wildly depending on operating systems, architectures, and
++ * compilers. Hence, this component of @ref libavutil is created to make
++ * dealing with memory consistently possible on all platforms.
++ *
++ * @{
++ */
++
++/**
++ * @defgroup lavu_mem_attrs Function Attributes
++ * Function attributes applicable to memory handling functions.
++ *
++ * These function attributes can help compilers emit more useful warnings, or
++ * generate better code.
++ * @{
++ */
++
++/**
++ * @def av_malloc_attrib
++ * Function attribute denoting a malloc-like function.
++ *
++ * @see <a href="https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-g_t_0040code_007bmalloc_007d-function-attribute-3251">Function attribute `malloc` in GCC's documentation</a>
++ */
++
++#if AV_GCC_VERSION_AT_LEAST(3,1)
++    #define av_malloc_attrib __attribute__((__malloc__))
++#else
++    #define av_malloc_attrib
++#endif
++
++/**
++ * @def av_alloc_size(...)
++ * Function attribute used on a function that allocates memory, whose size is
++ * given by the specified parameter(s).
++ *
++ * @code{.c}
++ * void *av_malloc(size_t size) av_alloc_size(1);
++ * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2);
++ * @endcode
++ *
++ * @param ... One or two parameter indexes, separated by a comma
++ *
++ * @see <a href="https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-g_t_0040code_007balloc_005fsize_007d-function-attribute-3220">Function attribute `alloc_size` in GCC's documentation</a>
++ */
++
++#if AV_GCC_VERSION_AT_LEAST(4,3)
++    #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
++#else
++    #define av_alloc_size(...)
++#endif
++
++/**
++ * @}
++ */
++
++/**
++ * @defgroup lavu_mem_funcs Heap Management
++ * Functions responsible for allocating, freeing, and copying memory.
++ *
++ * All memory allocation functions have a built-in upper limit of `INT_MAX`
++ * bytes. This may be changed with av_max_alloc(), although exercise extreme
++ * caution when doing so.
++ *
++ * @{
++ */
++
++/**
++ * Allocate a memory block with alignment suitable for all memory accesses
++ * (including vectors if available on the CPU).
++ *
++ * @param size Size in bytes for the memory block to be allocated
++ * @return Pointer to the allocated block, or `NULL` if the block cannot
++ *         be allocated
++ * @see av_mallocz()
++ */
++void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);
++
++/**
++ * Allocate a memory block with alignment suitable for all memory accesses
++ * (including vectors if available on the CPU) and zero all the bytes of the
++ * block.
++ *
++ * @param size Size in bytes for the memory block to be allocated
++ * @return Pointer to the allocated block, or `NULL` if it cannot be allocated
++ * @see av_malloc()
++ */
++void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1);
++
++/**
++ * Allocate a memory block for an array with av_malloc().
++ *
++ * The allocated memory will have size `size * nmemb` bytes.
++ *
++ * @param nmemb Number of element
++ * @param size  Size of a single element
++ * @return Pointer to the allocated block, or `NULL` if the block cannot
++ *         be allocated
++ * @see av_malloc()
++ */
++av_alloc_size(1, 2) void *av_malloc_array(size_t nmemb, size_t size);
++
++/**
++ * Allocate a memory block for an array with av_mallocz().
++ *
++ * The allocated memory will have size `size * nmemb` bytes.
++ *
++ * @param nmemb Number of elements
++ * @param size  Size of the single element
++ * @return Pointer to the allocated block, or `NULL` if the block cannot
++ *         be allocated
++ *
++ * @see av_mallocz()
++ * @see av_malloc_array()
++ */
++void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib av_alloc_size(1, 2);
++
++/**
++ * Allocate, reallocate, or free a block of memory.
++ *
++ * If `ptr` is `NULL` and `size` > 0, allocate a new block. Otherwise, expand or
++ * shrink that block of memory according to `size`.
++ *
++ * @param ptr  Pointer to a memory block already allocated with
++ *             av_realloc() or `NULL`
++ * @param size Size in bytes of the memory block to be allocated or
++ *             reallocated
++ *
++ * @return Pointer to a newly-reallocated block or `NULL` if the block
++ *         cannot be reallocated
++ *
++ * @warning Unlike av_malloc(), the returned pointer is not guaranteed to be
++ *          correctly aligned. The returned pointer must be freed after even
++ *          if size is zero.
++ * @see av_fast_realloc()
++ * @see av_reallocp()
++ */
++void *av_realloc(void *ptr, size_t size) av_alloc_size(2);
++
++/**
++ * Allocate, reallocate, or free a block of memory through a pointer to a
++ * pointer.
++ *
++ * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is
++ * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or
++ * shrink that block of memory according to `size`.
++ *
++ * @param[in,out] ptr  Pointer to a pointer to a memory block already allocated
++ *                     with av_realloc(), or a pointer to `NULL`. The pointer
++ *                     is updated on success, or freed on failure.
++ * @param[in]     size Size in bytes for the memory block to be allocated or
++ *                     reallocated
++ *
++ * @return Zero on success, an AVERROR error code on failure
++ *
++ * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be
++ *          correctly aligned.
++ */
++av_warn_unused_result
++int av_reallocp(void *ptr, size_t size);
++
++/**
++ * Allocate, reallocate, or free a block of memory.
++ *
++ * This function does the same thing as av_realloc(), except:
++ * - It takes two size arguments and allocates `nelem * elsize` bytes,
++ *   after checking the result of the multiplication for integer overflow.
++ * - It frees the input block in case of failure, thus avoiding the memory
++ *   leak with the classic
++ *   @code{.c}
++ *   buf = realloc(buf);
++ *   if (!buf)
++ *       return -1;
++ *   @endcode
++ *   pattern.
++ */
++void *av_realloc_f(void *ptr, size_t nelem, size_t elsize);
++
++/**
++ * Allocate, reallocate, or free an array.
++ *
++ * If `ptr` is `NULL` and `nmemb` > 0, allocate a new block.
++ *
++ * @param ptr   Pointer to a memory block already allocated with
++ *              av_realloc() or `NULL`
++ * @param nmemb Number of elements in the array
++ * @param size  Size of the single element of the array
++ *
++ * @return Pointer to a newly-reallocated block or NULL if the block
++ *         cannot be reallocated
++ *
++ * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be
++ *          correctly aligned. The returned pointer must be freed after even if
++ *          nmemb is zero.
++ * @see av_reallocp_array()
++ */
++av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size);
++
++/**
++ * Allocate, reallocate an array through a pointer to a pointer.
++ *
++ * If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block.
++ *
++ * @param[in,out] ptr   Pointer to a pointer to a memory block already
++ *                      allocated with av_realloc(), or a pointer to `NULL`.
++ *                      The pointer is updated on success, or freed on failure.
++ * @param[in]     nmemb Number of elements
++ * @param[in]     size  Size of the single element
++ *
++ * @return Zero on success, an AVERROR error code on failure
++ *
++ * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be
++ *          correctly aligned. *ptr must be freed after even if nmemb is zero.
++ */
++int av_reallocp_array(void *ptr, size_t nmemb, size_t size);
++
++/**
++ * Reallocate the given buffer if it is not large enough, otherwise do nothing.
++ *
++ * If the given buffer is `NULL`, then a new uninitialized buffer is allocated.
++ *
++ * If the given buffer is not large enough, and reallocation fails, `NULL` is
++ * returned and `*size` is set to 0, but the original buffer is not changed or
++ * freed.
++ *
++ * A typical use pattern follows:
++ *
++ * @code{.c}
++ * uint8_t *buf = ...;
++ * uint8_t *new_buf = av_fast_realloc(buf, &current_size, size_needed);
++ * if (!new_buf) {
++ *     // Allocation failed; clean up original buffer
++ *     av_freep(&buf);
++ *     return AVERROR(ENOMEM);
++ * }
++ * @endcode
++ *
++ * @param[in,out] ptr      Already allocated buffer, or `NULL`
++ * @param[in,out] size     Pointer to the size of buffer `ptr`. `*size` is
++ *                         updated to the new allocated size, in particular 0
++ *                         in case of failure.
++ * @param[in]     min_size Desired minimal size of buffer `ptr`
++ * @return `ptr` if the buffer is large enough, a pointer to newly reallocated
++ *         buffer if the buffer was not large enough, or `NULL` in case of
++ *         error
++ * @see av_realloc()
++ * @see av_fast_malloc()
++ */
++void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size);
++
++/**
++ * Allocate a buffer, reusing the given one if large enough.
++ *
++ * Contrary to av_fast_realloc(), the current buffer contents might not be
++ * preserved and on error the old buffer is freed, thus no special handling to
++ * avoid memleaks is necessary.
++ *
++ * `*ptr` is allowed to be `NULL`, in which case allocation always happens if
++ * `size_needed` is greater than 0.
++ *
++ * @code{.c}
++ * uint8_t *buf = ...;
++ * av_fast_malloc(&buf, &current_size, size_needed);
++ * if (!buf) {
++ *     // Allocation failed; buf already freed
++ *     return AVERROR(ENOMEM);
++ * }
++ * @endcode
++ *
++ * @param[in,out] ptr      Pointer to pointer to an already allocated buffer.
++ *                         `*ptr` will be overwritten with pointer to new
++ *                         buffer on success or `NULL` on failure
++ * @param[in,out] size     Pointer to the size of buffer `*ptr`. `*size` is
++ *                         updated to the new allocated size, in particular 0
++ *                         in case of failure.
++ * @param[in]     min_size Desired minimal size of buffer `*ptr`
++ * @see av_realloc()
++ * @see av_fast_mallocz()
++ */
++void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size);
++
++/**
++ * Allocate and clear a buffer, reusing the given one if large enough.
++ *
++ * Like av_fast_malloc(), but all newly allocated space is initially cleared.
++ * Reused buffer is not cleared.
++ *
++ * `*ptr` is allowed to be `NULL`, in which case allocation always happens if
++ * `size_needed` is greater than 0.
++ *
++ * @param[in,out] ptr      Pointer to pointer to an already allocated buffer.
++ *                         `*ptr` will be overwritten with pointer to new
++ *                         buffer on success or `NULL` on failure
++ * @param[in,out] size     Pointer to the size of buffer `*ptr`. `*size` is
++ *                         updated to the new allocated size, in particular 0
++ *                         in case of failure.
++ * @param[in]     min_size Desired minimal size of buffer `*ptr`
++ * @see av_fast_malloc()
++ */
++void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size);
++
++/**
++ * Free a memory block which has been allocated with a function of av_malloc()
++ * or av_realloc() family.
++ *
++ * @param ptr Pointer to the memory block which should be freed.
++ *
++ * @note `ptr = NULL` is explicitly allowed.
++ * @note It is recommended that you use av_freep() instead, to prevent leaving
++ *       behind dangling pointers.
++ * @see av_freep()
++ */
++void av_free(void *ptr);
++
++/**
++ * Free a memory block which has been allocated with a function of av_malloc()
++ * or av_realloc() family, and set the pointer pointing to it to `NULL`.
++ *
++ * @code{.c}
++ * uint8_t *buf = av_malloc(16);
++ * av_free(buf);
++ * // buf now contains a dangling pointer to freed memory, and accidental
++ * // dereference of buf will result in a use-after-free, which may be a
++ * // security risk.
++ *
++ * uint8_t *buf = av_malloc(16);
++ * av_freep(&buf);
++ * // buf is now NULL, and accidental dereference will only result in a
++ * // NULL-pointer dereference.
++ * @endcode
++ *
++ * @param ptr Pointer to the pointer to the memory block which should be freed
++ * @note `*ptr = NULL` is safe and leads to no action.
++ * @see av_free()
++ */
++void av_freep(void *ptr);
++
++/**
++ * Duplicate a string.
++ *
++ * @param s String to be duplicated
++ * @return Pointer to a newly-allocated string containing a
++ *         copy of `s` or `NULL` if the string cannot be allocated
++ * @see av_strndup()
++ */
++char *av_strdup(const char *s) av_malloc_attrib;
++
++/**
++ * Duplicate a substring of a string.
++ *
++ * @param s   String to be duplicated
++ * @param len Maximum length of the resulting string (not counting the
++ *            terminating byte)
++ * @return Pointer to a newly-allocated string containing a
++ *         substring of `s` or `NULL` if the string cannot be allocated
++ */
++char *av_strndup(const char *s, size_t len) av_malloc_attrib;
++
++/**
++ * Duplicate a buffer with av_malloc().
++ *
++ * @param p    Buffer to be duplicated
++ * @param size Size in bytes of the buffer copied
++ * @return Pointer to a newly allocated buffer containing a
++ *         copy of `p` or `NULL` if the buffer cannot be allocated
++ */
++void *av_memdup(const void *p, size_t size);
++
++/**
++ * Overlapping memcpy() implementation.
++ *
++ * @param dst  Destination buffer
++ * @param back Number of bytes back to start copying (i.e. the initial size of
++ *             the overlapping window); must be > 0
++ * @param cnt  Number of bytes to copy; must be >= 0
++ *
++ * @note `cnt > back` is valid, this will copy the bytes we just copied,
++ *       thus creating a repeating pattern with a period length of `back`.
++ */
++void av_memcpy_backptr(uint8_t *dst, int back, int cnt);
++
++/**
++ * @}
++ */
++
++/**
++ * @defgroup lavu_mem_dynarray Dynamic Array
++ *
++ * Utilities to make an array grow when needed.
++ *
++ * Sometimes, the programmer would want to have an array that can grow when
++ * needed. The libavutil dynamic array utilities fill that need.
++ *
++ * libavutil supports two systems of appending elements onto a dynamically
++ * allocated array, the first one storing the pointer to the value in the
++ * array, and the second storing the value directly. In both systems, the
++ * caller is responsible for maintaining a variable containing the length of
++ * the array, as well as freeing of the array after use.
++ *
++ * The first system stores pointers to values in a block of dynamically
++ * allocated memory. Since only pointers are stored, the function does not need
++ * to know the size of the type. Both av_dynarray_add() and
++ * av_dynarray_add_nofree() implement this system.
++ *
++ * @code
++ * type **array = NULL; //< an array of pointers to values
++ * int    nb    = 0;    //< a variable to keep track of the length of the array
++ *
++ * type to_be_added  = ...;
++ * type to_be_added2 = ...;
++ *
++ * av_dynarray_add(&array, &nb, &to_be_added);
++ * if (nb == 0)
++ *     return AVERROR(ENOMEM);
++ *
++ * av_dynarray_add(&array, &nb, &to_be_added2);
++ * if (nb == 0)
++ *     return AVERROR(ENOMEM);
++ *
++ * // Now:
++ * //  nb           == 2
++ * // &to_be_added  == array[0]
++ * // &to_be_added2 == array[1]
++ *
++ * av_freep(&array);
++ * @endcode
++ *
++ * The second system stores the value directly in a block of memory. As a
++ * result, the function has to know the size of the type. av_dynarray2_add()
++ * implements this mechanism.
++ *
++ * @code
++ * type *array = NULL; //< an array of values
++ * int   nb    = 0;    //< a variable to keep track of the length of the array
++ *
++ * type to_be_added  = ...;
++ * type to_be_added2 = ...;
++ *
++ * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL);
++ * if (!addr)
++ *     return AVERROR(ENOMEM);
++ * memcpy(addr, &to_be_added, sizeof(to_be_added));
++ *
++ * // Shortcut of the above.
++ * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array),
++ *                               (const void *)&to_be_added2);
++ * if (!addr)
++ *     return AVERROR(ENOMEM);
++ *
++ * // Now:
++ * //  nb           == 2
++ * //  to_be_added  == array[0]
++ * //  to_be_added2 == array[1]
++ *
++ * av_freep(&array);
++ * @endcode
++ *
++ * @{
++ */
++
++/**
++ * Add the pointer to an element to a dynamic array.
++ *
++ * The array to grow is supposed to be an array of pointers to
++ * structures, and the element to add must be a pointer to an already
++ * allocated structure.
++ *
++ * The array is reallocated when its size reaches powers of 2.
++ * Therefore, the amortized cost of adding an element is constant.
++ *
++ * In case of success, the pointer to the array is updated in order to
++ * point to the new grown array, and the number pointed to by `nb_ptr`
++ * is incremented.
++ * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and
++ * `*nb_ptr` is set to 0.
++ *
++ * @param[in,out] tab_ptr Pointer to the array to grow
++ * @param[in,out] nb_ptr  Pointer to the number of elements in the array
++ * @param[in]     elem    Element to add
++ * @see av_dynarray_add_nofree(), av_dynarray2_add()
++ */
++void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem);
++
++/**
++ * Add an element to a dynamic array.
++ *
++ * Function has the same functionality as av_dynarray_add(),
++ * but it doesn't free memory on fails. It returns error code
++ * instead and leave current buffer untouched.
++ *
++ * @return >=0 on success, negative otherwise
++ * @see av_dynarray_add(), av_dynarray2_add()
++ */
++av_warn_unused_result
++int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem);
++
++/**
++ * Add an element of size `elem_size` to a dynamic array.
++ *
++ * The array is reallocated when its number of elements reaches powers of 2.
++ * Therefore, the amortized cost of adding an element is constant.
++ *
++ * In case of success, the pointer to the array is updated in order to
++ * point to the new grown array, and the number pointed to by `nb_ptr`
++ * is incremented.
++ * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and
++ * `*nb_ptr` is set to 0.
++ *
++ * @param[in,out] tab_ptr   Pointer to the array to grow
++ * @param[in,out] nb_ptr    Pointer to the number of elements in the array
++ * @param[in]     elem_size Size in bytes of an element in the array
++ * @param[in]     elem_data Pointer to the data of the element to add. If
++ *                          `NULL`, the space of the newly added element is
++ *                          allocated but left uninitialized.
++ *
++ * @return Pointer to the data of the element to copy in the newly allocated
++ *         space
++ * @see av_dynarray_add(), av_dynarray_add_nofree()
++ */
++void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size,
++                       const uint8_t *elem_data);
++
++/**
++ * @}
++ */
++
++/**
++ * @defgroup lavu_mem_misc Miscellaneous Functions
++ *
++ * Other functions related to memory allocation.
++ *
++ * @{
++ */
++
++/**
++ * Multiply two `size_t` values checking for overflow.
++ *
++ * @param[in]  a   Operand of multiplication
++ * @param[in]  b   Operand of multiplication
++ * @param[out] r   Pointer to the result of the operation
++ * @return 0 on success, AVERROR(EINVAL) on overflow
++ */
++int av_size_mult(size_t a, size_t b, size_t *r);
++
++/**
++ * Set the maximum size that may be allocated in one block.
++ *
++ * The value specified with this function is effective for all libavutil's @ref
++ * lavu_mem_funcs "heap management functions."
++ *
++ * By default, the max value is defined as `INT_MAX`.
++ *
++ * @param max Value to be set as the new maximum size
++ *
++ * @warning Exercise extreme caution when using this function. Don't touch
++ *          this if you do not understand the full consequence of doing so.
++ */
++void av_max_alloc(size_t max);
++
++/**
++ * @}
++ * @}
++ */
++
++#endif /* AVUTIL_MEM_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/opt.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/opt.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/opt.h.ffmpeg9	2026-09-07 12:23:47.678290041 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/opt.h	2026-09-07 12:23:47.677986652 +0200
+@@ -0,0 +1,1160 @@
++/*
++ * AVOptions
++ * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVUTIL_OPT_H
++#define AVUTIL_OPT_H
++
++/**
++ * @file
++ * AVOptions
++ */
++
++#include "rational.h"
++#include "channel_layout.h"
++#include "dict.h"
++#include "log.h"
++#include "pixfmt.h"
++#include "samplefmt.h"
++
++/**
++ * @defgroup avoptions AVOptions
++ * @ingroup lavu_data
++ * @{
++ * AVOptions provide a generic system to declare options on arbitrary structs
++ * ("objects"). An option can have a help text, a type and a range of possible
++ * values. Options may then be enumerated, read and written to.
++ *
++ * There are two modes of access to members of AVOption and its child structs.
++ * One is called 'native access', and refers to access from the code that
++ * declares the AVOption in question.  The other is 'foreign access', and refers
++ * to access from other code.
++ *
++ * Certain struct members in this header are documented as 'native access only'
++ * or similar - it means that only the code that declared the AVOption in
++ * question is allowed to access the field. This allows us to extend the
++ * semantics of those fields without breaking API compatibility.
++ *
++ * @section avoptions_scope Scope of AVOptions
++ *
++ * AVOptions is designed to support any set of multimedia configuration options
++ * that can be defined at compile-time.  Although it is mainly used to expose
++ * FFmpeg options, you are welcome to adapt it to your own use case.
++ *
++ * No single approach can ever fully solve the problem of configuration,
++ * but please submit a patch if you believe you have found a problem
++ * that is best solved by extending AVOptions.
++ *
++ * @section avoptions_implement Implementing AVOptions
++ * This section describes how to add AVOptions capabilities to a struct.
++ *
++ * All AVOptions-related information is stored in an AVClass. Therefore
++ * the first member of the struct should be a pointer to an AVClass describing it.
++ * The option field of the AVClass must be set to a NULL-terminated static array
++ * of AVOptions. Each AVOption must have a non-empty name, a type, a default
++ * value and for number-type AVOptions also a range of allowed values. It must
++ * also declare an offset in bytes from the start of the struct, where the field
++ * associated with this AVOption is located. Other fields in the AVOption struct
++ * should also be set when applicable, but are not required.
++ *
++ * The following example illustrates an AVOptions-enabled struct:
++ * @code
++ * typedef struct test_struct {
++ *     const AVClass *class;
++ *     int      int_opt;
++ *     char    *str_opt;
++ *     uint8_t *bin_opt;
++ *     int      bin_len;
++ * } test_struct;
++ *
++ * static const AVOption test_options[] = {
++ *   { "test_int", "This is a test option of int type.", offsetof(test_struct, int_opt),
++ *     AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX },
++ *   { "test_str", "This is a test option of string type.", offsetof(test_struct, str_opt),
++ *     AV_OPT_TYPE_STRING },
++ *   { "test_bin", "This is a test option of binary type.", offsetof(test_struct, bin_opt),
++ *     AV_OPT_TYPE_BINARY },
++ *   { NULL },
++ * };
++ *
++ * static const AVClass test_class = {
++ *     .class_name = "test class",
++ *     .item_name  = av_default_item_name,
++ *     .option     = test_options,
++ *     .version    = LIBAVUTIL_VERSION_INT,
++ * };
++ * @endcode
++ *
++ * Next, when allocating your struct, you must ensure that the AVClass pointer
++ * is set to the correct value. Then, av_opt_set_defaults() can be called to
++ * initialize defaults. After that the struct is ready to be used with the
++ * AVOptions API.
++ *
++ * When cleaning up, you may use the av_opt_free() function to automatically
++ * free all the allocated string and binary options.
++ *
++ * Continuing with the above example:
++ *
++ * @code
++ * test_struct *alloc_test_struct(void)
++ * {
++ *     test_struct *ret = av_mallocz(sizeof(*ret));
++ *     ret->class = &test_class;
++ *     av_opt_set_defaults(ret);
++ *     return ret;
++ * }
++ * void free_test_struct(test_struct **foo)
++ * {
++ *     av_opt_free(*foo);
++ *     av_freep(foo);
++ * }
++ * @endcode
++ *
++ * @subsection avoptions_implement_nesting Nesting
++ *      It may happen that an AVOptions-enabled struct contains another
++ *      AVOptions-enabled struct as a member (e.g. AVCodecContext in
++ *      libavcodec exports generic options, while its priv_data field exports
++ *      codec-specific options). In such a case, it is possible to set up the
++ *      parent struct to export a child's options. To do that, simply
++ *      implement AVClass.child_next() and AVClass.child_class_iterate() in the
++ *      parent struct's AVClass.
++ *      Assuming that the test_struct from above now also contains a
++ *      child_struct field:
++ *
++ *      @code
++ *      typedef struct child_struct {
++ *          AVClass *class;
++ *          int flags_opt;
++ *      } child_struct;
++ *      static const AVOption child_opts[] = {
++ *          { "test_flags", "This is a test option of flags type.",
++ *            offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX },
++ *          { NULL },
++ *      };
++ *      static const AVClass child_class = {
++ *          .class_name = "child class",
++ *          .item_name  = av_default_item_name,
++ *          .option     = child_opts,
++ *          .version    = LIBAVUTIL_VERSION_INT,
++ *      };
++ *
++ *      void *child_next(void *obj, void *prev)
++ *      {
++ *          test_struct *t = obj;
++ *          if (!prev && t->child_struct)
++ *              return t->child_struct;
++ *          return NULL
++ *      }
++ *      const AVClass child_class_iterate(void **iter)
++ *      {
++ *          const AVClass *c = *iter ? NULL : &child_class;
++ *          *iter = (void*)(uintptr_t)c;
++ *          return c;
++ *      }
++ *      @endcode
++ *      Putting child_next() and child_class_iterate() as defined above into
++ *      test_class will now make child_struct's options accessible through
++ *      test_struct (again, proper setup as described above needs to be done on
++ *      child_struct right after it is created).
++ *
++ *      From the above example it might not be clear why both child_next()
++ *      and child_class_iterate() are needed. The distinction is that child_next()
++ *      iterates over actually existing objects, while child_class_iterate()
++ *      iterates over all possible child classes. E.g. if an AVCodecContext
++ *      was initialized to use a codec which has private options, then its
++ *      child_next() will return AVCodecContext.priv_data and finish
++ *      iterating. OTOH child_class_iterate() on AVCodecContext.av_class will
++ *      iterate over all available codecs with private options.
++ *
++ * @subsection avoptions_implement_named_constants Named constants
++ *      It is possible to create named constants for options. Simply set the unit
++ *      field of the option the constants should apply to a string and
++ *      create the constants themselves as options of type AV_OPT_TYPE_CONST
++ *      with their unit field set to the same string.
++ *      Their default_val field should contain the value of the named
++ *      constant.
++ *      For example, to add some named constants for the test_flags option
++ *      above, put the following into the child_opts array:
++ *      @code
++ *      { "test_flags", "This is a test option of flags type.",
++ *        offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, "test_unit" },
++ *      { "flag1", "This is a flag with value 16", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, "test_unit" },
++ *      @endcode
++ *
++ * @section avoptions_use Using AVOptions
++ * This section deals with accessing options in an AVOptions-enabled struct.
++ * Such structs in FFmpeg are e.g. AVCodecContext in libavcodec or
++ * AVFormatContext in libavformat.
++ *
++ * @subsection avoptions_use_examine Examining AVOptions
++ * The basic functions for examining options are av_opt_next(), which iterates
++ * over all options defined for one object, and av_opt_find(), which searches
++ * for an option with the given name.
++ *
++ * The situation is more complicated with nesting. An AVOptions-enabled struct
++ * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag
++ * to av_opt_find() will make the function search children recursively.
++ *
++ * For enumerating there are basically two cases. The first is when you want to
++ * get all options that may potentially exist on the struct and its children
++ * (e.g.  when constructing documentation). In that case you should call
++ * av_opt_child_class_iterate() recursively on the parent struct's AVClass.  The
++ * second case is when you have an already initialized struct with all its
++ * children and you want to get all options that can be actually written or read
++ * from it. In that case you should call av_opt_child_next() recursively (and
++ * av_opt_next() on each result).
++ *
++ * @subsection avoptions_use_get_set Reading and writing AVOptions
++ * When setting options, you often have a string read directly from the
++ * user. In such a case, simply passing it to av_opt_set() is enough. For
++ * non-string type options, av_opt_set() will parse the string according to the
++ * option type.
++ *
++ * Similarly av_opt_get() will read any option type and convert it to a string
++ * which will be returned. Do not forget that the string is allocated, so you
++ * have to free it with av_free().
++ *
++ * In some cases it may be more convenient to put all options into an
++ * AVDictionary and call av_opt_set_dict() on it. A specific case of this
++ * are the format/codec open functions in lavf/lavc which take a dictionary
++ * filled with option as a parameter. This makes it possible to set some options
++ * that cannot be set otherwise, since e.g. the input file format is not known
++ * before the file is actually opened.
++ */
++
++/**
++ * An option type determines:
++ * - for native access, the underlying C type of the field that an AVOption
++ *   refers to;
++ * - for foreign access, the semantics of accessing the option through this API,
++ *   e.g. which av_opt_get_*() and av_opt_set_*() functions can be called, or
++ *   what format will av_opt_get()/av_opt_set() expect/produce.
++ */
++enum AVOptionType{
++    /**
++     * Underlying C type is unsigned int.
++     */
++    AV_OPT_TYPE_FLAGS = 1,
++    /**
++     * Underlying C type is int.
++     */
++    AV_OPT_TYPE_INT,
++    /**
++     * Underlying C type is int64_t.
++     */
++    AV_OPT_TYPE_INT64,
++    /**
++     * Underlying C type is double.
++     */
++    AV_OPT_TYPE_DOUBLE,
++    /**
++     * Underlying C type is float.
++     */
++    AV_OPT_TYPE_FLOAT,
++    /**
++     * Underlying C type is a uint8_t* that is either NULL or points to a C
++     * string allocated with the av_malloc() family of functions.
++     */
++    AV_OPT_TYPE_STRING,
++    /**
++     * Underlying C type is AVRational.
++     */
++    AV_OPT_TYPE_RATIONAL,
++    /**
++     * Underlying C type is a uint8_t* that is either NULL or points to an array
++     * allocated with the av_malloc() family of functions. The pointer is
++     * immediately followed by an int containing the array length in bytes.
++     */
++    AV_OPT_TYPE_BINARY,
++    /**
++     * Underlying C type is AVDictionary*.
++     */
++    AV_OPT_TYPE_DICT,
++    /**
++     * Underlying C type is uint64_t.
++     */
++    AV_OPT_TYPE_UINT64,
++    /**
++     * Special option type for declaring named constants. Does not correspond to
++     * an actual field in the object, offset must be 0.
++     */
++    AV_OPT_TYPE_CONST,
++    /**
++     * Underlying C type is two consecutive integers.
++     */
++    AV_OPT_TYPE_IMAGE_SIZE,
++    /**
++     * Underlying C type is enum AVPixelFormat.
++     */
++    AV_OPT_TYPE_PIXEL_FMT,
++    /**
++     * Underlying C type is enum AVSampleFormat.
++     */
++    AV_OPT_TYPE_SAMPLE_FMT,
++    /**
++     * Underlying C type is AVRational.
++     */
++    AV_OPT_TYPE_VIDEO_RATE,
++    /**
++     * Underlying C type is int64_t.
++     */
++    AV_OPT_TYPE_DURATION,
++    /**
++     * Underlying C type is uint8_t[4].
++     */
++    AV_OPT_TYPE_COLOR,
++    /**
++     * Underlying C type is int.
++     */
++    AV_OPT_TYPE_BOOL,
++    /**
++     * Underlying C type is AVChannelLayout.
++     */
++    AV_OPT_TYPE_CHLAYOUT,
++    /**
++     * Underlying C type is unsigned int.
++     */
++    AV_OPT_TYPE_UINT,
++
++    /**
++     * May be combined with another regular option type to declare an array
++     * option.
++     *
++     * For array options, @ref AVOption.offset should refer to a pointer
++     * corresponding to the option type. The pointer should be immediately
++     * followed by an unsigned int that will store the number of elements in the
++     * array.
++     */
++    AV_OPT_TYPE_FLAG_ARRAY = (1 << 16),
++};
++
++/**
++ * A generic parameter which can be set by the user for muxing or encoding.
++ */
++#define AV_OPT_FLAG_ENCODING_PARAM  (1 << 0)
++/**
++ * A generic parameter which can be set by the user for demuxing or decoding.
++ */
++#define AV_OPT_FLAG_DECODING_PARAM  (1 << 1)
++#define AV_OPT_FLAG_AUDIO_PARAM     (1 << 3)
++#define AV_OPT_FLAG_VIDEO_PARAM     (1 << 4)
++#define AV_OPT_FLAG_SUBTITLE_PARAM  (1 << 5)
++/**
++ * The option is intended for exporting values to the caller.
++ */
++#define AV_OPT_FLAG_EXPORT          (1 << 6)
++/**
++ * The option may not be set through the AVOptions API, only read.
++ * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set.
++ */
++#define AV_OPT_FLAG_READONLY        (1 << 7)
++/**
++ * A generic parameter which can be set by the user for bit stream filtering.
++ */
++#define AV_OPT_FLAG_BSF_PARAM       (1 << 8)
++
++/**
++ * A generic parameter which can be set by the user at runtime.
++ */
++#define AV_OPT_FLAG_RUNTIME_PARAM   (1 << 15)
++/**
++ * A generic parameter which can be set by the user for filtering.
++ */
++#define AV_OPT_FLAG_FILTERING_PARAM (1 << 16)
++/**
++ * Set if option is deprecated, users should refer to AVOption.help text for
++ * more information.
++ */
++#define AV_OPT_FLAG_DEPRECATED      (1 << 17)
++/**
++ * Set if option constants can also reside in child objects.
++ */
++#define AV_OPT_FLAG_CHILD_CONSTS    (1 << 18)
++
++/**
++ * May be set as default_val for AV_OPT_TYPE_FLAG_ARRAY options.
++ */
++typedef struct AVOptionArrayDef {
++    /**
++     * Native access only.
++     *
++     * Default value of the option, as would be serialized by av_opt_get() (i.e.
++     * using the value of sep as the separator).
++     */
++    const char         *def;
++
++    /**
++     * Minimum number of elements in the array. When this field is non-zero, def
++     * must be non-NULL and contain at least this number of elements.
++     */
++    unsigned            size_min;
++    /**
++     * Maximum number of elements in the array, 0 when unlimited.
++     */
++    unsigned            size_max;
++
++    /**
++     * Separator between array elements in string representations of this
++     * option, used by av_opt_set() and av_opt_get(). It must be a printable
++     * ASCII character, excluding alphanumeric and the backslash. A comma is
++     * used when sep=0.
++     *
++     * The separator and the backslash must be backslash-escaped in order to
++     * appear in string representations of the option value.
++     */
++    char                sep;
++} AVOptionArrayDef;
++
++/**
++ * AVOption
++ */
++typedef struct AVOption {
++    const char *name;
++
++    /**
++     * short English help text
++     * @todo What about other languages?
++     */
++    const char *help;
++
++    /**
++     * Native access only.
++     *
++     * The offset relative to the context structure where the option
++     * value is stored. It should be 0 for named constants.
++     */
++    int offset;
++    enum AVOptionType type;
++
++    /**
++     * Native access only, except when documented otherwise.
++     * the default value for scalar options
++     */
++    union {
++        int64_t i64;
++        double dbl;
++        const char *str;
++        /* TODO those are unused now */
++        AVRational q;
++
++        /**
++         * Used for AV_OPT_TYPE_FLAG_ARRAY options. May be NULL.
++         *
++         * Foreign access to some members allowed, as noted in AVOptionArrayDef
++         * documentation.
++         */
++        const AVOptionArrayDef *arr;
++    } default_val;
++    double min;                 ///< minimum valid value for the option
++    double max;                 ///< maximum valid value for the option
++
++    /**
++     * A combination of AV_OPT_FLAG_*.
++     */
++    int flags;
++
++    /**
++     * The logical unit to which the option belongs. Non-constant
++     * options and corresponding named constants share the same
++     * unit. May be NULL.
++     */
++    const char *unit;
++} AVOption;
++
++/**
++ * A single allowed range of values, or a single allowed value.
++ */
++typedef struct AVOptionRange {
++    const char *str;
++    /**
++     * Value range.
++     * For string ranges this represents the min/max length.
++     * For dimensions this represents the min/max pixel count or width/height in multi-component case.
++     */
++    double value_min, value_max;
++    /**
++     * Value's component range.
++     * For string this represents the unicode range for chars, 0-127 limits to ASCII.
++     */
++    double component_min, component_max;
++    /**
++     * Range flag.
++     * If set to 1 the struct encodes a range, if set to 0 a single value.
++     */
++    int is_range;
++} AVOptionRange;
++
++/**
++ * List of AVOptionRange structs.
++ */
++typedef struct AVOptionRanges {
++    /**
++     * Array of option ranges.
++     *
++     * Most of option types use just one component.
++     * Following describes multi-component option types:
++     *
++     * AV_OPT_TYPE_IMAGE_SIZE:
++     * component index 0: range of pixel count (width * height).
++     * component index 1: range of width.
++     * component index 2: range of height.
++     *
++     * @note To obtain multi-component version of this structure, user must
++     *       provide AV_OPT_MULTI_COMPONENT_RANGE to av_opt_query_ranges or
++     *       av_opt_query_ranges_default function.
++     *
++     * Multi-component range can be read as in following example:
++     *
++     * @code
++     * int range_index, component_index;
++     * AVOptionRanges *ranges;
++     * AVOptionRange *range[3]; //may require more than 3 in the future.
++     * av_opt_query_ranges(&ranges, obj, key, AV_OPT_MULTI_COMPONENT_RANGE);
++     * for (range_index = 0; range_index < ranges->nb_ranges; range_index++) {
++     *     for (component_index = 0; component_index < ranges->nb_components; component_index++)
++     *         range[component_index] = ranges->range[ranges->nb_ranges * component_index + range_index];
++     *     //do something with range here.
++     * }
++     * av_opt_freep_ranges(&ranges);
++     * @endcode
++     */
++    AVOptionRange **range;
++    /**
++     * Number of ranges per component.
++     */
++    int nb_ranges;
++    /**
++     * Number of components.
++     */
++    int nb_components;
++} AVOptionRanges;
++
++/**
++ * @defgroup opt_mng AVOption (un)initialization and inspection.
++ * @{
++ */
++
++/**
++ * Set the values of all AVOption fields to their default values.
++ *
++ * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass)
++ */
++void av_opt_set_defaults(void *s);
++
++/**
++ * Set the values of all AVOption fields to their default values. Only these
++ * AVOption fields for which (opt->flags & mask) == flags will have their
++ * default applied to s.
++ *
++ * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass)
++ * @param mask combination of AV_OPT_FLAG_*
++ * @param flags combination of AV_OPT_FLAG_*
++ */
++void av_opt_set_defaults2(void *s, int mask, int flags);
++
++/**
++ * Free all allocated objects in obj.
++ */
++void av_opt_free(void *obj);
++
++/**
++ * Iterate over all AVOptions belonging to obj.
++ *
++ * @param obj an AVOptions-enabled struct or a double pointer to an
++ *            AVClass describing it.
++ * @param prev result of the previous call to av_opt_next() on this object
++ *             or NULL
++ * @return next AVOption or NULL
++ */
++const AVOption *av_opt_next(const void *obj, const AVOption *prev);
++
++/**
++ * Iterate over AVOptions-enabled children of obj.
++ *
++ * @param prev result of a previous call to this function or NULL
++ * @return next AVOptions-enabled child or NULL
++ */
++void *av_opt_child_next(void *obj, void *prev);
++
++/**
++ * Iterate over potential AVOptions-enabled children of parent.
++ *
++ * @param iter a pointer where iteration state is stored.
++ * @return AVClass corresponding to next potential child or NULL
++ */
++const AVClass *av_opt_child_class_iterate(const AVClass *parent, void **iter);
++
++#define AV_OPT_SEARCH_CHILDREN   (1 << 0) /**< Search in possible children of the
++                                               given object first. */
++/**
++ *  The obj passed to av_opt_find() is fake -- only a double pointer to AVClass
++ *  instead of a required pointer to a struct containing AVClass. This is
++ *  useful for searching for options without needing to allocate the corresponding
++ *  object.
++ */
++#define AV_OPT_SEARCH_FAKE_OBJ   (1 << 1)
++
++/**
++ *  In av_opt_get, return NULL if the option has a pointer type and is set to NULL,
++ *  rather than returning an empty string.
++ */
++#define AV_OPT_ALLOW_NULL (1 << 2)
++
++/**
++ * May be used with av_opt_set_array() to signal that new elements should
++ * replace the existing ones in the indicated range.
++ */
++#define AV_OPT_ARRAY_REPLACE (1 << 3)
++
++/**
++ *  Allows av_opt_query_ranges and av_opt_query_ranges_default to return more than
++ *  one component for certain option types.
++ *  @see AVOptionRanges for details.
++ */
++#define AV_OPT_MULTI_COMPONENT_RANGE (1 << 12)
++
++/**
++ * Look for an option in an object. Consider only options which
++ * have all the specified flags set.
++ *
++ * @param[in] obj A pointer to a struct whose first element is a
++ *                pointer to an AVClass.
++ *                Alternatively a double pointer to an AVClass, if
++ *                AV_OPT_SEARCH_FAKE_OBJ search flag is set.
++ * @param[in] name The name of the option to look for.
++ * @param[in] unit When searching for named constants, name of the unit
++ *                 it belongs to.
++ * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).
++ * @param search_flags A combination of AV_OPT_SEARCH_*.
++ *
++ * @return A pointer to the option found, or NULL if no option
++ *         was found.
++ *
++ * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable
++ * directly with av_opt_set(). Use special calls which take an options
++ * AVDictionary (e.g. avformat_open_input()) to set options found with this
++ * flag.
++ */
++const AVOption *av_opt_find(void *obj, const char *name, const char *unit,
++                            int opt_flags, int search_flags);
++
++/**
++ * Look for an option in an object. Consider only options which
++ * have all the specified flags set.
++ *
++ * @param[in] obj A pointer to a struct whose first element is a
++ *                pointer to an AVClass.
++ *                Alternatively a double pointer to an AVClass, if
++ *                AV_OPT_SEARCH_FAKE_OBJ search flag is set.
++ * @param[in] name The name of the option to look for.
++ * @param[in] unit When searching for named constants, name of the unit
++ *                 it belongs to.
++ * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).
++ * @param search_flags A combination of AV_OPT_SEARCH_*.
++ * @param[out] target_obj if non-NULL, an object to which the option belongs will be
++ * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present
++ * in search_flags. This parameter is ignored if search_flags contain
++ * AV_OPT_SEARCH_FAKE_OBJ.
++ *
++ * @return A pointer to the option found, or NULL if no option
++ *         was found.
++ */
++const AVOption *av_opt_find2(void *obj, const char *name, const char *unit,
++                             int opt_flags, int search_flags, void **target_obj);
++
++/**
++ * Show the obj options.
++ *
++ * @param req_flags requested flags for the options to show. Show only the
++ * options for which it is opt->flags & req_flags.
++ * @param rej_flags rejected flags for the options to show. Show only the
++ * options for which it is !(opt->flags & req_flags).
++ * @param av_log_obj log context to use for showing the options
++ */
++int av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags);
++
++/**
++ * Extract a key-value pair from the beginning of a string.
++ *
++ * @param ropts        pointer to the options string, will be updated to
++ *                     point to the rest of the string (one of the pairs_sep
++ *                     or the final NUL)
++ * @param key_val_sep  a 0-terminated list of characters used to separate
++ *                     key from value, for example '='
++ * @param pairs_sep    a 0-terminated list of characters used to separate
++ *                     two pairs from each other, for example ':' or ','
++ * @param flags        flags; see the AV_OPT_FLAG_* values below
++ * @param rkey         parsed key; must be freed using av_free()
++ * @param rval         parsed value; must be freed using av_free()
++ *
++ * @return  >=0 for success, or a negative value corresponding to an
++ *          AVERROR code in case of error; in particular:
++ *          AVERROR(EINVAL) if no key is present
++ *
++ */
++int av_opt_get_key_value(const char **ropts,
++                         const char *key_val_sep, const char *pairs_sep,
++                         unsigned flags,
++                         char **rkey, char **rval);
++
++enum {
++
++    /**
++     * Accept to parse a value without a key; the key will then be returned
++     * as NULL.
++     */
++    AV_OPT_FLAG_IMPLICIT_KEY = 1,
++};
++
++/**
++ * @}
++ */
++
++/**
++ * @defgroup opt_write Setting and modifying option values
++ * @{
++ */
++
++/**
++ * Parse the key/value pairs list in opts. For each key/value pair
++ * found, stores the value in the field in ctx that is named like the
++ * key. ctx must be an AVClass context, storing is done using
++ * AVOptions.
++ *
++ * @param opts options string to parse, may be NULL
++ * @param key_val_sep a 0-terminated list of characters used to
++ * separate key from value
++ * @param pairs_sep a 0-terminated list of characters used to separate
++ * two pairs from each other
++ * @return the number of successfully set key/value pairs, or a negative
++ * value corresponding to an AVERROR code in case of error:
++ * AVERROR(EINVAL) if opts cannot be parsed,
++ * the error code issued by av_opt_set() if a key/value pair
++ * cannot be set
++ */
++int av_set_options_string(void *ctx, const char *opts,
++                          const char *key_val_sep, const char *pairs_sep);
++
++/**
++ * Parse the key-value pairs list in opts. For each key=value pair found,
++ * set the value of the corresponding option in ctx.
++ *
++ * @param ctx          the AVClass object to set options on
++ * @param opts         the options string, key-value pairs separated by a
++ *                     delimiter
++ * @param shorthand    a NULL-terminated array of options names for shorthand
++ *                     notation: if the first field in opts has no key part,
++ *                     the key is taken from the first element of shorthand;
++ *                     then again for the second, etc., until either opts is
++ *                     finished, shorthand is finished or a named option is
++ *                     found; after that, all options must be named
++ * @param key_val_sep  a 0-terminated list of characters used to separate
++ *                     key from value, for example '='
++ * @param pairs_sep    a 0-terminated list of characters used to separate
++ *                     two pairs from each other, for example ':' or ','
++ * @return  the number of successfully set key=value pairs, or a negative
++ *          value corresponding to an AVERROR code in case of error:
++ *          AVERROR(EINVAL) if opts cannot be parsed,
++ *          the error code issued by av_set_string3() if a key/value pair
++ *          cannot be set
++ *
++ * Options names must use only the following characters: a-z A-Z 0-9 - . / _
++ * Separators must use characters distinct from option names and from each
++ * other.
++ */
++int av_opt_set_from_string(void *ctx, const char *opts,
++                           const char *const *shorthand,
++                           const char *key_val_sep, const char *pairs_sep);
++
++/**
++ * Set all the options from a given dictionary on an object.
++ *
++ * @param obj a struct whose first element is a pointer to AVClass
++ * @param options options to process. This dictionary will be freed and replaced
++ *                by a new one containing all options not found in obj.
++ *                Of course this new dictionary needs to be freed by caller
++ *                with av_dict_free().
++ *
++ * @return 0 on success, a negative AVERROR if some option was found in obj,
++ *         but could not be set.
++ *
++ * @see av_dict_copy()
++ */
++int av_opt_set_dict(void *obj, struct AVDictionary **options);
++
++
++/**
++ * Set all the options from a given dictionary on an object.
++ *
++ * @param obj a struct whose first element is a pointer to AVClass
++ * @param options options to process. This dictionary will be freed and replaced
++ *                by a new one containing all options not found in obj.
++ *                Of course this new dictionary needs to be freed by caller
++ *                with av_dict_free().
++ * @param search_flags A combination of AV_OPT_SEARCH_*.
++ *
++ * @return 0 on success, a negative AVERROR if some option was found in obj,
++ *         but could not be set.
++ *
++ * @see av_dict_copy()
++ */
++int av_opt_set_dict2(void *obj, struct AVDictionary **options, int search_flags);
++
++/**
++ * Copy options from src object into dest object.
++ *
++ * The underlying AVClass of both src and dest must coincide. The guarantee
++ * below does not apply if this is not fulfilled.
++ *
++ * Options that require memory allocation (e.g. string or binary) are malloc'ed in dest object.
++ * Original memory allocated for such options is freed unless both src and dest options points to the same memory.
++ *
++ * Even on error it is guaranteed that allocated options from src and dest
++ * no longer alias each other afterwards; in particular calling av_opt_free()
++ * on both src and dest is safe afterwards if dest has been memdup'ed from src.
++ *
++ * @param dest Object to copy from
++ * @param src  Object to copy into
++ * @return 0 on success, negative on error
++ */
++int av_opt_copy(void *dest, const void *src);
++
++/**
++ * @defgroup opt_set_funcs Option setting functions
++ * @{
++ * Those functions set the field of obj with the given name to value.
++ *
++ * @param[in] obj A struct whose first element is a pointer to an AVClass.
++ * @param[in] name the name of the field to set
++ * @param[in] val The value to set. In case of av_opt_set() if the field is not
++ * of a string type, then the given string is parsed.
++ * SI postfixes and some named scalars are supported.
++ * If the field is of a numeric type, it has to be a numeric or named
++ * scalar. Behavior with more than one scalar and +- infix operators
++ * is undefined.
++ * If the field is of a flags type, it has to be a sequence of numeric
++ * scalars or named flags separated by '+' or '-'. Prefixing a flag
++ * with '+' causes it to be set without affecting the other flags;
++ * similarly, '-' unsets a flag.
++ * If the field is of a dictionary type, it has to be a ':' separated list of
++ * key=value parameters. Values containing ':' special characters must be
++ * escaped.
++ * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
++ * is passed here, then the option may be set on a child of obj.
++ *
++ * @return 0 if the value has been set, or an AVERROR code in case of
++ * error:
++ * AVERROR_OPTION_NOT_FOUND if no matching option exists
++ * AVERROR(ERANGE) if the value is out of range
++ * AVERROR(EINVAL) if the value is not valid
++ */
++int av_opt_set         (void *obj, const char *name, const char *val, int search_flags);
++int av_opt_set_int     (void *obj, const char *name, int64_t     val, int search_flags);
++int av_opt_set_double  (void *obj, const char *name, double      val, int search_flags);
++int av_opt_set_q       (void *obj, const char *name, AVRational  val, int search_flags);
++int av_opt_set_bin     (void *obj, const char *name, const uint8_t *val, int size, int search_flags);
++int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags);
++int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags);
++int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags);
++int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags);
++/**
++ * @note Any old chlayout present is discarded and replaced with a copy of the new one. The
++ * caller still owns layout and is responsible for uninitializing it.
++ */
++int av_opt_set_chlayout(void *obj, const char *name, const AVChannelLayout *layout, int search_flags);
++/**
++ * @note Any old dictionary present is discarded and replaced with a copy of the new one. The
++ * caller still owns val is and responsible for freeing it.
++ */
++int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags);
++
++/**
++ * Add, replace, or remove elements for an array option. Which of these
++ * operations is performed depends on the values of val and search_flags.
++ *
++ * @param start_elem Index of the first array element to modify; must not be
++ *                   larger than array size as returned by
++ *                   av_opt_get_array_size().
++ * @param nb_elems number of array elements to modify; when val is NULL,
++ *                 start_elem+nb_elems must not be larger than array size as
++ *                 returned by av_opt_get_array_size()
++ *
++ * @param val_type Option type corresponding to the type of val, ignored when val is
++ *                 NULL.
++ *
++ *                 The effect of this function will will be as if av_opt_setX()
++ *                 was called for each element, where X is specified by type.
++ *                 E.g. AV_OPT_TYPE_STRING corresponds to av_opt_set().
++ *
++ *                 Typically this should be the same as the scalarized type of
++ *                 the AVOption being set, but certain conversions are also
++ *                 possible - the same as those done by the corresponding
++ *                 av_opt_set*() function. E.g. any option type can be set from
++ *                 a string, numeric types can be set from int64, double, or
++ *                 rational, etc.
++ *
++ * @param val Array with nb_elems elements or NULL.
++ *
++ *            When NULL, nb_elems array elements starting at start_elem are
++ *            removed from the array. Any array elements remaining at the end
++ *            are shifted by nb_elems towards the first element in order to keep
++ *            the array contiguous.
++ *
++ *            Otherwise (val is non-NULL), the type of val must match the
++ *            underlying C type as documented for val_type.
++ *
++ *            When AV_OPT_ARRAY_REPLACE is not set in search_flags, the array is
++ *            enlarged by nb_elems, and the contents of val are inserted at
++ *            start_elem. Previously existing array elements from start_elem
++ *            onwards (if present) are shifted by nb_elems away from the first
++ *            element in order to make space for the new elements.
++ *
++ *            When AV_OPT_ARRAY_REPLACE is set in search_flags, the contents
++ *            of val replace existing array elements from start_elem to
++ *            start_elem+nb_elems (if present). New array size is
++ *            max(start_elem + nb_elems, old array size).
++ */
++int av_opt_set_array(void *obj, const char *name, int search_flags,
++                     unsigned int start_elem, unsigned int nb_elems,
++                     enum AVOptionType val_type, const void *val);
++
++/**
++ * @}
++ * @}
++ */
++
++/**
++ * @defgroup opt_read Reading option values
++ * @{
++ */
++
++/**
++ * @defgroup opt_get_funcs Option getting functions
++ * @{
++ * Those functions get a value of the option with the given name from an object.
++ *
++ * @param[in] obj a struct whose first element is a pointer to an AVClass.
++ * @param[in] name name of the option to get.
++ * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
++ * is passed here, then the option may be found in a child of obj.
++ * @param[out] out_val value of the option will be written here
++ * @return >=0 on success, a negative error code otherwise
++ */
++/**
++ * @note the returned string will be av_malloc()ed and must be av_free()ed by the caller
++ *
++ * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the
++ * option is of type AV_OPT_TYPE_STRING, AV_OPT_TYPE_BINARY or AV_OPT_TYPE_DICT
++ * and is set to NULL, *out_val will be set to NULL instead of an allocated
++ * empty string.
++ */
++int av_opt_get         (void *obj, const char *name, int search_flags, uint8_t   **out_val);
++int av_opt_get_int     (void *obj, const char *name, int search_flags, int64_t    *out_val);
++int av_opt_get_double  (void *obj, const char *name, int search_flags, double     *out_val);
++int av_opt_get_q       (void *obj, const char *name, int search_flags, AVRational *out_val);
++int av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out);
++int av_opt_get_pixel_fmt (void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt);
++int av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt);
++int av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val);
++/**
++ * @param[out] layout The returned layout is a copy of the actual value and must
++ * be freed with av_channel_layout_uninit() by the caller
++ */
++int av_opt_get_chlayout(void *obj, const char *name, int search_flags, AVChannelLayout *layout);
++/**
++ * @param[out] out_val The returned dictionary is a copy of the actual value and must
++ * be freed with av_dict_free() by the caller
++ */
++int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val);
++
++/**
++ * For an array-type option, get the number of elements in the array.
++ */
++int av_opt_get_array_size(void *obj, const char *name, int search_flags,
++                          unsigned int *out_val);
++
++/**
++ * For an array-type option, retrieve the values of one or more array elements.
++ *
++ * @param start_elem index of the first array element to retrieve
++ * @param nb_elems number of array elements to retrieve; start_elem+nb_elems
++ *                 must not be larger than array size as returned by
++ *                 av_opt_get_array_size()
++ *
++ * @param out_type Option type corresponding to the desired output.
++ *
++ *                 The array elements produced by this function will
++ *                 will be as if av_opt_getX() was called for each element,
++ *                 where X is specified by out_type. E.g. AV_OPT_TYPE_STRING
++ *                 corresponds to av_opt_get().
++ *
++ *                 Typically this should be the same as the scalarized type of
++ *                 the AVOption being retrieved, but certain conversions are
++ *                 also possible - the same as those done by the corresponding
++ *                 av_opt_get*() function. E.g. any option type can be retrieved
++ *                 as a string, numeric types can be retrieved as int64, double,
++ *                 or rational, etc.
++ *
++ * @param out_val  Array with nb_elems members into which the output will be
++ *                 written. The array type must match the underlying C type as
++ *                 documented for out_type, and be zeroed on entry to this
++ *                 function.
++ *
++ *                 For dynamically allocated types (strings, binary, dicts,
++ *                 etc.), the result is owned and freed by the caller.
++ */
++int av_opt_get_array(void *obj, const char *name, int search_flags,
++                     unsigned int start_elem, unsigned int nb_elems,
++                     enum AVOptionType out_type, void *out_val);
++/**
++ * @}
++ */
++
++/**
++ * @defgroup opt_eval_funcs Evaluating option strings
++ * @{
++ * This group of functions can be used to evaluate option strings
++ * and get numbers out of them. They do the same thing as av_opt_set(),
++ * except the result is written into the caller-supplied pointer.
++ *
++ * @param obj a struct whose first element is a pointer to AVClass.
++ * @param o an option for which the string is to be evaluated.
++ * @param val string to be evaluated.
++ * @param *_out value of the string will be written here.
++ *
++ * @return 0 on success, a negative number on failure.
++ */
++int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int        *flags_out);
++int av_opt_eval_int   (void *obj, const AVOption *o, const char *val, int        *int_out);
++int av_opt_eval_uint  (void *obj, const AVOption *o, const char *val, unsigned   *uint_out);
++int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t    *int64_out);
++int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float      *float_out);
++int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double     *double_out);
++int av_opt_eval_q     (void *obj, const AVOption *o, const char *val, AVRational *q_out);
++/**
++ * @}
++ */
++
++/**
++ * Check if given option is set to its default value.
++ *
++ * Options o must belong to the obj. This function must not be called to check child's options state.
++ * @see av_opt_is_set_to_default_by_name().
++ *
++ * @param obj  AVClass object to check option on
++ * @param o    option to be checked
++ * @return     >0 when option is set to its default,
++ *              0 when option is not set its default,
++ *             <0 on error
++ */
++int av_opt_is_set_to_default(void *obj, const AVOption *o);
++
++/**
++ * Check if given option is set to its default value.
++ *
++ * @param obj          AVClass object to check option on
++ * @param name         option name
++ * @param search_flags combination of AV_OPT_SEARCH_*
++ * @return             >0 when option is set to its default,
++ *                     0 when option is not set its default,
++ *                     <0 on error
++ */
++int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags);
++
++/**
++ * Check whether a particular flag is set in a flags field.
++ *
++ * @param field_name the name of the flag field option
++ * @param flag_name the name of the flag to check
++ * @return non-zero if the flag is set, zero if the flag isn't set,
++ *         isn't of the right type, or the flags field doesn't exist.
++ */
++int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name);
++
++#define AV_OPT_SERIALIZE_SKIP_DEFAULTS              0x00000001  ///< Serialize options that are not set to default values only.
++#define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT            0x00000002  ///< Serialize options that exactly match opt_flags only.
++#define AV_OPT_SERIALIZE_SEARCH_CHILDREN            0x00000004  ///< Serialize options in possible children of the given object.
++
++/**
++ * Serialize object's options.
++ *
++ * Create a string containing object's serialized options.
++ * Such string may be passed back to av_opt_set_from_string() in order to restore option values.
++ * A key/value or pairs separator occurring in the serialized value or
++ * name string are escaped through the av_escape() function.
++ *
++ * @param[in]  obj           AVClass object to serialize
++ * @param[in]  opt_flags     serialize options with all the specified flags set (AV_OPT_FLAG)
++ * @param[in]  flags         combination of AV_OPT_SERIALIZE_* flags
++ * @param[out] buffer        Pointer to buffer that will be allocated with string containing serialized options.
++ *                           Buffer must be freed by the caller when is no longer needed.
++ * @param[in]  key_val_sep   character used to separate key from value
++ * @param[in]  pairs_sep     character used to separate two pairs from each other
++ * @return                   >= 0 on success, negative on error
++ * @warning Separators cannot be neither '\\' nor '\0'. They also cannot be the same.
++ */
++int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
++                     const char key_val_sep, const char pairs_sep);
++
++/**
++ * @}
++ */
++
++/**
++ * Free an AVOptionRanges struct and set it to NULL.
++ */
++void av_opt_freep_ranges(AVOptionRanges **ranges);
++
++/**
++ * Get a list of allowed ranges for the given option.
++ *
++ * The returned list may depend on other fields in obj like for example profile.
++ *
++ * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored
++ *              AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance
++ *              AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges
++ *
++ * The result must be freed with av_opt_freep_ranges.
++ *
++ * @return number of components returned on success, a negative error code otherwise
++ */
++int av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags);
++
++/**
++ * Get a default list of allowed ranges for the given option.
++ *
++ * This list is constructed without using the AVClass.query_ranges() callback
++ * and can be used as fallback from within the callback.
++ *
++ * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored
++ *              AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance
++ *              AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges
++ *
++ * The result must be freed with av_opt_free_ranges.
++ *
++ * @return number of components returned on success, a negative error code otherwise
++ */
++int av_opt_query_ranges_default(AVOptionRanges **, void *obj, const char *key, int flags);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_OPT_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/pixdesc.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/pixdesc.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/pixdesc.h.ffmpeg9	2026-09-07 12:23:47.678496890 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/pixdesc.h	2026-09-07 12:23:47.678373044 +0200
+@@ -0,0 +1,450 @@
++/*
++ * pixel format descriptor
++ * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVUTIL_PIXDESC_H
++#define AVUTIL_PIXDESC_H
++
++#include <inttypes.h>
++
++#include "attributes.h"
++#include "pixfmt.h"
++
++typedef struct AVComponentDescriptor {
++    /**
++     * Which of the 4 planes contains the component.
++     */
++    int plane;
++
++    /**
++     * Number of elements between 2 horizontally consecutive pixels.
++     * Elements are bits for bitstream formats, bytes otherwise.
++     */
++    int step;
++
++    /**
++     * Number of elements before the component of the first pixel.
++     * Elements are bits for bitstream formats, bytes otherwise.
++     */
++    int offset;
++
++    /**
++     * Number of least significant bits that must be shifted away
++     * to get the value.
++     */
++    int shift;
++
++    /**
++     * Number of bits in the component.
++     */
++    int depth;
++} AVComponentDescriptor;
++
++/**
++ * Descriptor that unambiguously describes how the bits of a pixel are
++ * stored in the up to 4 data planes of an image. It also stores the
++ * subsampling factors and number of components.
++ *
++ * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV
++ *       and all the YUV variants) AVPixFmtDescriptor just stores how values
++ *       are stored not what these values represent.
++ */
++typedef struct AVPixFmtDescriptor {
++    const char *name;
++    uint8_t nb_components;  ///< The number of components each pixel has, (1-4)
++
++    /**
++     * Amount to shift the luma width right to find the chroma width.
++     * For YV12 this is 1 for example.
++     * chroma_width = AV_CEIL_RSHIFT(luma_width, log2_chroma_w)
++     * The note above is needed to ensure rounding up.
++     * This value only refers to the chroma components.
++     */
++    uint8_t log2_chroma_w;
++
++    /**
++     * Amount to shift the luma height right to find the chroma height.
++     * For YV12 this is 1 for example.
++     * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h)
++     * The note above is needed to ensure rounding up.
++     * This value only refers to the chroma components.
++     */
++    uint8_t log2_chroma_h;
++
++    /**
++     * Combination of AV_PIX_FMT_FLAG_... flags.
++     */
++    uint64_t flags;
++
++    /**
++     * Parameters that describe how pixels are packed.
++     * If the format has 1 or 2 components, then luma is 0.
++     * If the format has 3 or 4 components:
++     *   if the RGB flag is set then 0 is red, 1 is green and 2 is blue;
++     *   otherwise 0 is luma, 1 is chroma-U and 2 is chroma-V.
++     *
++     * If present, the Alpha channel is always the last component.
++     */
++    AVComponentDescriptor comp[4];
++
++    /**
++     * Alternative comma-separated names.
++     */
++    const char *alias;
++} AVPixFmtDescriptor;
++
++/**
++ * Pixel format is big-endian.
++ */
++#define AV_PIX_FMT_FLAG_BE           (1 << 0)
++/**
++ * Pixel format has a palette in data[1], values are indexes in this palette.
++ */
++#define AV_PIX_FMT_FLAG_PAL          (1 << 1)
++/**
++ * All values of a component are bit-wise packed end to end.
++ */
++#define AV_PIX_FMT_FLAG_BITSTREAM    (1 << 2)
++/**
++ * Pixel format is an HW accelerated format.
++ */
++#define AV_PIX_FMT_FLAG_HWACCEL      (1 << 3)
++/**
++ * At least one pixel component is not in the first data plane.
++ */
++#define AV_PIX_FMT_FLAG_PLANAR       (1 << 4)
++/**
++ * The pixel format contains RGB-like data (as opposed to YUV/grayscale).
++ */
++#define AV_PIX_FMT_FLAG_RGB          (1 << 5)
++
++/**
++ * The pixel format has an alpha channel. This is set on all formats that
++ * support alpha in some way, including AV_PIX_FMT_PAL8. The alpha is always
++ * straight, never pre-multiplied.
++ *
++ * If a codec or a filter does not support alpha, it should set all alpha to
++ * opaque, or use the equivalent pixel formats without alpha component, e.g.
++ * AV_PIX_FMT_RGB0 (or AV_PIX_FMT_RGB24 etc.) instead of AV_PIX_FMT_RGBA.
++ */
++#define AV_PIX_FMT_FLAG_ALPHA        (1 << 7)
++
++/**
++ * The pixel format is following a Bayer pattern
++ */
++#define AV_PIX_FMT_FLAG_BAYER        (1 << 8)
++
++/**
++ * The pixel format contains IEEE-754 floating point values. Precision (double,
++ * single, or half) should be determined by the pixel size (64, 32, or 16 bits).
++ */
++#define AV_PIX_FMT_FLAG_FLOAT        (1 << 9)
++
++/**
++ * The pixel format contains XYZ-like data (as opposed to YUV/RGB/grayscale).
++ */
++#define AV_PIX_FMT_FLAG_XYZ          (1 << 10)
++
++/**
++ * Return the number of bits per pixel used by the pixel format
++ * described by pixdesc. Note that this is not the same as the number
++ * of bits per sample.
++ *
++ * The returned number of bits refers to the number of bits actually
++ * used for storing the pixel information, that is padding bits are
++ * not counted.
++ */
++int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc);
++
++/**
++ * Return the number of bits per pixel for the pixel format
++ * described by pixdesc, including any padding or unused bits.
++ */
++int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc);
++
++/**
++ * @return a pixel format descriptor for provided pixel format or NULL if
++ * this pixel format is unknown.
++ */
++const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt);
++
++/**
++ * Iterate over all pixel format descriptors known to libavutil.
++ *
++ * @param prev previous descriptor. NULL to get the first descriptor.
++ *
++ * @return next descriptor or NULL after the last descriptor
++ */
++const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev);
++
++/**
++ * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc
++ * is not a valid pointer to a pixel format descriptor.
++ */
++enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc);
++
++/**
++ * Utility function to access log2_chroma_w log2_chroma_h from
++ * the pixel format AVPixFmtDescriptor.
++ *
++ * @param[in]  pix_fmt the pixel format
++ * @param[out] h_shift store log2_chroma_w (horizontal/width shift)
++ * @param[out] v_shift store log2_chroma_h (vertical/height shift)
++ *
++ * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format
++ */
++int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
++                                     int *h_shift, int *v_shift);
++
++/**
++ * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a
++ * valid pixel format.
++ */
++int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt);
++
++/**
++ * @return the name for provided color range or NULL if unknown.
++ */
++const char *av_color_range_name(enum AVColorRange range);
++
++/**
++ * @return the AVColorRange value for name or an AVError if not found.
++ */
++int av_color_range_from_name(const char *name);
++
++/**
++ * @return the name for provided color primaries or NULL if unknown.
++ */
++const char *av_color_primaries_name(enum AVColorPrimaries primaries);
++
++/**
++ * @return the AVColorPrimaries value for name or an AVError if not found.
++ */
++int av_color_primaries_from_name(const char *name);
++
++/**
++ * @return the name for provided color transfer or NULL if unknown.
++ */
++const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer);
++
++/**
++ * @return the AVColorTransferCharacteristic value for name or an AVError if not found.
++ */
++int av_color_transfer_from_name(const char *name);
++
++/**
++ * @return the name for provided color space or NULL if unknown.
++ */
++const char *av_color_space_name(enum AVColorSpace space);
++
++/**
++ * @return the AVColorSpace value for name or an AVError if not found.
++ */
++int av_color_space_from_name(const char *name);
++
++/**
++ * @return the name for provided chroma location or NULL if unknown.
++ */
++const char *av_chroma_location_name(enum AVChromaLocation location);
++
++/**
++ * @return the AVChromaLocation value for name or an AVError if not found.
++ */
++int av_chroma_location_from_name(const char *name);
++
++/**
++ * 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
++ */
++int av_chroma_location_enum_to_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
++ */
++enum AVChromaLocation av_chroma_location_pos_to_enum(int xpos, int ypos);
++
++/**
++ * @return the name for provided alpha mode or NULL if unknown.
++ */
++const char *av_alpha_mode_name(enum AVAlphaMode mode);
++
++/**
++ * @return the AVAlphaMode value for name or an AVError if not found.
++ */
++enum AVAlphaMode av_alpha_mode_from_name(const char *name);
++
++/**
++ * Return the pixel format corresponding to name.
++ *
++ * If there is no pixel format with name name, then looks for a
++ * pixel format with the name corresponding to the native endian
++ * format of name.
++ * For example in a little-endian system, first looks for "gray16",
++ * then for "gray16le".
++ *
++ * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE.
++ */
++enum AVPixelFormat av_get_pix_fmt(const char *name);
++
++/**
++ * Return the short name for a pixel format, NULL in case pix_fmt is
++ * unknown.
++ *
++ * @see av_get_pix_fmt(), av_get_pix_fmt_string()
++ */
++const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt);
++
++/**
++ * Print in buf the string corresponding to the pixel format with
++ * number pix_fmt, or a header if pix_fmt is negative.
++ *
++ * @param buf the buffer where to write the string
++ * @param buf_size the size of buf
++ * @param pix_fmt the number of the pixel format to print the
++ * corresponding info string, or a negative value to print the
++ * corresponding header.
++ */
++char *av_get_pix_fmt_string(char *buf, int buf_size,
++                            enum AVPixelFormat pix_fmt);
++
++/**
++ * Read a line from an image, and write the values of the
++ * pixel format component c to dst.
++ *
++ * @param data the array containing the pointers to the planes of the image
++ * @param linesize the array containing the linesizes of the image
++ * @param desc the pixel format descriptor for the image
++ * @param x the horizontal coordinate of the first pixel to read
++ * @param y the vertical coordinate of the first pixel to read
++ * @param w the width of the line to read, that is the number of
++ * values to write to dst
++ * @param read_pal_component if not zero and the format is a paletted
++ * format writes the values corresponding to the palette
++ * component c in data[1] to dst, rather than the palette indexes in
++ * data[0]. The behavior is undefined if the format is not paletted.
++ * @param dst_element_size size of elements in dst array (2 or 4 byte)
++ */
++void av_read_image_line2(void *dst, const uint8_t *data[4],
++                        const int linesize[4], const AVPixFmtDescriptor *desc,
++                        int x, int y, int c, int w, int read_pal_component,
++                        int dst_element_size);
++
++void av_read_image_line(uint16_t *dst, const uint8_t *data[4],
++                        const int linesize[4], const AVPixFmtDescriptor *desc,
++                        int x, int y, int c, int w, int read_pal_component);
++
++/**
++ * Write the values from src to the pixel format component c of an
++ * image line.
++ *
++ * @param src array containing the values to write
++ * @param data the array containing the pointers to the planes of the
++ * image to write into. It is supposed to be zeroed.
++ * @param linesize the array containing the linesizes of the image
++ * @param desc the pixel format descriptor for the image
++ * @param x the horizontal coordinate of the first pixel to write
++ * @param y the vertical coordinate of the first pixel to write
++ * @param w the width of the line to write, that is the number of
++ * values to write to the image line
++ * @param src_element_size size of elements in src array (2 or 4 byte)
++ */
++void av_write_image_line2(const void *src, uint8_t *data[4],
++                         const int linesize[4], const AVPixFmtDescriptor *desc,
++                         int x, int y, int c, int w, int src_element_size);
++
++void av_write_image_line(const uint16_t *src, uint8_t *data[4],
++                         const int linesize[4], const AVPixFmtDescriptor *desc,
++                         int x, int y, int c, int w);
++
++/**
++ * Utility function to swap the endianness of a pixel format.
++ *
++ * @param[in]  pix_fmt the pixel format
++ *
++ * @return pixel format with swapped endianness if it exists,
++ * otherwise AV_PIX_FMT_NONE
++ */
++enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt);
++
++#define FF_LOSS_RESOLUTION        0x0001 /**< loss due to resolution change */
++#define FF_LOSS_DEPTH             0x0002 /**< loss due to color depth change */
++#define FF_LOSS_COLORSPACE        0x0004 /**< loss due to color space conversion */
++#define FF_LOSS_ALPHA             0x0008 /**< loss of alpha bits */
++#define FF_LOSS_COLORQUANT        0x0010 /**< loss due to color quantization */
++#define FF_LOSS_CHROMA            0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */
++#define FF_LOSS_EXCESS_RESOLUTION 0x0040 /**< loss due to unneeded extra resolution */
++#define FF_LOSS_EXCESS_DEPTH      0x0080 /**< loss due to unneeded extra color depth */
++
++
++/**
++ * Compute what kind of losses will occur when converting from one specific
++ * pixel format to another.
++ * 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. These losses can involve loss of chroma, but also loss of
++ * resolution, loss of color depth, loss due to the color space conversion, loss
++ * of the alpha bits or loss due to color quantization.
++ * av_get_fix_fmt_loss() informs you about the various types of losses
++ * which will occur when converting from one pixel format to another.
++ *
++ * @param[in] dst_pix_fmt destination pixel format
++ * @param[in] src_pix_fmt source pixel format
++ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
++ * @return Combination of flags informing you what kind of losses will occur
++ * (maximum loss for an invalid dst_pix_fmt).
++ */
++int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt,
++                        enum AVPixelFormat src_pix_fmt,
++                        int has_alpha);
++
++/**
++ * Compute what kind of losses will occur when converting from one specific
++ * pixel format to another.
++ * 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. These losses can involve loss of chroma, but also loss of
++ * resolution, loss of color depth, loss due to the color space conversion, loss
++ * of the alpha bits or loss due to color quantization.
++ * av_get_fix_fmt_loss() informs you about the various types of losses
++ * which will occur when converting from one pixel format to another.
++ *
++ * @param[in] dst_pix_fmt destination pixel format
++ * @param[in] src_pix_fmt source pixel format
++ * @param[in] has_alpha Whether the source pixel format alpha channel is used.
++ * @return Combination of flags informing you what kind of losses will occur
++ * (maximum loss for an invalid dst_pix_fmt).
++ */
++enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
++                                             enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
++
++#endif /* AVUTIL_PIXDESC_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/pixfmt.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/pixfmt.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/pixfmt.h.ffmpeg9	2026-09-07 12:23:47.678858331 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/pixfmt.h	2026-09-07 12:23:47.678570623 +0200
+@@ -0,0 +1,817 @@
++/*
++ * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef AVUTIL_PIXFMT_H
++#define AVUTIL_PIXFMT_H
++
++/**
++ * @file
++ * pixel format definitions
++ */
++
++#include "libavutil/avconfig.h"
++#include "version.h"
++
++#define AVPALETTE_SIZE 1024
++#define AVPALETTE_COUNT 256
++
++/**
++ * Maximum number of planes in any pixel format.
++ * This should be used when a maximum is needed, but code should not
++ * be written to require a maximum for no good reason.
++ */
++#define AV_VIDEO_MAX_PLANES 4
++
++/**
++ * Pixel format.
++ *
++ * @note
++ * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA
++ * color is put together as:
++ *  (A << 24) | (R << 16) | (G << 8) | B
++ * This is stored as BGRA on little-endian CPU architectures and ARGB on
++ * big-endian CPUs.
++ *
++ * @note
++ * If the resolution is not a multiple of the chroma subsampling factor
++ * then the chroma plane resolution must be rounded up.
++ *
++ * @par
++ * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized
++ * image data is stored in AVFrame.data[0]. The palette is transported in
++ * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is
++ * formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is
++ * also endian-specific). Note also that the individual RGB32 palette
++ * components stored in AVFrame.data[1] should be in the range 0..255.
++ * This is important as many custom PAL8 video codecs that were designed
++ * to run on the IBM VGA graphics adapter use 6-bit palette components.
++ *
++ * @par
++ * For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like
++ * for pal8. This palette is filled in automatically by the function
++ * allocating the picture.
++ */
++enum AVPixelFormat {
++    AV_PIX_FMT_NONE = -1,
++    AV_PIX_FMT_YUV420P,   ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
++    AV_PIX_FMT_YUYV422,   ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
++    AV_PIX_FMT_RGB24,     ///< packed RGB 8:8:8, 24bpp, RGBRGB...
++    AV_PIX_FMT_BGR24,     ///< packed RGB 8:8:8, 24bpp, BGRBGR...
++    AV_PIX_FMT_YUV422P,   ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
++    AV_PIX_FMT_YUV444P,   ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
++    AV_PIX_FMT_YUV410P,   ///< planar YUV 4:1:0,  9bpp, (1 Cr & Cb sample per 4x4 Y samples)
++    AV_PIX_FMT_YUV411P,   ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
++    AV_PIX_FMT_GRAY8,     ///<        Y        ,  8bpp
++    AV_PIX_FMT_MONOWHITE, ///<        Y        ,  1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb
++    AV_PIX_FMT_MONOBLACK, ///<        Y        ,  1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb
++    AV_PIX_FMT_PAL8,      ///< 8 bits with AV_PIX_FMT_RGB32 palette
++    AV_PIX_FMT_YUVJ420P,  ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range
++    AV_PIX_FMT_YUVJ422P,  ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range
++    AV_PIX_FMT_YUVJ444P,  ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range
++    AV_PIX_FMT_UYVY422,   ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
++    AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3
++    AV_PIX_FMT_BGR8,      ///< packed RGB 3:3:2,  8bpp, (msb)2B 3G 3R(lsb)
++    AV_PIX_FMT_BGR4,      ///< packed RGB 1:2:1 bitstream,  4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
++    AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1,  8bpp, (msb)1B 2G 1R(lsb)
++    AV_PIX_FMT_RGB8,      ///< packed RGB 3:3:2,  8bpp, (msb)3R 3G 2B(lsb)
++    AV_PIX_FMT_RGB4,      ///< packed RGB 1:2:1 bitstream,  4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits
++    AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1,  8bpp, (msb)1R 2G 1B(lsb)
++    AV_PIX_FMT_NV12,      ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
++    AV_PIX_FMT_NV21,      ///< as above, but U and V bytes are swapped
++
++    AV_PIX_FMT_ARGB,      ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
++    AV_PIX_FMT_RGBA,      ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
++    AV_PIX_FMT_ABGR,      ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
++    AV_PIX_FMT_BGRA,      ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
++
++    AV_PIX_FMT_GRAY16BE,  ///<        Y        , 16bpp, big-endian
++    AV_PIX_FMT_GRAY16LE,  ///<        Y        , 16bpp, little-endian
++    AV_PIX_FMT_YUV440P,   ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
++    AV_PIX_FMT_YUVJ440P,  ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
++    AV_PIX_FMT_YUVA420P,  ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
++    AV_PIX_FMT_RGB48BE,   ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian
++    AV_PIX_FMT_RGB48LE,   ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian
++
++    AV_PIX_FMT_RGB565BE,  ///< packed RGB 5:6:5, 16bpp, (msb)   5R 6G 5B(lsb), big-endian
++    AV_PIX_FMT_RGB565LE,  ///< packed RGB 5:6:5, 16bpp, (msb)   5R 6G 5B(lsb), little-endian
++    AV_PIX_FMT_RGB555BE,  ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian   , X=unused/undefined
++    AV_PIX_FMT_RGB555LE,  ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
++
++    AV_PIX_FMT_BGR565BE,  ///< packed BGR 5:6:5, 16bpp, (msb)   5B 6G 5R(lsb), big-endian
++    AV_PIX_FMT_BGR565LE,  ///< packed BGR 5:6:5, 16bpp, (msb)   5B 6G 5R(lsb), little-endian
++    AV_PIX_FMT_BGR555BE,  ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian   , X=unused/undefined
++    AV_PIX_FMT_BGR555LE,  ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined
++
++    /**
++     *  Hardware acceleration through VA-API, data[3] contains a
++     *  VASurfaceID.
++     */
++    AV_PIX_FMT_VAAPI,
++
++    AV_PIX_FMT_YUV420P16LE,  ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
++    AV_PIX_FMT_YUV420P16BE,  ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
++    AV_PIX_FMT_YUV422P16LE,  ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
++    AV_PIX_FMT_YUV422P16BE,  ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
++    AV_PIX_FMT_YUV444P16LE,  ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
++    AV_PIX_FMT_YUV444P16BE,  ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
++    AV_PIX_FMT_DXVA2_VLD,    ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer
++
++    AV_PIX_FMT_RGB444LE,  ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined
++    AV_PIX_FMT_RGB444BE,  ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian,    X=unused/undefined
++    AV_PIX_FMT_BGR444LE,  ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined
++    AV_PIX_FMT_BGR444BE,  ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian,    X=unused/undefined
++    AV_PIX_FMT_YA8,       ///< 8 bits gray, 8 bits alpha
++
++    AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8
++    AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8
++
++    AV_PIX_FMT_BGR48BE,   ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
++    AV_PIX_FMT_BGR48LE,   ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
++
++    /**
++     * The following 12 formats have the disadvantage of needing 1 format for each bit depth.
++     * Notice that each 9/10 bits sample is stored in 16 bits with extra padding.
++     * If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better.
++     */
++    AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
++    AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
++    AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
++    AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
++    AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
++    AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
++    AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
++    AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
++    AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
++    AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
++    AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
++    AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
++    AV_PIX_FMT_GBRP,      ///< planar GBR 4:4:4 24bpp
++    AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP, // alias for #AV_PIX_FMT_GBRP
++    AV_PIX_FMT_GBRP9BE,   ///< planar GBR 4:4:4 27bpp, big-endian
++    AV_PIX_FMT_GBRP9LE,   ///< planar GBR 4:4:4 27bpp, little-endian
++    AV_PIX_FMT_GBRP10BE,  ///< planar GBR 4:4:4 30bpp, big-endian
++    AV_PIX_FMT_GBRP10LE,  ///< planar GBR 4:4:4 30bpp, little-endian
++    AV_PIX_FMT_GBRP16BE,  ///< planar GBR 4:4:4 48bpp, big-endian
++    AV_PIX_FMT_GBRP16LE,  ///< planar GBR 4:4:4 48bpp, little-endian
++    AV_PIX_FMT_YUVA422P,  ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
++    AV_PIX_FMT_YUVA444P,  ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
++    AV_PIX_FMT_YUVA420P9BE,  ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian
++    AV_PIX_FMT_YUVA420P9LE,  ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian
++    AV_PIX_FMT_YUVA422P9BE,  ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian
++    AV_PIX_FMT_YUVA422P9LE,  ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian
++    AV_PIX_FMT_YUVA444P9BE,  ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
++    AV_PIX_FMT_YUVA444P9LE,  ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
++    AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
++    AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
++    AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
++    AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
++    AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
++    AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
++    AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)
++    AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)
++    AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)
++    AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
++    AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)
++    AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)
++
++    AV_PIX_FMT_VDPAU,     ///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface
++
++    AV_PIX_FMT_XYZ12LE,      ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0
++    AV_PIX_FMT_XYZ12BE,      ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0
++    AV_PIX_FMT_NV16,         ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
++    AV_PIX_FMT_NV20LE,       ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
++    AV_PIX_FMT_NV20BE,       ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
++
++    AV_PIX_FMT_RGBA64BE,     ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
++    AV_PIX_FMT_RGBA64LE,     ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
++    AV_PIX_FMT_BGRA64BE,     ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian
++    AV_PIX_FMT_BGRA64LE,     ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian
++
++    AV_PIX_FMT_YVYU422,   ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb
++
++    AV_PIX_FMT_YA16BE,       ///< 16 bits gray, 16 bits alpha (big-endian)
++    AV_PIX_FMT_YA16LE,       ///< 16 bits gray, 16 bits alpha (little-endian)
++
++    AV_PIX_FMT_GBRAP,        ///< planar GBRA 4:4:4:4 32bpp
++    AV_PIX_FMT_GBRAP16BE,    ///< planar GBRA 4:4:4:4 64bpp, big-endian
++    AV_PIX_FMT_GBRAP16LE,    ///< planar GBRA 4:4:4:4 64bpp, little-endian
++    /**
++     * HW acceleration through QSV, data[3] contains a pointer to the
++     * mfxFrameSurface1 structure.
++     *
++     * Before FFmpeg 5.0:
++     * mfxFrameSurface1.Data.MemId contains a pointer when importing
++     * the following frames as QSV frames:
++     *
++     * VAAPI:
++     * mfxFrameSurface1.Data.MemId contains a pointer to VASurfaceID
++     *
++     * DXVA2:
++     * mfxFrameSurface1.Data.MemId contains a pointer to IDirect3DSurface9
++     *
++     * FFmpeg 5.0 and above:
++     * mfxFrameSurface1.Data.MemId contains a pointer to the mfxHDLPair
++     * structure when importing the following frames as QSV frames:
++     *
++     * VAAPI:
++     * mfxHDLPair.first contains a VASurfaceID pointer.
++     * mfxHDLPair.second is always MFX_INFINITE.
++     *
++     * DXVA2:
++     * mfxHDLPair.first contains IDirect3DSurface9 pointer.
++     * mfxHDLPair.second is always MFX_INFINITE.
++     *
++     * D3D11:
++     * mfxHDLPair.first contains a ID3D11Texture2D pointer.
++     * mfxHDLPair.second contains the texture array index of the frame if the
++     * ID3D11Texture2D is an array texture, or always MFX_INFINITE if it is a
++     * normal texture.
++     */
++    AV_PIX_FMT_QSV,
++    /**
++     * HW acceleration though MMAL, data[3] contains a pointer to the
++     * MMAL_BUFFER_HEADER_T structure.
++     */
++    AV_PIX_FMT_MMAL,
++
++    AV_PIX_FMT_D3D11VA_VLD,  ///< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer
++
++    /**
++     * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers
++     * exactly as for system memory frames.
++     */
++    AV_PIX_FMT_CUDA,
++
++    AV_PIX_FMT_0RGB,        ///< packed RGB 8:8:8, 32bpp, XRGBXRGB...   X=unused/undefined
++    AV_PIX_FMT_RGB0,        ///< packed RGB 8:8:8, 32bpp, RGBXRGBX...   X=unused/undefined
++    AV_PIX_FMT_0BGR,        ///< packed BGR 8:8:8, 32bpp, XBGRXBGR...   X=unused/undefined
++    AV_PIX_FMT_BGR0,        ///< packed BGR 8:8:8, 32bpp, BGRXBGRX...   X=unused/undefined
++
++    AV_PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
++    AV_PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
++    AV_PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
++    AV_PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
++    AV_PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
++    AV_PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
++    AV_PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian
++    AV_PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
++    AV_PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
++    AV_PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
++    AV_PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian
++    AV_PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
++    AV_PIX_FMT_GBRP12BE,    ///< planar GBR 4:4:4 36bpp, big-endian
++    AV_PIX_FMT_GBRP12LE,    ///< planar GBR 4:4:4 36bpp, little-endian
++    AV_PIX_FMT_GBRP14BE,    ///< planar GBR 4:4:4 42bpp, big-endian
++    AV_PIX_FMT_GBRP14LE,    ///< planar GBR 4:4:4 42bpp, little-endian
++    AV_PIX_FMT_YUVJ411P,    ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range
++
++    AV_PIX_FMT_BAYER_BGGR8,    ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples
++    AV_PIX_FMT_BAYER_RGGB8,    ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples
++    AV_PIX_FMT_BAYER_GBRG8,    ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples
++    AV_PIX_FMT_BAYER_GRBG8,    ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples
++    AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian
++    AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian
++    AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian
++    AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian
++    AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian
++    AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian
++    AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian
++    AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian
++
++    AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
++    AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
++    AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian
++    AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian
++    AV_PIX_FMT_AYUV64LE,    ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian
++    AV_PIX_FMT_AYUV64BE,    ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian
++
++    AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox
++
++    AV_PIX_FMT_P010LE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian
++    AV_PIX_FMT_P010BE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian
++
++    AV_PIX_FMT_GBRAP12BE,  ///< planar GBR 4:4:4:4 48bpp, big-endian
++    AV_PIX_FMT_GBRAP12LE,  ///< planar GBR 4:4:4:4 48bpp, little-endian
++
++    AV_PIX_FMT_GBRAP10BE,  ///< planar GBR 4:4:4:4 40bpp, big-endian
++    AV_PIX_FMT_GBRAP10LE,  ///< planar GBR 4:4:4:4 40bpp, little-endian
++
++    AV_PIX_FMT_MEDIACODEC, ///< hardware decoding through MediaCodec
++
++    AV_PIX_FMT_GRAY12BE,   ///<        Y        , 12bpp, big-endian
++    AV_PIX_FMT_GRAY12LE,   ///<        Y        , 12bpp, little-endian
++    AV_PIX_FMT_GRAY10BE,   ///<        Y        , 10bpp, big-endian
++    AV_PIX_FMT_GRAY10LE,   ///<        Y        , 10bpp, little-endian
++
++    AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian
++    AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian
++
++    /**
++     * Hardware surfaces for Direct3D11.
++     *
++     * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11
++     * hwaccel API and filtering support AV_PIX_FMT_D3D11 only.
++     *
++     * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the
++     * texture array index of the frame as intptr_t if the ID3D11Texture2D is
++     * an array texture (or always 0 if it's a normal texture).
++     */
++    AV_PIX_FMT_D3D11,
++
++    AV_PIX_FMT_GRAY9BE,   ///<        Y        , 9bpp, big-endian
++    AV_PIX_FMT_GRAY9LE,   ///<        Y        , 9bpp, little-endian
++
++    AV_PIX_FMT_GBRPF32BE,  ///< IEEE-754 single precision planar GBR 4:4:4,     96bpp, big-endian
++    AV_PIX_FMT_GBRPF32LE,  ///< IEEE-754 single precision planar GBR 4:4:4,     96bpp, little-endian
++    AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian
++    AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian
++
++    /**
++     * DRM-managed buffers exposed through PRIME buffer sharing.
++     *
++     * data[0] points to an AVDRMFrameDescriptor.
++     */
++    AV_PIX_FMT_DRM_PRIME,
++    /**
++     * Hardware surfaces for OpenCL.
++     *
++     * data[i] contain 2D image objects (typed in C as cl_mem, used
++     * in OpenCL as image2d_t) for each plane of the surface.
++     */
++    AV_PIX_FMT_OPENCL,
++
++    AV_PIX_FMT_GRAY14BE,   ///<        Y        , 14bpp, big-endian
++    AV_PIX_FMT_GRAY14LE,   ///<        Y        , 14bpp, little-endian
++
++    AV_PIX_FMT_GRAYF32BE,  ///< IEEE-754 single precision Y, 32bpp, big-endian
++    AV_PIX_FMT_GRAYF32LE,  ///< IEEE-754 single precision Y, 32bpp, little-endian
++
++    AV_PIX_FMT_YUVA422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian
++    AV_PIX_FMT_YUVA422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian
++    AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian
++    AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian
++
++    AV_PIX_FMT_NV24,      ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
++    AV_PIX_FMT_NV42,      ///< as above, but U and V bytes are swapped
++
++    /**
++     * Vulkan hardware images.
++     *
++     * data[0] points to an AVVkFrame
++     */
++    AV_PIX_FMT_VULKAN,
++
++    AV_PIX_FMT_Y210BE,    ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, big-endian
++    AV_PIX_FMT_Y210LE,    ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, little-endian
++
++    AV_PIX_FMT_X2RGB10LE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined
++    AV_PIX_FMT_X2RGB10BE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), big-endian, X=unused/undefined
++    AV_PIX_FMT_X2BGR10LE, ///< packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), little-endian, X=unused/undefined
++    AV_PIX_FMT_X2BGR10BE, ///< packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), big-endian, X=unused/undefined
++
++    AV_PIX_FMT_P210BE,      ///< interleaved chroma YUV 4:2:2, 20bpp, data in the high bits, big-endian
++    AV_PIX_FMT_P210LE,      ///< interleaved chroma YUV 4:2:2, 20bpp, data in the high bits, little-endian
++
++    AV_PIX_FMT_P410BE,      ///< interleaved chroma YUV 4:4:4, 30bpp, data in the high bits, big-endian
++    AV_PIX_FMT_P410LE,      ///< interleaved chroma YUV 4:4:4, 30bpp, data in the high bits, little-endian
++
++    AV_PIX_FMT_P216BE,      ///< interleaved chroma YUV 4:2:2, 32bpp, big-endian
++    AV_PIX_FMT_P216LE,      ///< interleaved chroma YUV 4:2:2, 32bpp, little-endian
++
++    AV_PIX_FMT_P416BE,      ///< interleaved chroma YUV 4:4:4, 48bpp, big-endian
++    AV_PIX_FMT_P416LE,      ///< interleaved chroma YUV 4:4:4, 48bpp, little-endian
++
++    AV_PIX_FMT_VUYA,        ///< packed VUYA 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), 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:4, 32bpp, Variant of VUYA where alpha channel is left undefined
++
++    AV_PIX_FMT_P012LE,      ///< like NV12, with 12bpp per component, data in the high bits, zeros in the low bits, little-endian
++    AV_PIX_FMT_P012BE,      ///< like NV12, with 12bpp per component, data in the high bits, zeros in the low bits, big-endian
++
++    AV_PIX_FMT_Y212BE,      ///< packed YUV 4:2:2 like YUYV422, 24bpp, data in the high bits, zeros in the low bits, big-endian
++    AV_PIX_FMT_Y212LE,      ///< packed YUV 4:2:2 like YUYV422, 24bpp, data in the high bits, zeros in the low bits, little-endian
++
++    AV_PIX_FMT_XV30BE,      ///< packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb), big-endian, variant of Y410 where alpha channel is left undefined
++    AV_PIX_FMT_XV30LE,      ///< packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb), little-endian, variant of Y410 where alpha channel is left undefined
++
++    AV_PIX_FMT_XV36BE,      ///< packed XVYU 4:4:4, 48bpp, data in the high bits, zeros in the low bits, big-endian, variant of Y412 where alpha channel is left undefined
++    AV_PIX_FMT_XV36LE,      ///< packed XVYU 4:4:4, 48bpp, data in the high bits, zeros in the low bits, little-endian, variant of Y412 where alpha channel is left undefined
++
++    AV_PIX_FMT_RGBF32BE,    ///< IEEE-754 single precision packed RGB 32:32:32, 96bpp, RGBRGB..., big-endian
++    AV_PIX_FMT_RGBF32LE,    ///< IEEE-754 single precision packed RGB 32:32:32, 96bpp, RGBRGB..., little-endian
++
++    AV_PIX_FMT_RGBAF32BE,   ///< IEEE-754 single precision packed RGBA 32:32:32:32, 128bpp, RGBARGBA..., big-endian
++    AV_PIX_FMT_RGBAF32LE,   ///< IEEE-754 single precision packed RGBA 32:32:32:32, 128bpp, RGBARGBA..., little-endian
++
++    AV_PIX_FMT_P212BE,      ///< interleaved chroma YUV 4:2:2, 24bpp, data in the high bits, big-endian
++    AV_PIX_FMT_P212LE,      ///< interleaved chroma YUV 4:2:2, 24bpp, data in the high bits, little-endian
++
++    AV_PIX_FMT_P412BE,      ///< interleaved chroma YUV 4:4:4, 36bpp, data in the high bits, big-endian
++    AV_PIX_FMT_P412LE,      ///< interleaved chroma YUV 4:4:4, 36bpp, data in the high bits, little-endian
++
++    AV_PIX_FMT_GBRAP14BE,  ///< planar GBR 4:4:4:4 56bpp, big-endian
++    AV_PIX_FMT_GBRAP14LE,  ///< planar GBR 4:4:4:4 56bpp, little-endian
++
++    /**
++     * Hardware surfaces for Direct3D 12.
++     *
++     * data[0] points to an AVD3D12VAFrame
++     */
++    AV_PIX_FMT_D3D12,
++
++    AV_PIX_FMT_AYUV,        ///< packed AYUV 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), AYUVAYUV...
++
++    AV_PIX_FMT_UYVA,        ///< packed UYVA 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), UYVAUYVA...
++
++    AV_PIX_FMT_VYU444,      ///< packed VYU 4:4:4, 24bpp (1 Cr & Cb sample per 1x1 Y), VYUVYU...
++
++    AV_PIX_FMT_V30XBE,      ///< packed VYUX 4:4:4 like XV30, 32bpp, (msb)10V 10Y 10U 2X(lsb), big-endian
++    AV_PIX_FMT_V30XLE,      ///< packed VYUX 4:4:4 like XV30, 32bpp, (msb)10V 10Y 10U 2X(lsb), little-endian
++
++    AV_PIX_FMT_RGBF16BE,    ///< IEEE-754 half precision packed RGB 16:16:16, 48bpp, RGBRGB..., big-endian
++    AV_PIX_FMT_RGBF16LE,    ///< IEEE-754 half precision packed RGB 16:16:16, 48bpp, RGBRGB..., little-endian
++
++    AV_PIX_FMT_RGBA128BE,   ///< packed RGBA 32:32:32:32, 128bpp, RGBARGBA..., big-endian
++    AV_PIX_FMT_RGBA128LE,   ///< packed RGBA 32:32:32:32, 128bpp, RGBARGBA..., little-endian
++
++    AV_PIX_FMT_RGB96BE,     ///< packed RGBA 32:32:32, 96bpp, RGBRGB..., big-endian
++    AV_PIX_FMT_RGB96LE,     ///< packed RGBA 32:32:32, 96bpp, RGBRGB..., little-endian
++
++    AV_PIX_FMT_Y216BE,      ///< packed YUV 4:2:2 like YUYV422, 32bpp, big-endian
++    AV_PIX_FMT_Y216LE,      ///< packed YUV 4:2:2 like YUYV422, 32bpp, little-endian
++
++    AV_PIX_FMT_XV48BE,      ///< packed XVYU 4:4:4, 64bpp, big-endian, variant of Y416 where alpha channel is left undefined
++    AV_PIX_FMT_XV48LE,      ///< packed XVYU 4:4:4, 64bpp, little-endian, variant of Y416 where alpha channel is left undefined
++
++    AV_PIX_FMT_GBRPF16BE,  ///< IEEE-754 half precision planer GBR 4:4:4, 48bpp, big-endian
++    AV_PIX_FMT_GBRPF16LE,  ///< IEEE-754 half precision planer GBR 4:4:4, 48bpp, little-endian
++    AV_PIX_FMT_GBRAPF16BE, ///< IEEE-754 half precision planar GBRA 4:4:4:4, 64bpp, big-endian
++    AV_PIX_FMT_GBRAPF16LE, ///< IEEE-754 half precision planar GBRA 4:4:4:4, 64bpp, little-endian
++
++    AV_PIX_FMT_GRAYF16BE,  ///< IEEE-754 half precision Y, 16bpp, big-endian
++    AV_PIX_FMT_GRAYF16LE,  ///< IEEE-754 half precision Y, 16bpp, little-endian
++
++    /**
++     * HW acceleration through AMF. data[0] contain AMFSurface pointer
++     */
++    AV_PIX_FMT_AMF_SURFACE,
++
++    AV_PIX_FMT_GRAY32BE,    ///<         Y        , 32bpp, big-endian
++    AV_PIX_FMT_GRAY32LE,    ///<         Y        , 32bpp, little-endian
++
++    AV_PIX_FMT_YAF32BE,  ///< IEEE-754 single precision packed YA, 32 bits gray, 32 bits alpha, 64bpp, big-endian
++    AV_PIX_FMT_YAF32LE,  ///< IEEE-754 single precision packed YA, 32 bits gray, 32 bits alpha, 64bpp, little-endian
++
++    AV_PIX_FMT_YAF16BE,  ///< IEEE-754 half precision packed YA, 16 bits gray, 16 bits alpha, 32bpp, big-endian
++    AV_PIX_FMT_YAF16LE,  ///< IEEE-754 half precision packed YA, 16 bits gray, 16 bits alpha, 32bpp, little-endian
++
++    AV_PIX_FMT_GBRAP32BE,   ///< planar GBRA 4:4:4:4 128bpp, big-endian
++    AV_PIX_FMT_GBRAP32LE,   ///< planar GBRA 4:4:4:4 128bpp, little-endian
++
++    AV_PIX_FMT_YUV444P10MSBBE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, big-endian
++    AV_PIX_FMT_YUV444P10MSBLE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, little-endian
++    AV_PIX_FMT_YUV444P12MSBBE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, big-endian
++    AV_PIX_FMT_YUV444P12MSBLE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, little-endian
++    AV_PIX_FMT_GBRP10MSBBE,    ///< planar GBR 4:4:4 30bpp, lowest bits zero, big-endian
++    AV_PIX_FMT_GBRP10MSBLE,    ///< planar GBR 4:4:4 30bpp, lowest bits zero, little-endian
++    AV_PIX_FMT_GBRP12MSBBE,    ///< planar GBR 4:4:4 36bpp, lowest bits zero, big-endian
++    AV_PIX_FMT_GBRP12MSBLE,    ///< planar GBR 4:4:4 36bpp, lowest bits zero, little-endian
++
++    AV_PIX_FMT_OHCODEC, /// hardware decoding through openharmony
++
++    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_GRAY32 AV_PIX_FMT_NE(GRAY32BE, GRAY32LE)
++#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_YUV444P10MSB AV_PIX_FMT_NE(YUV444P10MSBBE, YUV444P10MSBLE)
++#define AV_PIX_FMT_YUV444P12MSB AV_PIX_FMT_NE(YUV444P12MSBBE, YUV444P12MSBLE)
++
++#define AV_PIX_FMT_GBRP9     AV_PIX_FMT_NE(GBRP9BE ,    GBRP9LE)
++#define AV_PIX_FMT_GBRP10    AV_PIX_FMT_NE(GBRP10BE,    GBRP10LE)
++#define AV_PIX_FMT_GBRP12    AV_PIX_FMT_NE(GBRP12BE,    GBRP12LE)
++#define AV_PIX_FMT_GBRP14    AV_PIX_FMT_NE(GBRP14BE,    GBRP14LE)
++#define AV_PIX_FMT_GBRP16    AV_PIX_FMT_NE(GBRP16BE,    GBRP16LE)
++#define AV_PIX_FMT_GBRAP10   AV_PIX_FMT_NE(GBRAP10BE,   GBRAP10LE)
++#define AV_PIX_FMT_GBRAP12   AV_PIX_FMT_NE(GBRAP12BE,   GBRAP12LE)
++#define AV_PIX_FMT_GBRAP14   AV_PIX_FMT_NE(GBRAP14BE,   GBRAP14LE)
++#define AV_PIX_FMT_GBRAP16   AV_PIX_FMT_NE(GBRAP16BE,   GBRAP16LE)
++#define AV_PIX_FMT_GBRAP32   AV_PIX_FMT_NE(GBRAP32BE,   GBRAP32LE)
++
++#define AV_PIX_FMT_GBRP10MSB AV_PIX_FMT_NE(GBRP10MSBBE, GBRP10MSBLE)
++#define AV_PIX_FMT_GBRP12MSB AV_PIX_FMT_NE(GBRP12MSBBE, GBRP12MSBLE)
++
++#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_GBRPF16    AV_PIX_FMT_NE(GBRPF16BE,  GBRPF16LE)
++#define AV_PIX_FMT_GBRAPF16   AV_PIX_FMT_NE(GBRAPF16BE, GBRAPF16LE)
++#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_GRAYF16    AV_PIX_FMT_NE(GRAYF16BE, GRAYF16LE)
++#define AV_PIX_FMT_GRAYF32    AV_PIX_FMT_NE(GRAYF32BE, GRAYF32LE)
++
++#define AV_PIX_FMT_YAF16      AV_PIX_FMT_NE(YAF16BE, YAF16LE)
++#define AV_PIX_FMT_YAF32      AV_PIX_FMT_NE(YAF32BE, YAF32LE)
++
++#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_Y216       AV_PIX_FMT_NE(Y216BE,  Y216LE)
++#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_XV48       AV_PIX_FMT_NE(XV48BE,  XV48LE)
++#define AV_PIX_FMT_V30X       AV_PIX_FMT_NE(V30XBE,  V30XLE)
++#define AV_PIX_FMT_X2RGB10    AV_PIX_FMT_NE(X2RGB10BE, X2RGB10LE)
++#define AV_PIX_FMT_X2BGR10    AV_PIX_FMT_NE(X2BGR10BE, X2BGR10LE)
++
++#define AV_PIX_FMT_P210       AV_PIX_FMT_NE(P210BE, P210LE)
++#define AV_PIX_FMT_P410       AV_PIX_FMT_NE(P410BE, P410LE)
++#define AV_PIX_FMT_P212       AV_PIX_FMT_NE(P212BE, P212LE)
++#define AV_PIX_FMT_P412       AV_PIX_FMT_NE(P412BE, P412LE)
++#define AV_PIX_FMT_P216       AV_PIX_FMT_NE(P216BE, P216LE)
++#define AV_PIX_FMT_P416       AV_PIX_FMT_NE(P416BE, P416LE)
++
++#define AV_PIX_FMT_RGBF16     AV_PIX_FMT_NE(RGBF16BE, RGBF16LE)
++#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)
++
++#define AV_PIX_FMT_RGB96      AV_PIX_FMT_NE(RGB96BE, RGB96LE)
++#define AV_PIX_FMT_RGBA128    AV_PIX_FMT_NE(RGBA128BE, RGBA128LE)
++
++/**
++  * 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
++
++    /* The following entries are not part of H.273, but custom extensions */
++    AVCOL_PRI_EXT_BASE     = 256,
++    AVCOL_PRI_V_GAMUT      = AVCOL_PRI_EXT_BASE,
++    AVCOL_PRI_EXT_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
++
++    /* The following entries are not part of H.273, but custom extensions */
++    AVCOL_TRC_EXT_BASE     = 256,
++    AVCOL_TRC_V_LOG        = AVCOL_TRC_EXT_BASE,
++    AVCOL_TRC_EXT_NB             ///< Not part of ABI
++};
++
++/**
++ * YUV colorspace type.
++ * These values match the ones defined by ISO/IEC 23091-2_2019 subclause 8.3.
++ */
++enum AVColorSpace {
++    AVCOL_SPC_RGB         = 0,  ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
++    AVCOL_SPC_BT709       = 1,  ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
++    AVCOL_SPC_UNSPECIFIED = 2,
++    AVCOL_SPC_RESERVED    = 3,  ///< reserved for future use by ITU-T and ISO/IEC just like 15-255 are
++    AVCOL_SPC_FCC         = 4,  ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
++    AVCOL_SPC_BT470BG     = 5,  ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
++    AVCOL_SPC_SMPTE170M   = 6,  ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
++    AVCOL_SPC_SMPTE240M   = 7,  ///< derived from 170M primaries and D65 white point, 170M is derived from BT470 System M's primaries
++    AVCOL_SPC_YCGCO       = 8,  ///< used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
++    AVCOL_SPC_YCOCG       = AVCOL_SPC_YCGCO,
++    AVCOL_SPC_BT2020_NCL  = 9,  ///< ITU-R BT2020 non-constant luminance system
++    AVCOL_SPC_BT2020_CL   = 10, ///< ITU-R BT2020 constant luminance system
++    AVCOL_SPC_SMPTE2085   = 11, ///< SMPTE 2085, Y'D'zD'x
++    AVCOL_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system
++    AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system
++    AVCOL_SPC_ICTCP       = 14, ///< ITU-R BT.2100-0, ICtCp
++    AVCOL_SPC_IPT_C2      = 15, ///< SMPTE ST 2128, IPT-C2
++    AVCOL_SPC_YCGCO_RE    = 16, ///< YCgCo-R, even addition of bits
++    AVCOL_SPC_YCGCO_RO    = 17, ///< YCgCo-R, odd addition of bits
++    AVCOL_SPC_NB                ///< Not part of ABI
++};
++
++/**
++ * Visual content value range.
++ *
++ * These values are based on definitions that can be found in multiple
++ * specifications, such as ITU-T BT.709 (3.4 - Quantization of RGB, luminance
++ * and colour-difference signals), ITU-T BT.2020 (Table 5 - Digital
++ * Representation) as well as ITU-T BT.2100 (Table 9 - Digital 10- and 12-bit
++ * integer representation). At the time of writing, the BT.2100 one is
++ * recommended, as it also defines the full range representation.
++ *
++ * Common definitions:
++ *   - For RGB and luma planes such as Y in YCbCr and I in ICtCp,
++ *     'E' is the original value in range of 0.0 to 1.0.
++ *   - For chroma planes such as Cb,Cr and Ct,Cp, 'E' is the original
++ *     value in range of -0.5 to 0.5.
++ *   - 'n' is the output bit depth.
++ *   - For additional definitions such as rounding and clipping to valid n
++ *     bit unsigned integer range, please refer to BT.2100 (Table 9).
++ */
++enum AVColorRange {
++    AVCOL_RANGE_UNSPECIFIED = 0,
++
++    /**
++     * Narrow or limited range content.
++     *
++     * - For luma planes:
++     *
++     *       (219 * E + 16) * 2^(n-8)
++     *
++     *   F.ex. the range of 16-235 for 8 bits
++     *
++     * - For chroma planes:
++     *
++     *       (224 * E + 128) * 2^(n-8)
++     *
++     *   F.ex. the range of 16-240 for 8 bits
++     */
++    AVCOL_RANGE_MPEG        = 1,
++
++    /**
++     * Full range content.
++     *
++     * - For RGB and luma planes:
++     *
++     *       (2^n - 1) * E
++     *
++     *   F.ex. the range of 0-255 for 8 bits
++     *
++     * - For chroma planes:
++     *
++     *       (2^n - 1) * E + 2^(n - 1)
++     *
++     *   F.ex. the range of 1-255 for 8 bits
++     */
++    AVCOL_RANGE_JPEG        = 2,
++    AVCOL_RANGE_NB               ///< Not part of ABI
++};
++
++/**
++ * Location of chroma samples.
++ *
++ * Illustration showing the location of the first (top left) chroma sample of the
++ * image, the left shows only luma, the right
++ * shows the location of the chroma sample, the 2 could be imagined to overlay
++ * each other but are drawn separately due to limitations of ASCII
++ *
++ *                1st 2nd       1st 2nd horizontal luma sample positions
++ *                 v   v         v   v
++ *                 ______        ______
++ *1st luma line > |X   X ...    |3 4 X ...     X are luma samples,
++ *                |             |1 2           1-6 are possible chroma positions
++ *2nd luma line > |X   X ...    |5 6 X ...     0 is undefined/unknown position
++ */
++enum AVChromaLocation {
++    AVCHROMA_LOC_UNSPECIFIED = 0,
++    AVCHROMA_LOC_LEFT        = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0
++    AVCHROMA_LOC_CENTER      = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0
++    AVCHROMA_LOC_TOPLEFT     = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2
++    AVCHROMA_LOC_TOP         = 4,
++    AVCHROMA_LOC_BOTTOMLEFT  = 5,
++    AVCHROMA_LOC_BOTTOM      = 6,
++    AVCHROMA_LOC_NB               ///< Not part of ABI
++};
++
++/**
++ * Correlation between the alpha channel and color values.
++ */
++enum AVAlphaMode {
++    AVALPHA_MODE_UNSPECIFIED   = 0, ///< Unknown alpha handling, or no alpha channel
++    AVALPHA_MODE_PREMULTIPLIED = 1, ///< Alpha channel is multiplied into color values
++    AVALPHA_MODE_STRAIGHT      = 2, ///< Alpha channel is independent of color values
++    AVALPHA_MODE_NB                 ///< Not part of ABI
++};
++
++#endif /* AVUTIL_PIXFMT_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/rational.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/rational.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/rational.h.ffmpeg9	2026-09-07 12:23:47.678970223 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/rational.h	2026-09-07 12:23:47.678920899 +0200
+@@ -0,0 +1,225 @@
++/*
++ * rational numbers
++ * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++/**
++ * @file
++ * @ingroup lavu_math_rational
++ * Utilities for rational number calculation.
++ * @author Michael Niedermayer <michaelni@gmx.at>
++ */
++
++#ifndef AVUTIL_RATIONAL_H
++#define AVUTIL_RATIONAL_H
++
++#include <stdint.h>
++#include <limits.h>
++#include "attributes.h"
++
++/**
++ * @defgroup lavu_math_rational AVRational
++ * @ingroup lavu_math
++ * Rational number calculation.
++ *
++ * While rational numbers can be expressed as floating-point numbers, the
++ * conversion process is a lossy one, so are floating-point operations. On the
++ * other hand, the nature of FFmpeg demands highly accurate calculation of
++ * timestamps. This set of rational number utilities serves as a generic
++ * interface for manipulating rational numbers as pairs of numerators and
++ * denominators.
++ *
++ * Many of the functions that operate on AVRational's have the suffix `_q`, in
++ * reference to the mathematical symbol "ℚ" (Q) which denotes the set of all
++ * rational numbers.
++ *
++ * @{
++ */
++
++/**
++ * Rational number (pair of numerator and denominator).
++ */
++typedef struct AVRational{
++    int num; ///< Numerator
++    int den; ///< Denominator
++} AVRational;
++
++/**
++ * Create an AVRational.
++ *
++ * Useful for compilers that do not support compound literals.
++ *
++ * @note The return value is not reduced.
++ * @see av_reduce()
++ */
++static inline AVRational av_make_q(int num, int den)
++{
++    AVRational r = { num, den };
++    return r;
++}
++
++/**
++ * Compare two rationals.
++ *
++ * @param a First rational
++ * @param b Second rational
++ *
++ * @return One of the following values:
++ *         - 0 if `a == b`
++ *         - 1 if `a > b`
++ *         - -1 if `a < b`
++ *         - `INT_MIN` if one of the values is of the form `0 / 0`
++ */
++static inline int av_cmp_q(AVRational a, AVRational b){
++    const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;
++
++    if(tmp) return (int)((tmp ^ a.den ^ b.den)>>63)|1;
++    else if(b.den && a.den) return 0;
++    else if(a.num && b.num) return (a.num>>31) - (b.num>>31);
++    else                    return INT_MIN;
++}
++
++/**
++ * Convert an AVRational to a `double`.
++ * @param a AVRational to convert
++ * @return `a` in floating-point form
++ * @see av_d2q()
++ */
++static inline double av_q2d(AVRational a){
++    return a.num / (double) a.den;
++}
++
++/**
++ * Reduce a fraction.
++ *
++ * This is useful for framerate calculations.
++ *
++ * @param[out] dst_num Destination numerator
++ * @param[out] dst_den Destination denominator
++ * @param[in]      num Source numerator
++ * @param[in]      den Source denominator
++ * @param[in]      max Maximum allowed values for `dst_num` & `dst_den`
++ * @return 1 if the operation is exact, 0 otherwise
++ */
++int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max);
++
++/**
++ * Multiply two rationals.
++ * @param b First rational
++ * @param c Second rational
++ * @return b*c
++ */
++AVRational av_mul_q(AVRational b, AVRational c) av_const;
++
++/**
++ * Divide one rational by another.
++ * @param b First rational
++ * @param c Second rational
++ * @return b/c
++ */
++AVRational av_div_q(AVRational b, AVRational c) av_const;
++
++/**
++ * Add two rationals.
++ * @param b First rational
++ * @param c Second rational
++ * @return b+c
++ */
++AVRational av_add_q(AVRational b, AVRational c) av_const;
++
++/**
++ * Subtract one rational from another.
++ * @param b First rational
++ * @param c Second rational
++ * @return b-c
++ */
++AVRational av_sub_q(AVRational b, AVRational c) av_const;
++
++/**
++ * Invert a rational.
++ * @param q value
++ * @return 1 / q
++ */
++static av_always_inline AVRational av_inv_q(AVRational q)
++{
++    AVRational r = { q.den, q.num };
++    return r;
++}
++
++/**
++ * Convert a double precision floating point number to a rational.
++ *
++ * In case of infinity, the returned value is expressed as `{1, 0}` or
++ * `{-1, 0}` depending on the sign.
++ *
++ * In general rational numbers with |num| <= 1<<26 && |den| <= 1<<26
++ * can be recovered exactly from their double representation.
++ * (no exceptions were found within 1B random ones)
++ *
++ * @param d   `double` to convert
++ * @param max Maximum allowed numerator and denominator
++ * @return `d` in AVRational form
++ * @see av_q2d()
++ */
++AVRational av_d2q(double d, int max) av_const;
++
++/**
++ * Find which of the two rationals is closer to another rational.
++ *
++ * @param q     Rational to be compared against
++ * @param q1    Rational to be tested
++ * @param q2    Rational to be tested
++ * @return One of the following values:
++ *         - 1 if `q1` is nearer to `q` than `q2`
++ *         - -1 if `q2` is nearer to `q` than `q1`
++ *         - 0 if they have the same distance
++ */
++int av_nearer_q(AVRational q, AVRational q1, AVRational q2);
++
++/**
++ * Find the value in a list of rationals nearest a given reference rational.
++ *
++ * @param q      Reference rational
++ * @param q_list Array of rationals terminated by `{0, 0}`
++ * @return Index of the nearest value found in the array
++ */
++int av_find_nearest_q_idx(AVRational q, const AVRational* q_list);
++
++/**
++ * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point
++ * format.
++ *
++ * @param q Rational to be converted
++ * @return Equivalent floating-point value, expressed as an unsigned 32-bit
++ *         integer.
++ * @note The returned value is platform-indepedant.
++ */
++uint32_t av_q2intfloat(AVRational q);
++
++/**
++ * Return the best rational so that a and b are multiple of it.
++ * If the resulting denominator is larger than max_den, return def.
++ */
++AVRational av_gcd_q(AVRational a, AVRational b, int max_den, AVRational def);
++
++/**
++ * @}
++ */
++
++#endif /* AVUTIL_RATIONAL_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/samplefmt.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/samplefmt.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/samplefmt.h.ffmpeg9	2026-09-07 12:23:47.679079532 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/samplefmt.h	2026-09-07 12:23:47.679018644 +0200
+@@ -0,0 +1,268 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General 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 in case of other errors
++ */
++char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt);
++
++/**
++ * Return number of bytes per sample.
++ *
++ * @param sample_fmt the sample format
++ * @return number of bytes per sample or zero if unknown for the given
++ * sample format
++ */
++int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt);
++
++/**
++ * Check if the sample format is planar.
++ *
++ * @param sample_fmt the sample format to inspect
++ * @return 1 if the sample format is planar, 0 if it is interleaved
++ */
++int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt);
++
++/**
++ * Get the required buffer size for the given audio parameters.
++ *
++ * @param[out] linesize calculated linesize, may be NULL
++ * @param nb_channels   the number of channels
++ * @param nb_samples    the number of samples in a single channel
++ * @param sample_fmt    the sample format
++ * @param align         buffer size alignment (0 = default, 1 = no alignment)
++ * @return              required buffer size, or negative error code on failure
++ */
++int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples,
++                               enum AVSampleFormat sample_fmt, int align);
++
++/**
++ * @}
++ *
++ * @defgroup lavu_sampmanip Samples manipulation
++ *
++ * Functions that manipulate audio samples
++ * @{
++ */
++
++/**
++ * Fill plane data pointers and linesize for samples with sample
++ * format sample_fmt.
++ *
++ * The audio_data array is filled with the pointers to the samples data planes:
++ * for planar, set the start point of each channel's data within the buffer,
++ * for packed, set the start point of the entire buffer only.
++ *
++ * The value pointed to by linesize is set to the aligned size of each
++ * channel's data buffer for planar layout, or to the aligned size of the
++ * buffer for all channels for packed layout.
++ *
++ * The buffer in buf must be big enough to contain all the samples
++ * (use av_samples_get_buffer_size() to compute its minimum size),
++ * otherwise the audio_data pointers will point to invalid data.
++ *
++ * @see enum AVSampleFormat
++ * The documentation for AVSampleFormat describes the data layout.
++ *
++ * @param[out] audio_data  array to be filled with the pointer for each channel
++ * @param[out] linesize    calculated linesize, may be NULL
++ * @param buf              the pointer to a buffer containing the samples
++ * @param nb_channels      the number of channels
++ * @param nb_samples       the number of samples in a single channel
++ * @param sample_fmt       the sample format
++ * @param align            buffer size alignment (0 = default, 1 = no alignment)
++ * @return                 minimum size in bytes required for the buffer on success,
++ *                         or a negative error code on failure
++ */
++int av_samples_fill_arrays(uint8_t **audio_data, int *linesize,
++                           const uint8_t *buf,
++                           int nb_channels, int nb_samples,
++                           enum AVSampleFormat sample_fmt, int align);
++
++/**
++ * Allocate a samples buffer for nb_samples samples, and fill data pointers and
++ * linesize accordingly.
++ * The allocated samples buffer can be freed by using av_freep(&audio_data[0])
++ * Allocated data will be initialized to silence.
++ *
++ * @see enum AVSampleFormat
++ * The documentation for AVSampleFormat describes the data layout.
++ *
++ * @param[out] audio_data  array to be filled with the pointer for each channel
++ * @param[out] linesize    aligned size for audio buffer(s), may be NULL
++ * @param nb_channels      number of audio channels
++ * @param nb_samples       number of samples per channel
++ * @param sample_fmt       the sample format
++ * @param align            buffer size alignment (0 = default, 1 = no alignment)
++ * @return                 >=0 on success or a negative error code on failure
++ * @todo return the size of the allocated buffer in case of success at the next bump
++ * @see av_samples_fill_arrays()
++ * @see av_samples_alloc_array_and_samples()
++ */
++int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels,
++                     int nb_samples, enum AVSampleFormat sample_fmt, int align);
++
++/**
++ * Allocate a data pointers array, samples buffer for nb_samples
++ * samples, and fill data pointers and linesize accordingly.
++ *
++ * This is the same as av_samples_alloc(), but also allocates the data
++ * pointers array.
++ *
++ * @see av_samples_alloc()
++ */
++int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels,
++                                       int nb_samples, enum AVSampleFormat sample_fmt, int align);
++
++/**
++ * Copy samples from src to dst.
++ *
++ * @param dst destination array of pointers to data planes
++ * @param src source array of pointers to data planes
++ * @param dst_offset offset in samples at which the data will be written to dst
++ * @param src_offset offset in samples at which the data will be read from src
++ * @param nb_samples number of samples to be copied
++ * @param nb_channels number of audio channels
++ * @param sample_fmt audio sample format
++ */
++int av_samples_copy(uint8_t * const *dst, uint8_t * const *src, int dst_offset,
++                    int src_offset, int nb_samples, int nb_channels,
++                    enum AVSampleFormat sample_fmt);
++
++/**
++ * Fill an audio buffer with silence.
++ *
++ * @param audio_data  array of pointers to data planes
++ * @param offset      offset in samples at which to start filling
++ * @param nb_samples  number of samples to fill
++ * @param nb_channels number of audio channels
++ * @param sample_fmt  audio sample format
++ */
++int av_samples_set_silence(uint8_t * const *audio_data, int offset, int nb_samples,
++                           int nb_channels, enum AVSampleFormat sample_fmt);
++
++/**
++ * @}
++ * @}
++ */
++#endif /* AVUTIL_SAMPLEFMT_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/version.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/version.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/version.h.ffmpeg9	2026-09-07 12:23:47.679170569 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libavutil/version.h	2026-09-07 12:23:47.679126742 +0200
+@@ -0,0 +1,118 @@
++/*
++ * copyright (c) 2003 Fabrice Bellard
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++/**
++ * @file
++ * @ingroup lavu
++ * Libavutil version macros
++ */
++
++#ifndef AVUTIL_VERSION_H
++#define AVUTIL_VERSION_H
++
++#include "macros.h"
++
++/**
++ * @addtogroup version_utils
++ *
++ * Useful to check and match library version in order to maintain
++ * backward compatibility.
++ *
++ * The FFmpeg libraries follow a versioning scheme very similar to
++ * Semantic Versioning (http://semver.org/)
++ * The difference is that the component called PATCH is called MICRO in FFmpeg
++ * and its value is reset to 100 instead of 0 to keep it above or equal to 100.
++ * Also we do not increase MICRO for every bugfix or change in git master.
++ *
++ * Prior to FFmpeg 3.2 point releases did not change any lib version number to
++ * avoid aliassing different git master checkouts.
++ * Starting with FFmpeg 3.2, the released library versions will occupy
++ * a separate MAJOR.MINOR that is not used on the master development branch.
++ * That is if we branch a release of master 55.10.123 we will bump to 55.11.100
++ * for the release and master will continue at 55.12.100 after it. Each new
++ * point release will then bump the MICRO improving the usefulness of the lib
++ * versions.
++ *
++ * @{
++ */
++
++#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c))
++#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c
++#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
++
++/**
++ * Extract version components from the full ::AV_VERSION_INT int as returned
++ * by functions like ::avformat_version() and ::avcodec_version()
++ */
++#define AV_VERSION_MAJOR(a) ((a) >> 16)
++#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8)
++#define AV_VERSION_MICRO(a) ((a) & 0xFF)
++
++/**
++ * @}
++ */
++
++/**
++ * @defgroup lavu_ver Version and Build diagnostics
++ *
++ * Macros and function useful to check at compile time and at runtime
++ * which version of libavutil is in use.
++ *
++ * @{
++ */
++
++#define LIBAVUTIL_VERSION_MAJOR  61
++#define LIBAVUTIL_VERSION_MINOR   1
++#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_CPU_FLAG_FORCE           (LIBAVUTIL_VERSION_MAJOR < 62)
++#define FF_API_DOVI_L11_INVALID_PROPS   (LIBAVUTIL_VERSION_MAJOR < 62)
++#define FF_API_ASSERT_FPU               (LIBAVUTIL_VERSION_MAJOR < 62)
++#define FF_API_VULKAN_SYNC_QUEUES       (LIBAVUTIL_VERSION_MAJOR < 62)
++
++/**
++ * @}
++ * @}
++ */
++
++#endif /* AVUTIL_VERSION_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/swresample.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/swresample.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/swresample.h.ffmpeg9	2026-09-07 12:23:47.679397716 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/swresample.h	2026-09-07 12:23:47.679367008 +0200
+@@ -0,0 +1,587 @@
++/*
++ * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at)
++ *
++ * This file is part of libswresample
++ *
++ * libswresample is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * libswresample is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with libswresample; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef SWRESAMPLE_SWRESAMPLE_H
++#define SWRESAMPLE_SWRESAMPLE_H
++
++/**
++ * @file
++ * @ingroup lswr
++ * libswresample public header
++ */
++
++/**
++ * @defgroup lswr libswresample
++ * @{
++ *
++ * Audio resampling, sample format conversion and mixing library.
++ *
++ * Interaction with lswr is done through SwrContext, which is
++ * allocated with swr_alloc() or swr_alloc_set_opts2(). It is opaque, so all parameters
++ * must be set with the @ref avoptions API.
++ *
++ * The first thing you will need to do in order to use lswr is to allocate
++ * SwrContext. This can be done with swr_alloc() or swr_alloc_set_opts2(). If you
++ * are using the former, you must set options through the @ref avoptions API.
++ * The latter function provides the same feature, but it allows you to set some
++ * common options in the same statement.
++ *
++ * For example the following code will setup conversion from planar float sample
++ * format to interleaved signed 16-bit integer, downsampling from 48kHz to
++ * 44.1kHz and downmixing from 5.1 channels to stereo (using the default mixing
++ * matrix). This is using the swr_alloc() function.
++ * @code
++ * SwrContext *swr = swr_alloc();
++ * av_opt_set_chlayout(swr, "in_chlayout", &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1, 0);
++ * av_opt_set_chlayout(swr, "out_chlayout", &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO, 0);
++ * av_opt_set_int(swr, "in_sample_rate",     48000,                0);
++ * av_opt_set_int(swr, "out_sample_rate",    44100,                0);
++ * av_opt_set_sample_fmt(swr, "in_sample_fmt",  AV_SAMPLE_FMT_FLTP, 0);
++ * av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16,  0);
++ * @endcode
++ *
++ * The same job can be done using swr_alloc_set_opts2() as well:
++ * @code
++ * SwrContext *swr = NULL;
++ * int ret = swr_alloc_set_opts2(&swr,         // we're allocating a new context
++ *                       &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO, // out_ch_layout
++ *                       AV_SAMPLE_FMT_S16,    // out_sample_fmt
++ *                       44100,                // out_sample_rate
++ *                       &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1, // in_ch_layout
++ *                       AV_SAMPLE_FMT_FLTP,   // in_sample_fmt
++ *                       48000,                // in_sample_rate
++ *                       0,                    // log_offset
++ *                       NULL);                // log_ctx
++ * @endcode
++ *
++ * Once all values have been set, it must be initialized with swr_init(). If
++ * you need to change the conversion parameters, you can change the parameters
++ * using @ref avoptions, as described above in the first example; or by using
++ * swr_alloc_set_opts2(), but with the first argument the allocated context.
++ * You must then call swr_init() again.
++ *
++ * The conversion itself is done by repeatedly calling swr_convert().
++ * Note that the samples may get buffered in swr if you provide insufficient
++ * output space or if sample rate conversion is done, which requires "future"
++ * samples. Samples that do not require future input can be retrieved at any
++ * time by using swr_convert() (in_count can be set to 0).
++ * At the end of conversion the resampling buffer can be flushed by calling
++ * swr_convert() with NULL in and 0 in_count.
++ *
++ * The samples used in the conversion process can be managed with the libavutil
++ * @ref lavu_sampmanip "samples manipulation" API, including av_samples_alloc()
++ * function used in the following example.
++ *
++ * The delay between input and output, can at any time be found by using
++ * swr_get_delay().
++ *
++ * The following code demonstrates the conversion loop assuming the parameters
++ * from above and caller-defined functions get_input() and handle_output():
++ * @code
++ * uint8_t **input;
++ * int in_samples;
++ *
++ * while (get_input(&input, &in_samples)) {
++ *     uint8_t *output;
++ *     int out_samples = av_rescale_rnd(swr_get_delay(swr, 48000) +
++ *                                      in_samples, 44100, 48000, AV_ROUND_UP);
++ *     av_samples_alloc(&output, NULL, 2, out_samples,
++ *                      AV_SAMPLE_FMT_S16, 0);
++ *     out_samples = swr_convert(swr, &output, out_samples,
++ *                                      input, in_samples);
++ *     handle_output(output, out_samples);
++ *     av_freep(&output);
++ * }
++ * @endcode
++ *
++ * When the conversion is finished, the conversion
++ * context and everything associated with it must be freed with swr_free().
++ * A swr_close() function is also available, but it exists mainly for
++ * compatibility with libavresample, and is not required to be called.
++ *
++ * There will be no memory leak if the data is not completely flushed before
++ * swr_free().
++ */
++
++#include <stdint.h>
++#include "libavutil/channel_layout.h"
++#include "libavutil/frame.h"
++#include "libavutil/samplefmt.h"
++
++#include "libswresample/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 "libswresample/version.h"
++#endif
++
++/**
++ * @name Option constants
++ * These constants are used for the @ref avoptions interface for lswr.
++ * @{
++ *
++ */
++
++#define SWR_FLAG_RESAMPLE 1 ///< Force resampling even if equal sample rate
++//TODO use int resample ?
++//long term TODO can we enable this dynamically?
++
++/** Dithering algorithms */
++enum SwrDitherType {
++    SWR_DITHER_NONE = 0,
++    SWR_DITHER_RECTANGULAR,
++    SWR_DITHER_TRIANGULAR,
++    SWR_DITHER_TRIANGULAR_HIGHPASS,
++
++    SWR_DITHER_NS = 64,         ///< not part of API/ABI
++    SWR_DITHER_NS_LIPSHITZ,
++    SWR_DITHER_NS_F_WEIGHTED,
++    SWR_DITHER_NS_MODIFIED_E_WEIGHTED,
++    SWR_DITHER_NS_IMPROVED_E_WEIGHTED,
++    SWR_DITHER_NS_SHIBATA,
++    SWR_DITHER_NS_LOW_SHIBATA,
++    SWR_DITHER_NS_HIGH_SHIBATA,
++    SWR_DITHER_NB,              ///< not part of API/ABI
++};
++
++/** Resampling Engines */
++enum SwrEngine {
++    SWR_ENGINE_SWR,             /**< SW Resampler */
++    SWR_ENGINE_SOXR,            /**< SoX Resampler */
++    SWR_ENGINE_NB,              ///< not part of API/ABI
++};
++
++/** Resampling Filter Types */
++enum SwrFilterType {
++    SWR_FILTER_TYPE_CUBIC,              /**< Cubic */
++    SWR_FILTER_TYPE_BLACKMAN_NUTTALL,   /**< Blackman Nuttall windowed sinc */
++    SWR_FILTER_TYPE_KAISER,             /**< Kaiser windowed sinc */
++};
++
++/**
++ * @}
++ */
++
++/**
++ * The libswresample context. Unlike libavcodec and libavformat, this structure
++ * is opaque. This means that if you would like to set options, you must use
++ * the @ref avoptions API and cannot directly set values to members of the
++ * structure.
++ */
++typedef struct SwrContext SwrContext;
++
++/**
++ * Get the AVClass for SwrContext. It can be used in combination with
++ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
++ *
++ * @see av_opt_find().
++ * @return the AVClass of SwrContext
++ */
++const AVClass *swr_get_class(void);
++
++/**
++ * @name SwrContext constructor functions
++ * @{
++ */
++
++/**
++ * Allocate SwrContext.
++ *
++ * If you use this function you will need to set the parameters (manually or
++ * with swr_alloc_set_opts2()) before calling swr_init().
++ *
++ * @see swr_alloc_set_opts2(), swr_init(), swr_free()
++ * @return NULL on error, allocated context otherwise
++ */
++struct SwrContext *swr_alloc(void);
++
++/**
++ * Initialize context after user parameters have been set.
++ * @note The context must be configured using the AVOption API.
++ *
++ * @see av_opt_set_int()
++ * @see av_opt_set_dict()
++ *
++ * @param[in,out]   s Swr context to initialize
++ * @return AVERROR error code in case of failure.
++ */
++int swr_init(struct SwrContext *s);
++
++/**
++ * Check whether an swr context has been initialized or not.
++ *
++ * @param[in]       s Swr context to check
++ * @see swr_init()
++ * @return positive if it has been initialized, 0 if not initialized
++ */
++int swr_is_initialized(struct SwrContext *s);
++
++/**
++ * Allocate SwrContext if needed and set/reset common parameters.
++ *
++ * This function does not require *ps to be allocated with swr_alloc(). On the
++ * other hand, swr_alloc() can use swr_alloc_set_opts2() to set the parameters
++ * on the allocated context.
++ *
++ * @param ps              Pointer to an existing Swr context if available, or to NULL if not.
++ *                        On success, *ps will be set to the allocated context.
++ * @param out_ch_layout   output channel layout (e.g. AV_CHANNEL_LAYOUT_*)
++ * @param out_sample_fmt  output sample format (AV_SAMPLE_FMT_*).
++ * @param out_sample_rate output sample rate (frequency in Hz)
++ * @param in_ch_layout    input channel layout (e.g. AV_CHANNEL_LAYOUT_*)
++ * @param in_sample_fmt   input sample format (AV_SAMPLE_FMT_*).
++ * @param in_sample_rate  input sample rate (frequency in Hz)
++ * @param log_offset      logging level offset
++ * @param log_ctx         parent logging context, can be NULL
++ *
++ * @see swr_init(), swr_free()
++ * @return 0 on success, a negative AVERROR code on error.
++ *         On error, the Swr context is freed and *ps set to NULL.
++ */
++int swr_alloc_set_opts2(struct SwrContext **ps,
++                        const AVChannelLayout *out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,
++                        const AVChannelLayout *in_ch_layout, enum AVSampleFormat  in_sample_fmt, int  in_sample_rate,
++                        int log_offset, void *log_ctx);
++/**
++ * @}
++ *
++ * @name SwrContext destructor functions
++ * @{
++ */
++
++/**
++ * Free the given SwrContext and set the pointer to NULL.
++ *
++ * @param[in] s a pointer to a pointer to Swr context
++ */
++void swr_free(struct SwrContext **s);
++
++/**
++ * Closes the context so that swr_is_initialized() returns 0.
++ *
++ * The context can be brought back to life by running swr_init(),
++ * swr_init() can also be used without swr_close().
++ * This function is mainly provided for simplifying the usecase
++ * where one tries to support libavresample and libswresample.
++ *
++ * @param[in,out] s Swr context to be closed
++ */
++void swr_close(struct SwrContext *s);
++
++/**
++ * @}
++ *
++ * @name Core conversion functions
++ * @{
++ */
++
++/** Convert audio.
++ *
++ * in and in_count can be set to 0 to flush the last few samples out at the
++ * end.
++ *
++ * If more input is provided than output space, then the input will be buffered.
++ * You can avoid this buffering by using swr_get_out_samples() to retrieve an
++ * upper bound on the required number of output samples for the given number of
++ * input samples. Conversion will run directly without copying whenever possible.
++ *
++ * @param s         allocated Swr context, with parameters set
++ * @param out       output buffers, only the first one need be set in case of packed audio
++ * @param out_count amount of space available for output in samples per channel
++ * @param in        input buffers, only the first one need to be set in case of packed audio
++ * @param in_count  number of input samples available in one channel
++ *
++ * @return number of samples output per channel, negative value on error
++ */
++int swr_convert(struct SwrContext *s, uint8_t * const *out, int out_count,
++                                const uint8_t * const *in , int in_count);
++
++/**
++ * Convert the next timestamp from input to output
++ * timestamps are in 1/(in_sample_rate * out_sample_rate) units.
++ *
++ * @note There are 2 slightly differently behaving modes.
++ *       @li When automatic timestamp compensation is not used, (min_compensation >= FLT_MAX)
++ *              in this case timestamps will be passed through with delays compensated
++ *       @li When automatic timestamp compensation is used, (min_compensation < FLT_MAX)
++ *              in this case the output timestamps will match output sample numbers.
++ *              See ffmpeg-resampler(1) for the two modes of compensation.
++ *
++ * @param[in] s     initialized Swr context
++ * @param[in] pts   timestamp for the next input sample, INT64_MIN if unknown
++ * @see swr_set_compensation(), swr_drop_output(), and swr_inject_silence() are
++ *      function used internally for timestamp compensation.
++ * @return the output timestamp for the next output sample
++ */
++int64_t swr_next_pts(struct SwrContext *s, int64_t pts);
++
++/**
++ * @}
++ *
++ * @name Low-level option setting functions
++ * These functions provide a means to set low-level options that is not possible
++ * with the AVOption API.
++ * @{
++ */
++
++/**
++ * Activate resampling compensation ("soft" compensation). This function is
++ * internally called when needed in swr_next_pts().
++ *
++ * @param[in,out] s             allocated Swr context. If it is not initialized,
++ *                              or SWR_FLAG_RESAMPLE is not set, swr_init() is
++ *                              called with the flag set.
++ * @param[in]     sample_delta  delta in PTS per sample
++ * @param[in]     compensation_distance number of samples to compensate for
++ * @return    >= 0 on success, AVERROR error codes if:
++ *            @li @c s is NULL,
++ *            @li @c compensation_distance is less than 0,
++ *            @li @c compensation_distance is 0 but sample_delta is not,
++ *            @li compensation unsupported by resampler, or
++ *            @li swr_init() fails when called.
++ */
++int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance);
++
++/**
++ * Set a customized input channel mapping.
++ *
++ * @param[in,out] s           allocated Swr context, not yet initialized
++ * @param[in]     channel_map customized input channel mapping (array of channel
++ *                            indexes, -1 for a muted channel)
++ * @return >= 0 on success, or AVERROR error code in case of failure.
++ */
++int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map);
++
++/**
++ * Generate a channel mixing matrix.
++ *
++ * This function is the one used internally by libswresample for building the
++ * default mixing matrix. It is made public just as a utility function for
++ * building custom matrices.
++ *
++ * @param in_layout           input channel layout
++ * @param out_layout          output channel layout
++ * @param center_mix_level    mix level for the center channel
++ * @param surround_mix_level  mix level for the surround channel(s)
++ * @param lfe_mix_level       mix level for the low-frequency effects channel
++ * @param rematrix_maxval     if 1.0, coefficients will be normalized to prevent
++ *                            overflow. if INT_MAX, coefficients will not be
++ *                            normalized.
++ * @param[out] matrix         mixing coefficients; matrix[i + stride * o] is
++ *                            the weight of input channel i in output channel o.
++ * @param stride              distance between adjacent input channels in the
++ *                            matrix array
++ * @param matrix_encoding     matrixed stereo downmix mode (e.g. dplii)
++ * @param log_ctx             parent logging context, can be NULL
++ * @return                    0 on success, negative AVERROR code on failure
++ */
++int swr_build_matrix2(const AVChannelLayout *in_layout, const AVChannelLayout *out_layout,
++                      double center_mix_level, double surround_mix_level,
++                      double lfe_mix_level, double maxval,
++                      double rematrix_volume, double *matrix,
++                      ptrdiff_t stride, enum AVMatrixEncoding matrix_encoding,
++                      void *log_context);
++
++/**
++ * Set a customized remix matrix.
++ *
++ * @param s       allocated Swr context, not yet initialized
++ * @param matrix  remix coefficients; matrix[i + stride * o] is
++ *                the weight of input channel i in output channel o
++ * @param stride  offset between lines of the matrix
++ * @return  >= 0 on success, or AVERROR error code in case of failure.
++ */
++int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride);
++
++/**
++ * @}
++ *
++ * @name Sample handling functions
++ * @{
++ */
++
++/**
++ * Drops the specified number of output samples.
++ *
++ * This function, along with swr_inject_silence(), is called by swr_next_pts()
++ * if needed for "hard" compensation.
++ *
++ * @param s     allocated Swr context
++ * @param count number of samples to be dropped
++ *
++ * @return >= 0 on success, or a negative AVERROR code on failure
++ */
++int swr_drop_output(struct SwrContext *s, int count);
++
++/**
++ * Injects the specified number of silence samples.
++ *
++ * This function, along with swr_drop_output(), is called by swr_next_pts()
++ * if needed for "hard" compensation.
++ *
++ * @param s     allocated Swr context
++ * @param count number of samples to be dropped
++ *
++ * @return >= 0 on success, or a negative AVERROR code on failure
++ */
++int swr_inject_silence(struct SwrContext *s, int count);
++
++/**
++ * Gets the delay the next input sample will experience relative to the next output sample.
++ *
++ * Swresample can buffer data if more input has been provided than available
++ * output space, also converting between sample rates needs a delay.
++ * This function returns the sum of all such delays.
++ * The exact delay is not necessarily an integer value in either input or
++ * output sample rate. Especially when downsampling by a large value, the
++ * output sample rate may be a poor choice to represent the delay, similarly
++ * for upsampling and the input sample rate.
++ *
++ * @param s     swr context
++ * @param base  timebase in which the returned delay will be:
++ *              @li if it's set to 1 the returned delay is in seconds
++ *              @li if it's set to 1000 the returned delay is in milliseconds
++ *              @li if it's set to the input sample rate then the returned
++ *                  delay is in input samples
++ *              @li if it's set to the output sample rate then the returned
++ *                  delay is in output samples
++ *              @li if it's the least common multiple of in_sample_rate and
++ *                  out_sample_rate then an exact rounding-free delay will be
++ *                  returned
++ * @returns     the delay in 1 / @c base units.
++ */
++int64_t swr_get_delay(struct SwrContext *s, int64_t base);
++
++/**
++ * Find an upper bound on the number of samples that the next swr_convert
++ * call will output, if called with in_samples of input samples. This
++ * depends on the internal state, and anything changing the internal state
++ * (like further swr_convert() calls) will may change the number of samples
++ * swr_get_out_samples() returns for the same number of input samples.
++ *
++ * @param in_samples    number of input samples.
++ * @note any call to swr_inject_silence(), swr_convert(), swr_next_pts()
++ *       or swr_set_compensation() invalidates this limit
++ * @note it is recommended to pass the correct available buffer size
++ *       to all functions like swr_convert() even if swr_get_out_samples()
++ *       indicates that less would be used.
++ * @returns an upper bound on the number of samples that the next swr_convert
++ *          will output or a negative value to indicate an error
++ */
++int swr_get_out_samples(struct SwrContext *s, int in_samples);
++
++/**
++ * @}
++ *
++ * @name Configuration accessors
++ * @{
++ */
++
++/**
++ * Return the @ref LIBSWRESAMPLE_VERSION_INT constant.
++ *
++ * This is useful to check if the build-time libswresample has the same version
++ * as the run-time one.
++ *
++ * @returns     the unsigned int-typed version
++ */
++unsigned swresample_version(void);
++
++/**
++ * Return the swr build-time configuration.
++ *
++ * @returns     the build-time @c ./configure flags
++ */
++const char *swresample_configuration(void);
++
++/**
++ * Return the swr license.
++ *
++ * @returns     the license of libswresample, determined at build-time
++ */
++const char *swresample_license(void);
++
++/**
++ * @}
++ *
++ * @name AVFrame based API
++ * @{
++ */
++
++/**
++ * Convert the samples in the input AVFrame and write them to the output AVFrame.
++ *
++ * Input and output AVFrames must have channel_layout, sample_rate and format set.
++ *
++ * If the output AVFrame does not have the data pointers allocated the nb_samples
++ * field will be set using av_frame_get_buffer()
++ * is called to allocate the frame.
++ *
++ * The output AVFrame can be NULL or have fewer allocated samples than required.
++ * In this case, any remaining samples not written to the output will be added
++ * to an internal FIFO buffer, to be returned at the next call to this function
++ * or to swr_convert().
++ *
++ * If converting sample rate, there may be data remaining in the internal
++ * resampling delay buffer. swr_get_delay() tells the number of
++ * remaining samples. To get this data as output, call this function or
++ * swr_convert() with NULL input.
++ *
++ * If the SwrContext configuration does not match the output and
++ * input AVFrame settings the conversion does not take place and depending on
++ * which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED
++ * or the result of a bitwise-OR of them is returned.
++ *
++ * @see swr_delay()
++ * @see swr_convert()
++ * @see swr_get_delay()
++ *
++ * @param swr             audio resample context
++ * @param output          output AVFrame
++ * @param input           input AVFrame
++ * @return                0 on success, AVERROR on failure or nonmatching
++ *                        configuration.
++ */
++int swr_convert_frame(SwrContext *swr,
++                      AVFrame *output, const AVFrame *input);
++
++/**
++ * Configure or reconfigure the SwrContext using the information
++ * provided by the AVFrames.
++ *
++ * The original resampling context is reset even on failure.
++ * The function calls swr_close() internally if the context is open.
++ *
++ * @see swr_close();
++ *
++ * @param swr             audio resample context
++ * @param out             output AVFrame
++ * @param in              input AVFrame
++ * @return                0 on success, AVERROR on failure.
++ */
++int swr_config_frame(SwrContext *swr, const AVFrame *out, const AVFrame *in);
++
++/**
++ * @}
++ * @}
++ */
++
++#endif /* SWRESAMPLE_SWRESAMPLE_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/version.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/version.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/version.h.ffmpeg9	2026-09-07 12:23:47.679479410 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/version.h	2026-09-07 12:23:47.679456749 +0200
+@@ -0,0 +1,46 @@
++/*
++ * Version macros.
++ *
++ * This file is part of libswresample
++ *
++ * libswresample is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * libswresample is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with libswresample; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef SWRESAMPLE_VERSION_H
++#define SWRESAMPLE_VERSION_H
++
++/**
++ * @file
++ * Libswresample version macros
++ */
++
++#include "libavutil/version.h"
++
++#include "version_major.h"
++
++#define LIBSWRESAMPLE_VERSION_MINOR   1
++#define LIBSWRESAMPLE_VERSION_MICRO 100
++
++#define LIBSWRESAMPLE_VERSION_INT  AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \
++                                                  LIBSWRESAMPLE_VERSION_MINOR, \
++                                                  LIBSWRESAMPLE_VERSION_MICRO)
++#define LIBSWRESAMPLE_VERSION      AV_VERSION(LIBSWRESAMPLE_VERSION_MAJOR, \
++                                              LIBSWRESAMPLE_VERSION_MINOR, \
++                                              LIBSWRESAMPLE_VERSION_MICRO)
++#define LIBSWRESAMPLE_BUILD        LIBSWRESAMPLE_VERSION_INT
++
++#define LIBSWRESAMPLE_IDENT        "SwR" AV_STRINGIFY(LIBSWRESAMPLE_VERSION)
++
++#endif /* SWRESAMPLE_VERSION_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/version_major.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/version_major.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/version_major.h.ffmpeg9	2026-09-07 12:23:47.679549810 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswresample/version_major.h	2026-09-07 12:23:47.679529652 +0200
+@@ -0,0 +1,31 @@
++/*
++ * Version macros.
++ *
++ * This file is part of libswresample
++ *
++ * libswresample is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * libswresample is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with libswresample; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef SWRESAMPLE_VERSION_MAJOR_H
++#define SWRESAMPLE_VERSION_MAJOR_H
++
++/**
++ * @file
++ * Libswresample version macros
++ */
++
++#define LIBSWRESAMPLE_VERSION_MAJOR   7
++
++#endif /* SWRESAMPLE_VERSION_MAJOR_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/swscale.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/swscale.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/swscale.h.ffmpeg9	2026-09-07 12:23:47.679836083 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/swscale.h	2026-09-07 12:23:47.679789901 +0200
+@@ -0,0 +1,771 @@
++/*
++ * Copyright (C) 2024 Niklas Haas
++ * Copyright (C) 2001-2011 Michael Niedermayer <michaelni@gmx.at>
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef SWSCALE_SWSCALE_H
++#define SWSCALE_SWSCALE_H
++
++/**
++ * @file
++ * @ingroup libsws
++ * external API header
++ */
++
++#include <stdint.h>
++
++#include "libavutil/avutil.h"
++#include "libavutil/frame.h"
++#include "libavutil/log.h"
++#include "libavutil/pixfmt.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 libsws libswscale
++ * Color conversion and scaling library.
++ *
++ * @{
++ *
++ * Return the LIBSWSCALE_VERSION_INT constant.
++ */
++unsigned swscale_version(void);
++
++/**
++ * Return the libswscale build-time configuration.
++ */
++const char *swscale_configuration(void);
++
++/**
++ * Return the libswscale license.
++ */
++const char *swscale_license(void);
++
++/**
++ * Get the AVClass for SwsContext. It can be used in combination with
++ * AV_OPT_SEARCH_FAKE_OBJ for examining options.
++ *
++ * @see av_opt_find().
++ */
++const AVClass *sws_get_class(void);
++
++/******************************
++ * Flags and quality settings *
++ ******************************/
++
++typedef enum SwsDither {
++    SWS_DITHER_NONE = 0, /* disable dithering */
++    SWS_DITHER_AUTO,     /* auto-select from preset */
++    SWS_DITHER_BAYER,    /* ordered dither matrix */
++    SWS_DITHER_ED,       /* error diffusion */
++    SWS_DITHER_A_DITHER, /* arithmetic addition */
++    SWS_DITHER_X_DITHER, /* arithmetic xor */
++    SWS_DITHER_NB,       /* not part of the ABI */
++    SWS_DITHER_MAX_ENUM = 0x7FFFFFFF, /* force size to 32 bits, not a valid dither type */
++} SwsDither;
++
++typedef enum SwsAlphaBlend {
++    SWS_ALPHA_BLEND_NONE = 0,
++    SWS_ALPHA_BLEND_UNIFORM,
++    SWS_ALPHA_BLEND_CHECKERBOARD,
++    SWS_ALPHA_BLEND_NB,  /* not part of the ABI */
++    SWS_ALPHA_BLEND_MAX_ENUM = 0x7FFFFFFF, /* force size to 32 bits, not a valid blend mode */
++} SwsAlphaBlend;
++
++typedef enum SwsScaler {
++    SWS_SCALE_AUTO = 0,
++    SWS_SCALE_BILINEAR, ///< bilinear filtering
++    SWS_SCALE_BICUBIC,  ///< 2-tap cubic BC-spline
++    SWS_SCALE_POINT,    ///< nearest neighbor (point sampling)
++    SWS_SCALE_AREA,     ///< area averaging
++    SWS_SCALE_GAUSSIAN, ///< 2-tap gaussian approximation
++    SWS_SCALE_SINC,     ///< unwindowed sinc
++    SWS_SCALE_LANCZOS,  ///< 3-tap sinc/sinc
++    SWS_SCALE_SPLINE,   ///< unwindowned natural cubic spline
++    SWS_SCALE_NB,       ///< not part of the ABI
++    SWS_SCALE_MAX_ENUM = 0x7FFFFFFF, ///< force size to 32 bits, not a valid filter type
++} SwsScaler;
++
++typedef enum SwsBackend {
++    /* Stable backends */
++    SWS_BACKEND_LEGACY      = (1 << 0), ///< Legacy bespoke format-specific code
++    SWS_BACKEND_STABLE      = SWS_BACKEND_LEGACY,
++
++    /* Unstable backends (auto-selected only if SWS_UNSTABLE is enabled) */
++    SWS_BACKEND_C           = (1 << 1), ///< Template-based C reference implementation
++    SWS_BACKEND_MEMCPY      = (1 << 2), ///< Fast path using libc memcpy() / memset()
++    SWS_BACKEND_X86         = (1 << 3), ///< Chained x86 SIMD kernels
++    SWS_BACKEND_AARCH64     = (1 << 4), ///< Chained AArch64 NEON kernels
++    SWS_BACKEND_SPIRV       = (1 << 5), ///< Vulkan SPIR-V backend
++    SWS_BACKEND_UNSTABLE    = SWS_BACKEND_C |
++                              SWS_BACKEND_MEMCPY |
++                              SWS_BACKEND_X86 |
++                              SWS_BACKEND_AARCH64 |
++                              SWS_BACKEND_SPIRV,
++
++    SWS_BACKEND_ALL = SWS_BACKEND_STABLE | SWS_BACKEND_UNSTABLE,
++    SWS_BACKEND_MAX_ENUM = 0x7FFFFFFF, ///< force size to 32 bits, not a valid backend
++} SwsBackend;
++
++typedef enum SwsFlags {
++    /**
++     * Return an error on underspecified conversions. Without this flag,
++     * unspecified fields are defaulted to sensible values.
++     */
++    SWS_STRICT        = 1 << 11,
++
++    /**
++     * Emit verbose log of scaling parameters.
++     */
++    SWS_PRINT_INFO    = 1 << 12,
++
++    /**
++     * Perform full chroma upsampling when upscaling to RGB.
++     *
++     * For example, when converting 50x50 yuv420p to 100x100 rgba, setting this flag
++     * will scale the chroma plane from 25x25 to 100x100 (4:4:4), and then convert
++     * the 100x100 yuv444p image to rgba in the final output step.
++     *
++     * Without this flag, the chroma plane is instead scaled to 50x100 (4:2:2),
++     * with a single chroma sample being reused for both of the horizontally
++     * adjacent RGBA output pixels.
++     */
++    SWS_FULL_CHR_H_INT = 1 << 13,
++
++    /**
++     * Perform full chroma interpolation when downscaling RGB sources.
++     *
++     * For example, when converting a 100x100 rgba source to 50x50 yuv444p, setting
++     * this flag will generate a 100x100 (4:4:4) chroma plane, which is then
++     * downscaled to the required 50x50.
++     *
++     * Without this flag, the chroma plane is instead generated at 50x100 (dropping
++     * every other pixel), before then being downscaled to the required 50x50
++     * resolution.
++     */
++    SWS_FULL_CHR_H_INP = 1 << 14,
++
++    /**
++     * Force bit-exact output. This will prevent the use of platform-specific
++     * optimizations that may lead to slight difference in rounding, in favor
++     * of always maintaining exact bit output compatibility with the reference
++     * C code.
++     *
++     * Note: It is recommended to set both of these flags simultaneously.
++     */
++    SWS_ACCURATE_RND   = 1 << 18,
++    SWS_BITEXACT       = 1 << 19,
++
++    /**
++     * Allow/prefer using experimental new code paths. This may be faster,
++     * slower, or produce different output, with semantics subject to change
++     * at any point in time. For testing and debugging purposes only.
++     */
++    SWS_UNSTABLE = 1 << 20,
++
++    /**
++     * Deprecated flags.
++     */
++    SWS_DIRECT_BGR      = 1 << 15, ///< This flag has no effect
++    SWS_ERROR_DIFFUSION = 1 << 23, ///< Set `SwsContext.dither` instead
++
++    /**
++     * Scaler selection options. Only one may be active at a time.
++     * Deprecated in favor of `SwsContext.scaler`.
++     */
++    SWS_FAST_BILINEAR = 1 <<  0, ///< fast bilinear filtering
++    SWS_BILINEAR      = 1 <<  1, ///< bilinear filtering
++    SWS_BICUBIC       = 1 <<  2, ///< 2-tap cubic B-spline
++    SWS_X             = 1 <<  3, ///< experimental
++    SWS_POINT         = 1 <<  4, ///< nearest neighbor
++    SWS_AREA          = 1 <<  5, ///< area averaging
++    SWS_BICUBLIN      = 1 <<  6, ///< bicubic luma, bilinear chroma
++    SWS_GAUSS         = 1 <<  7, ///< gaussian approximation
++    SWS_SINC          = 1 <<  8, ///< unwindowed sinc
++    SWS_LANCZOS       = 1 <<  9, ///< 3-tap sinc/sinc
++    SWS_SPLINE        = 1 << 10, ///< unwindowed natural cubic spline
++} SwsFlags;
++
++typedef enum SwsIntent {
++    SWS_INTENT_PERCEPTUAL = 0,            ///< Perceptual tone mapping
++    SWS_INTENT_RELATIVE_COLORIMETRIC = 1, ///< Relative colorimetric clipping
++    SWS_INTENT_SATURATION = 2,            ///< Saturation mapping
++    SWS_INTENT_ABSOLUTE_COLORIMETRIC = 3, ///< Absolute colorimetric clipping
++    SWS_INTENT_NB, ///< not part of the ABI
++} SwsIntent;
++
++/***********************************
++ * Context creation and management *
++ ***********************************/
++
++/**
++ * 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. sizeof(SwsContext) is not part of the ABI.
++ */
++typedef struct SwsContext {
++    const AVClass *av_class;
++
++    /**
++     * Private data of the user, can be used to carry app specific stuff.
++     */
++    void *opaque;
++
++    /**
++     * Bitmask of SWS_*. See `SwsFlags` for details.
++     */
++    unsigned flags;
++
++    /**
++     * Extra parameters for fine-tuning certain scalers.
++     */
++#define SWS_NUM_SCALER_PARAMS 2
++    double scaler_params[SWS_NUM_SCALER_PARAMS];
++
++    /**
++     * How many threads to use for processing, or 0 for automatic selection.
++     */
++    int threads;
++
++    /**
++     * Dither mode.
++     */
++    SwsDither dither;
++
++    /**
++     * Alpha blending mode. See `SwsAlphaBlend` for details.
++     */
++    SwsAlphaBlend alpha_blend;
++
++    /**
++     * Use gamma correct scaling.
++     */
++    int gamma_flag;
++
++    /**
++     * Deprecated frame property overrides, for the legacy API only.
++     *
++     * Ignored by sws_scale_frame() when used in dynamic mode, in which
++     * case all properties are instead taken from the frame directly.
++     */
++    int src_w, src_h;  ///< Width and height of the source frame
++    int dst_w, dst_h;  ///< Width and height of the destination frame
++    int src_format;    ///< Source pixel format
++    int dst_format;    ///< Destination pixel format
++    int src_range;     ///< Source is full range
++    int dst_range;     ///< Destination is full range
++    int src_v_chr_pos; ///< Source vertical chroma position in luma grid / 256
++    int src_h_chr_pos; ///< Source horizontal chroma position
++    int dst_v_chr_pos; ///< Destination vertical chroma position
++    int dst_h_chr_pos; ///< Destination horizontal chroma position
++
++    /**
++     * Desired ICC intent for color space conversions.
++     */
++    int intent;
++
++    /**
++     * Scaling filter. If set to something other than SWS_SCALE_AUTO, this will
++     * override the filter implied by `SwsContext.flags`.
++     *
++     * Note: Does not affect the legacy (stateful) API.
++     */
++    SwsScaler scaler;
++
++    /**
++     * Scaler used specifically for up/downsampling subsampled (chroma) planes.
++     * If set to something other than SWS_SCALE_AUTO, this will override the
++     * filter implied by `SwsContext.scaler`. Otherwise, the same filter
++     * will be used for both main scaling and chroma subsampling.
++     */
++    SwsScaler scaler_sub;
++
++    /**
++     * Bitmask of SWS_BACKEND_*. If non-zero, this will restrict the available
++     * backends to the specified set. If left as zero, a default set of
++     * backends will be selected automatically (based on SWS_UNSTABLE).
++     *
++     * Note: This is only relevant for the new API (sws_scale_frame()). The
++     * stateful legacy API always implies SWS_BACKEND_LEGACY.
++     */
++    SwsBackend backends;
++
++    /* Remember to add new fields to graph.c:opts_equal() */
++} SwsContext;
++
++/**
++ * Allocate an empty SwsContext and set its fields to default values.
++ */
++SwsContext *sws_alloc_context(void);
++
++/**
++ * Free the context and everything associated with it, and write NULL
++ * to the provided pointer.
++ */
++void sws_free_context(SwsContext **ctx);
++
++/***************************
++ * Supported frame formats *
++ ***************************/
++
++/**
++ * Test if a given (software) pixel format is supported by any backend,
++ * excluding unstable backends.
++ *
++ * @param output  If 0, test if compatible with the source/input frame;
++ *                otherwise, with the destination/output frame.
++ * @param format  The format to check.
++ *
++ * @return A positive integer if supported, 0 otherwise.
++ */
++int sws_test_format(enum AVPixelFormat format, int output);
++
++/**
++ * Test if a given hardware pixel format is supported by any backend,
++ * excluding unstable backends.
++ *
++ * @param format  The hardware format to check, or AV_PIX_FMT_NONE.
++ *
++ * @return A positive integer if supported or AV_PIX_FMT_NONE, 0 otherwise.
++ */
++int sws_test_hw_format(enum AVPixelFormat format);
++
++/**
++ * Test if a given color space is supported.
++ *
++ * @param output  If 0, test if compatible with the source/input frame;
++ *                otherwise, with the destination/output frame.
++ * @param colorspace The colorspace to check.
++ *
++ * @return A positive integer if supported, 0 otherwise.
++ */
++int sws_test_colorspace(enum AVColorSpace colorspace, int output);
++
++/**
++ * Test if a given set of color primaries is supported.
++ *
++ * @param output  If 0, test if compatible with the source/input frame;
++ *                otherwise, with the destination/output frame.
++ * @param primaries The color primaries to check.
++ *
++ * @return A positive integer if supported, 0 otherwise.
++ */
++int sws_test_primaries(enum AVColorPrimaries primaries, int output);
++
++/**
++ * Test if a given color transfer function is supported.
++ *
++ * @param output  If 0, test if compatible with the source/input frame;
++ *                otherwise, with the destination/output frame.
++ * @param trc     The color transfer function to check.
++ *
++ * @return A positive integer if supported, 0 otherwise.
++ */
++int sws_test_transfer(enum AVColorTransferCharacteristic trc, int output);
++
++/**
++ * Helper function to run all sws_test_* against a frame, as well as testing
++ * the basic frame properties for sanity. Ignores irrelevant properties - for
++ * example, AVColorSpace is not checked for RGB frames.
++ */
++int sws_test_frame(const AVFrame *frame, int output);
++
++/**
++ * Like `sws_scale_frame`, but without actually scaling. It will instead
++ * merely initialize internal state that *would* be required to perform the
++ * operation, as well as returning the correct error code for unsupported
++ * frame combinations.
++ *
++ * @param ctx   The scaling context.
++ * @param dst   The destination frame to consider.
++ * @param src   The source frame to consider.
++ * @return 0 on success, a negative AVERROR code on failure.
++ */
++int sws_frame_setup(SwsContext *ctx, const AVFrame *dst, const AVFrame *src);
++
++/********************
++ * Main scaling API *
++ ********************/
++
++/**
++ * Check if a given conversion is a noop. Returns a positive integer if
++ * no operation needs to be performed, 0 otherwise.
++ */
++int sws_is_noop(const AVFrame *dst, const AVFrame *src);
++
++/**
++ * Scale source data from `src` and write the output to `dst`.
++ *
++ * This function can be used directly on an allocated context, without setting
++ * up any frame properties or calling `sws_init_context()`. Such usage is fully
++ * dynamic and does not require reallocation if the frame properties change.
++ *
++ * Alternatively, this function can be called on a context that has been
++ * explicitly initialized. However, this is provided only for backwards
++ * compatibility. In this usage mode, all frame properties must be correctly
++ * set at init time, and may no longer change after initialization.
++ *
++ * @param ctx   The scaling context.
++ * @param dst   The destination frame. The data buffers may either be already
++ *              allocated by the caller or left clear, in which case they will
++ *              be allocated by the scaler. The latter may have performance
++ *              advantages - e.g. in certain cases some (or all) output planes
++ *              may be references to input planes, rather than copies.
++ * @param src   The source frame. If the data buffers are set to NULL, then
++ *              this function behaves identically to `sws_frame_setup`.
++ * @return >= 0 on success, a negative AVERROR code on failure.
++ */
++int sws_scale_frame(SwsContext *c, AVFrame *dst, const AVFrame *src);
++
++/**
++ * Filter kernel cut-off value. Values below this (absolute) magnitude
++ * are cut off from the main filter kernel. Note that the window is
++ * always adjusted to the new filter radius, so there will never be
++ * any spectral leakage (for suitably windowed filters).
++ */
++#define SWS_MAX_REDUCE_CUTOFF 0.002
++
++/*************************
++ * Legacy (stateful) API *
++ *************************/
++
++#define SWS_SRC_V_CHR_DROP_MASK     0x30000
++#define SWS_SRC_V_CHR_DROP_SHIFT    16
++
++#define SWS_PARAM_DEFAULT           123456
++
++#define SWS_CS_ITU709         1
++#define SWS_CS_FCC            4
++#define SWS_CS_ITU601         5
++#define SWS_CS_ITU624         5
++#define SWS_CS_SMPTE170M      5
++#define SWS_CS_SMPTE240M      7
++#define SWS_CS_DEFAULT        5
++#define SWS_CS_BT2020         9
++
++/**
++ * Return a pointer to yuv<->rgb coefficients for the given colorspace
++ * suitable for sws_setColorspaceDetails().
++ *
++ * @param colorspace One of the SWS_CS_* macros. If invalid,
++ * SWS_CS_DEFAULT is used.
++ */
++const int *sws_getCoefficients(int colorspace);
++
++// when used for filters they must have an odd number of elements
++// coeffs cannot be shared between vectors
++typedef struct SwsVector {
++    double *coeff;              ///< pointer to the list of coefficients
++    int length;                 ///< number of coefficients in the vector
++} SwsVector;
++
++// vectors can be shared
++typedef struct SwsFilter {
++    SwsVector *lumH;
++    SwsVector *lumV;
++    SwsVector *chrH;
++    SwsVector *chrV;
++} SwsFilter;
++
++/**
++ * Return a positive value if pix_fmt is a supported input format, 0
++ * otherwise.
++ */
++int sws_isSupportedInput(enum AVPixelFormat pix_fmt);
++
++/**
++ * Return a positive value if pix_fmt is a supported output format, 0
++ * otherwise.
++ */
++int sws_isSupportedOutput(enum AVPixelFormat pix_fmt);
++
++/**
++ * @param[in]  pix_fmt the pixel format
++ * @return a positive value if an endianness conversion for pix_fmt is
++ * supported, 0 otherwise.
++ */
++int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt);
++
++/**
++ * Initialize the swscaler context sws_context.
++ *
++ * This function is considered deprecated, and provided only for backwards
++ * compatibility with sws_scale() and sws_frame_start(). The preferred way to
++ * use libswscale is to set all frame properties correctly and call
++ * sws_scale_frame() directly, without explicitly initializing the context.
++ *
++ * @return zero or positive value on success, a negative value on
++ * error
++ */
++av_warn_unused_result
++int sws_init_context(SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter);
++
++/**
++ * Free the swscaler context swsContext.
++ * If swsContext is NULL, then does nothing.
++ */
++void sws_freeContext(SwsContext *swsContext);
++
++/**
++ * Allocate and return an SwsContext. You need it to perform
++ * scaling/conversion operations using sws_scale().
++ *
++ * @param srcW the width of the source image
++ * @param srcH the height of the source image
++ * @param srcFormat the source image format
++ * @param dstW the width of the destination image
++ * @param dstH the height of the destination image
++ * @param dstFormat the destination image format
++ * @param flags specify which algorithm and options to use for rescaling
++ * @param param extra parameters to tune the used scaler
++ *              For SWS_BICUBIC param[0] and [1] tune the shape of the basis
++ *              function, param[0] tunes f(1) and param[1] f´(1)
++ *              For SWS_GAUSS param[0] tunes the exponent and thus cutoff
++ *              frequency
++ *              For SWS_LANCZOS param[0] tunes the width of the window function
++ * @return a pointer to an allocated context, or NULL in case of error
++ * @note this function is to be removed after a saner alternative is
++ *       written
++ */
++SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
++                           int dstW, int dstH, enum AVPixelFormat dstFormat,
++                           int flags, SwsFilter *srcFilter,
++                           SwsFilter *dstFilter, const double *param);
++
++/**
++ * Scale the image slice in srcSlice and put the resulting scaled
++ * slice in the image in dst. A slice is a sequence of consecutive
++ * rows in an image. Requires a context that has previously been
++ * initialized with sws_init_context().
++ *
++ * Slices have to be provided in sequential order, either in
++ * top-bottom or bottom-top order. If slices are provided in
++ * non-sequential order the behavior of the function is undefined.
++ *
++ * @param c         the scaling context previously created with
++ *                  sws_getContext()
++ * @param srcSlice  the array containing the pointers to the planes of
++ *                  the source slice
++ * @param srcStride the array containing the strides for each plane of
++ *                  the source image
++ * @param srcSliceY the position in the source image of the slice to
++ *                  process, that is the number (counted starting from
++ *                  zero) in the image of the first row of the slice
++ * @param srcSliceH the height of the source slice, that is the number
++ *                  of rows in the slice
++ * @param dst       the array containing the pointers to the planes of
++ *                  the destination image
++ * @param dstStride the array containing the strides for each plane of
++ *                  the destination image
++ * @return          the height of the output slice
++ */
++int sws_scale(SwsContext *c, const uint8_t *const srcSlice[],
++              const int srcStride[], int srcSliceY, int srcSliceH,
++              uint8_t *const dst[], const int dstStride[]);
++
++/**
++ * Initialize the scaling process for a given pair of source/destination frames.
++ * Must be called before any calls to sws_send_slice() and sws_receive_slice().
++ * Requires a context that has previously been initialized with sws_init_context().
++ *
++ * This function will retain references to src and dst, so they must both use
++ * refcounted buffers (if allocated by the caller, in case of dst).
++ *
++ * @param c   The scaling context
++ * @param dst The destination frame.
++ *
++ *            The data buffers may either be already allocated by the caller or
++ *            left clear, in which case they will be allocated by the scaler.
++ *            The latter may have performance advantages - e.g. in certain cases
++ *            some output planes may be references to input planes, rather than
++ *            copies.
++ *
++ *            Output data will be written into this frame in successful
++ *            sws_receive_slice() calls.
++ * @param src The source frame. The data buffers must be allocated, but the
++ *            frame data does not have to be ready at this point. Data
++ *            availability is then signalled by sws_send_slice().
++ * @return 0 on success, a negative AVERROR code on failure
++ *
++ * @see sws_frame_end()
++ */
++int sws_frame_start(SwsContext *c, AVFrame *dst, const AVFrame *src);
++
++/**
++ * Finish the scaling process for a pair of source/destination frames previously
++ * submitted with sws_frame_start(). Must be called after all sws_send_slice()
++ * and sws_receive_slice() calls are done, before any new sws_frame_start()
++ * calls.
++ *
++ * @param c   The scaling context
++ */
++void sws_frame_end(SwsContext *c);
++
++/**
++ * Indicate that a horizontal slice of input data is available in the source
++ * frame previously provided to sws_frame_start(). The slices may be provided in
++ * any order, but may not overlap. For vertically subsampled pixel formats, the
++ * slices must be aligned according to subsampling.
++ *
++ * @param c   The scaling context
++ * @param slice_start first row of the slice
++ * @param slice_height number of rows in the slice
++ *
++ * @return a non-negative number on success, a negative AVERROR code on failure.
++ */
++int sws_send_slice(SwsContext *c, unsigned int slice_start,
++                   unsigned int slice_height);
++
++/**
++ * Request a horizontal slice of the output data to be written into the frame
++ * previously provided to sws_frame_start().
++ *
++ * @param c   The scaling context
++ * @param slice_start first row of the slice; must be a multiple of
++ *                    sws_receive_slice_alignment()
++ * @param slice_height number of rows in the slice; must be a multiple of
++ *                     sws_receive_slice_alignment(), except for the last slice
++ *                     (i.e. when slice_start+slice_height is equal to output
++ *                     frame height)
++ *
++ * @return a non-negative number if the data was successfully written into the output
++ *         AVERROR(EAGAIN) if more input data needs to be provided before the
++ *                         output can be produced
++ *         another negative AVERROR code on other kinds of scaling failure
++ */
++int sws_receive_slice(SwsContext *c, unsigned int slice_start,
++                      unsigned int slice_height);
++
++/**
++ * Get the alignment required for slices. Requires a context that has
++ * previously been initialized with sws_init_context().
++ *
++ * @param c   The scaling context
++ * @return alignment required for output slices requested with sws_receive_slice().
++ *         Slice offsets and sizes passed to sws_receive_slice() must be
++ *         multiples of the value returned from this function.
++ */
++unsigned int sws_receive_slice_alignment(const SwsContext *c);
++
++/**
++ * @param c the scaling context
++ * @param dstRange flag indicating the white-black range of the output (1=jpeg / 0=mpeg)
++ * @param srcRange flag indicating the white-black range of the input (1=jpeg / 0=mpeg)
++ * @param table the yuv2rgb coefficients describing the output yuv space, normally ff_yuv2rgb_coeffs[x]
++ * @param inv_table the yuv2rgb coefficients describing the input yuv space, normally ff_yuv2rgb_coeffs[x]
++ * @param brightness 16.16 fixed point brightness correction
++ * @param contrast 16.16 fixed point contrast correction
++ * @param saturation 16.16 fixed point saturation correction
++ *
++ * @return A negative error code on error, non negative otherwise.
++ *         If `LIBSWSCALE_VERSION_MAJOR < 7`, returns -1 if not supported.
++ */
++int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4],
++                             int srcRange, const int table[4], int dstRange,
++                             int brightness, int contrast, int saturation);
++
++/**
++ * @return A negative error code on error, non negative otherwise.
++ *         If `LIBSWSCALE_VERSION_MAJOR < 7`, returns -1 if not supported.
++ */
++int sws_getColorspaceDetails(SwsContext *c, int **inv_table,
++                             int *srcRange, int **table, int *dstRange,
++                             int *brightness, int *contrast, int *saturation);
++
++/**
++ * Allocate and return an uninitialized vector with length coefficients.
++ */
++SwsVector *sws_allocVec(int length);
++
++/**
++ * Return a normalized Gaussian curve used to filter stuff
++ * quality = 3 is high quality, lower is lower quality.
++ */
++SwsVector *sws_getGaussianVec(double variance, double quality);
++
++/**
++ * Scale all the coefficients of a by the scalar value.
++ */
++void sws_scaleVec(SwsVector *a, double scalar);
++
++/**
++ * Scale all the coefficients of a so that their sum equals height.
++ */
++void sws_normalizeVec(SwsVector *a, double height);
++
++void sws_freeVec(SwsVector *a);
++
++SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur,
++                                float lumaSharpen, float chromaSharpen,
++                                float chromaHShift, float chromaVShift,
++                                int verbose);
++void sws_freeFilter(SwsFilter *filter);
++
++/**
++ * Check if context can be reused, otherwise reallocate a new one.
++ *
++ * If context is NULL, just calls sws_getContext() to get a new
++ * context. Otherwise, checks if the parameters are the ones already
++ * saved in context. If that is the case, returns the current
++ * context. Otherwise, frees context and gets a new context with
++ * the new parameters.
++ *
++ * Be warned that srcFilter and dstFilter are not checked, they
++ * are assumed to remain the same.
++ */
++SwsContext *sws_getCachedContext(SwsContext *context, int srcW, int srcH,
++                                 enum AVPixelFormat srcFormat, int dstW, int dstH,
++                                 enum AVPixelFormat dstFormat, int flags,
++                                 SwsFilter *srcFilter, SwsFilter *dstFilter,
++                                 const double *param);
++
++/**
++ * Convert an 8-bit paletted frame into a frame with a color depth of 32 bits.
++ *
++ * The output frame will have the same packed format as the palette.
++ *
++ * @param src        source frame buffer
++ * @param dst        destination frame buffer
++ * @param num_pixels number of pixels to convert
++ * @param palette    array with [256] entries, which must match color arrangement (RGB or BGR) of src
++ */
++void sws_convertPalette8ToPacked32(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette);
++
++/**
++ * Convert an 8-bit paletted frame into a frame with a color depth of 24 bits.
++ *
++ * With the palette format "ABCD", the destination frame ends up with the format "ABC".
++ *
++ * @param src        source frame buffer
++ * @param dst        destination frame buffer
++ * @param num_pixels number of pixels to convert
++ * @param palette    array with [256] entries, which must match color arrangement (RGB or BGR) of src
++ */
++void sws_convertPalette8ToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, const uint8_t *palette);
++
++/**
++ * @}
++ */
++
++#endif /* SWSCALE_SWSCALE_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/version.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/version.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/version.h.ffmpeg9	2026-09-07 12:23:47.679924833 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/version.h	2026-09-07 12:23:47.679904436 +0200
+@@ -0,0 +1,44 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef SWSCALE_VERSION_H
++#define SWSCALE_VERSION_H
++
++/**
++ * @file
++ * swscale version macros
++ */
++
++#include "libavutil/version.h"
++
++#include "version_major.h"
++
++#define LIBSWSCALE_VERSION_MINOR   1
++#define LIBSWSCALE_VERSION_MICRO 100
++
++#define LIBSWSCALE_VERSION_INT  AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
++                                               LIBSWSCALE_VERSION_MINOR, \
++                                               LIBSWSCALE_VERSION_MICRO)
++#define LIBSWSCALE_VERSION      AV_VERSION(LIBSWSCALE_VERSION_MAJOR, \
++                                           LIBSWSCALE_VERSION_MINOR, \
++                                           LIBSWSCALE_VERSION_MICRO)
++#define LIBSWSCALE_BUILD        LIBSWSCALE_VERSION_INT
++
++#define LIBSWSCALE_IDENT        "SwS" AV_STRINGIFY(LIBSWSCALE_VERSION)
++
++#endif /* SWSCALE_VERSION_H */
+diff -up MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/version_major.h.ffmpeg9 MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/version_major.h
+--- MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/version_major.h.ffmpeg9	2026-09-07 12:23:47.679991307 +0200
++++ MuseScore-4.7.4/src/framework/media/thirdparty/ffmpeg/v9/libswscale/version_major.h	2026-09-07 12:23:47.679976432 +0200
+@@ -0,0 +1,35 @@
++/*
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef SWSCALE_VERSION_MAJOR_H
++#define SWSCALE_VERSION_MAJOR_H
++
++/**
++ * @file
++ * swscale version macros
++ */
++
++#define LIBSWSCALE_VERSION_MAJOR   10
++
++/**
++ * 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.
++ */
++
++#endif /* SWSCALE_VERSION_MAJOR_H */

diff --git a/musescore.spec b/musescore.spec
index 482dbbc..3202e53 100644
--- a/musescore.spec
+++ b/musescore.spec
@@ -11,29 +11,29 @@
 # - Reset to 1 if the version changed
 # - Increase by 1 otherwise
 %global mscore_font_ver           2.003
-%global mscore_font_rel           43%{?dist}
+%global mscore_font_rel           44%{?dist}
 %global mscoretext_font_ver       1.0
-%global mscoretext_font_rel       43%{?dist}
+%global mscoretext_font_rel       44%{?dist}
 %global musescoreicon_font_ver    1.0
-%global musescoreicon_font_rel    43%{?dist}
+%global musescoreicon_font_rel    44%{?dist}
 %global mscorebc_font_ver         1.0
-%global mscorebc_font_rel         43%{?dist}
+%global mscorebc_font_rel         44%{?dist}
 %global mscoretabulature_font_ver 001.000
-%global mscoretabulature_font_rel 43%{?dist}
+%global mscoretabulature_font_rel 44%{?dist}
 %global musejazz_font_ver         1.0
-%global musejazz_font_rel         43%{?dist}
+%global musejazz_font_rel         44%{?dist}
 %global gootville_font_ver        1.3
-%global gootville_font_rel        43%{?dist}
+%global gootville_font_rel        44%{?dist}
 %global gootville_text_font_ver   1.2
-%global gootville_text_font_rel   43%{?dist}
+%global gootville_text_font_rel   44%{?dist}
 %global soundfont_ver             0.2.0
-%global soundfont_rel             43%{?dist}
+%global soundfont_rel             44%{?dist}
 
 Name:           musescore
 Summary:        Music Composition & Notation Software
 Version:        %{musescore_ver}
 # IMPORTANT: Change all the release numbers above, too!
-Release:        2%{?dist}
+Release:        3%{?dist}
 
 # The MuseScore project itself is GPL-3.0-only WITH Font-exception-2.0.  Other
 # licenses in play:
@@ -245,6 +245,10 @@ Patch:          %{name}-vst.patch
 # https://github.com/musescore/MuseScore/pull/34204
 Patch:          %{name}-styleddropdownnavigation.patch
 
+# Add FFmpeg 9 support
+# https://github.com/musescore/muse_framework/pull/201
+Patch:          %{name}-ffmpeg9.patch
+
 # See https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval
 ExcludeArch:    %{ix86}
 BuildSystem:    cmake
@@ -289,7 +293,6 @@ BuildRequires:  cmake(Qt6WebSockets)
 BuildRequires:  cmake(Qt6Widgets)
 BuildRequires:  cmake(Qt6Xml)
 BuildRequires:  desktop-file-utils
-BuildRequires:  ffmpeg-free-devel
 BuildRequires:  font(bravura)
 BuildRequires:  font(bravuratext)
 BuildRequires:  font(campania)
@@ -315,7 +318,6 @@ BuildRequires:  pkgconfig(freetype2)
 BuildRequires:  pkgconfig(harfbuzz)
 BuildRequires:  pkgconfig(liblouis)
 BuildRequires:  pkgconfig(libopusenc)
-BuildRequires:  (pkgconfig(libpostproc) if libavcodec-free < 8.0)
 BuildRequires:  pkgconfig(libpipewire-0.3)
 BuildRequires:  pkgconfig(libpulse)
 BuildRequires:  pkgconfig(mnxdom)
@@ -769,6 +771,10 @@ EOF
 %fontfiles -z 9
 
 %changelog
+* Mon Sep 07 2026 Dominik Mierzejewski <dominik@greysector.net> - 4.7.4-3
+- Backport upstream PR to support FFmpeg 9
+- Drop unnecessary BuildRequires on FFmpeg (uses bundled headers)
+
 * Mon Jul 20 2026 Jerry James <loganjerry@gmail.com> - 4.7.4-2
 - Add patch to fix StyledDropdown null references
 

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-09-08 17:43 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-08 17:43 [rpms/musescore] rawhide: Backport upstream PR to add FFmpeg 9 support Dominik 'Rathann' Mierzejewski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox