summaryrefslogtreecommitdiff
path: root/ffvpx.patch
diff options
context:
space:
mode:
Diffstat (limited to 'ffvpx.patch')
-rw-r--r--ffvpx.patch9589
1 files changed, 0 insertions, 9589 deletions
diff --git a/ffvpx.patch b/ffvpx.patch
deleted file mode 100644
index 73c2f57..0000000
--- a/ffvpx.patch
+++ /dev/null
@@ -1,9589 +0,0 @@
-diff -up firefox-84.0/dom/media/platforms/ffmpeg/ffmpeg58/moz.build.ffvpx firefox-84.0/dom/media/platforms/ffmpeg/ffmpeg58/moz.build
---- firefox-84.0/dom/media/platforms/ffmpeg/ffmpeg58/moz.build.ffvpx 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/dom/media/platforms/ffmpeg/ffmpeg58/moz.build 2020-12-10 20:36:08.398441034 +0100
-@@ -27,8 +27,6 @@ if CONFIG['CC_TYPE'] == 'gcc':
- ]
- if CONFIG['MOZ_WAYLAND']:
- CXXFLAGS += CONFIG['TK_CFLAGS']
-- CXXFLAGS += CONFIG['MOZ_WAYLAND_CFLAGS']
- DEFINES['MOZ_WAYLAND_USE_VAAPI'] = 1
-- include('/ipc/chromium/chromium-config.mozbuild')
-
- FINAL_LIBRARY = 'xul'
-diff -up firefox-84.0/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp.ffvpx firefox-84.0/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp
---- firefox-84.0/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp.ffvpx 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp 2020-12-10 20:40:53.388541336 +0100
-@@ -11,6 +11,10 @@
- #include "mozilla/Types.h"
- #include "PlatformDecoderModule.h"
- #include "prlink.h"
-+#ifdef MOZ_WAYLAND
-+# include "mozilla/widget/DMABufLibWrapper.h"
-+# include "mozilla/StaticPrefs_media.h"
-+#endif
-
- #define AV_LOG_DEBUG 48
- #define AV_LOG_INFO 32
-@@ -254,6 +258,46 @@ void FFmpegLibWrapper::Unlink() {
- }
-
- #ifdef MOZ_WAYLAND
-+void FFmpegLibWrapper::LinkVAAPILibs() {
-+ if (widget::GetDMABufDevice()->IsDMABufVAAPIEnabled()) {
-+ PRLibSpec lspec;
-+ lspec.type = PR_LibSpec_Pathname;
-+ const char* libDrm = "libva-drm.so.2";
-+ lspec.value.pathname = libDrm;
-+ mVALibDrm = PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
-+ if (!mVALibDrm) {
-+ FFMPEG_LOG("VA-API support: Missing or old %s library.\n", libDrm);
-+ }
-+
-+ if (!StaticPrefs::media_ffmpeg_vaapi_drm_display_enabled()) {
-+ const char* libWayland = "libva-wayland.so.2";
-+ lspec.value.pathname = libWayland;
-+ mVALibWayland = PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
-+ if (!mVALibWayland) {
-+ FFMPEG_LOG("VA-API support: Missing or old %s library.\n", libWayland);
-+ }
-+ }
-+
-+ if (mVALibWayland || mVALibDrm) {
-+ const char* lib = "libva.so.2";
-+ lspec.value.pathname = lib;
-+ mVALib = PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
-+ // Don't use libva when it's missing vaExportSurfaceHandle.
-+ if (mVALib && !PR_FindSymbol(mVALib, "vaExportSurfaceHandle")) {
-+ PR_UnloadLibrary(mVALib);
-+ mVALib = nullptr;
-+ }
-+ if (!mVALib) {
-+ FFMPEG_LOG("VA-API support: Missing or old %s library.\n", lib);
-+ }
-+ }
-+ } else {
-+ FFMPEG_LOG("VA-API FFmpeg is disabled by platform");
-+ }
-+}
-+#endif
-+
-+#ifdef MOZ_WAYLAND
- bool FFmpegLibWrapper::IsVAAPIAvailable() {
- # define VA_FUNC_LOADED(func) (func != nullptr)
- return VA_FUNC_LOADED(avcodec_get_hw_config) &&
-diff -up firefox-84.0/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h.ffvpx firefox-84.0/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h
---- firefox-84.0/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h.ffvpx 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h 2020-12-10 20:40:53.388541336 +0100
-@@ -56,6 +56,7 @@ struct MOZ_ONLY_USED_TO_AVOID_STATIC_CON
- #ifdef MOZ_WAYLAND
- // Check if mVALib are available and we can use HW decode.
- bool IsVAAPIAvailable();
-+ void LinkVAAPILibs();
- #endif
-
- // indicate the version of libavcodec linked to.
-diff -up firefox-84.0/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp.ffvpx firefox-84.0/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
---- firefox-84.0/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp.ffvpx 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp 2020-12-10 20:40:53.388541336 +0100
-@@ -9,10 +9,6 @@
- #include "mozilla/ArrayUtils.h"
- #include "FFmpegLog.h"
- #include "prlink.h"
--#ifdef MOZ_WAYLAND
--# include "mozilla/widget/DMABufLibWrapper.h"
--# include "mozilla/StaticPrefs_media.h"
--#endif
-
- namespace mozilla {
-
-@@ -58,43 +54,7 @@ bool FFmpegRuntimeLinker::Init() {
- }
-
- #ifdef MOZ_WAYLAND
-- if (widget::GetDMABufDevice()->IsDMABufVAAPIEnabled()) {
-- PRLibSpec lspec;
-- lspec.type = PR_LibSpec_Pathname;
-- const char* libDrm = "libva-drm.so.2";
-- lspec.value.pathname = libDrm;
-- sLibAV.mVALibDrm = PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
-- if (!sLibAV.mVALibDrm) {
-- FFMPEG_LOG("VA-API support: Missing or old %s library.\n", libDrm);
-- }
--
-- if (!StaticPrefs::media_ffmpeg_vaapi_drm_display_enabled()) {
-- const char* libWayland = "libva-wayland.so.2";
-- lspec.value.pathname = libWayland;
-- sLibAV.mVALibWayland =
-- PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
-- if (!sLibAV.mVALibWayland) {
-- FFMPEG_LOG("VA-API support: Missing or old %s library.\n", libWayland);
-- }
-- }
--
-- if (sLibAV.mVALibWayland || sLibAV.mVALibDrm) {
-- const char* lib = "libva.so.2";
-- lspec.value.pathname = lib;
-- sLibAV.mVALib = PR_LoadLibraryWithFlags(lspec, PR_LD_NOW | PR_LD_LOCAL);
-- // Don't use libva when it's missing vaExportSurfaceHandle.
-- if (sLibAV.mVALib &&
-- !PR_FindSymbol(sLibAV.mVALib, "vaExportSurfaceHandle")) {
-- PR_UnloadLibrary(sLibAV.mVALib);
-- sLibAV.mVALib = nullptr;
-- }
-- if (!sLibAV.mVALib) {
-- FFMPEG_LOG("VA-API support: Missing or old %s library.\n", lib);
-- }
-- }
-- } else {
-- FFMPEG_LOG("VA-API FFmpeg is disabled by platform");
-- }
-+ sLibAV.LinkVAAPILibs();
- #endif
-
- // While going through all possible libs, this status will be updated with a
-diff -up firefox-84.0/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp.ffvpx firefox-84.0/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
---- firefox-84.0/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp.ffvpx 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp 2020-12-10 20:40:53.392541452 +0100
-@@ -32,6 +32,8 @@
- # define AV_PIX_FMT_NONE PIX_FMT_NONE
- #endif
- #include "mozilla/PodOperations.h"
-+#include "mozilla/ScopeExit.h"
-+#include "mozilla/StaticPrefs_media.h"
- #include "mozilla/TaskQueue.h"
- #include "nsThreadUtils.h"
- #include "prsystem.h"
-@@ -45,7 +47,7 @@ typedef int VAStatus;
- #endif
-
- // Use some extra HW frames for potential rendering lags.
--#define EXTRA_HW_FRAMES 6
-+#define EXTRA_HW_FRAMES 20
-
- typedef mozilla::layers::Image Image;
- typedef mozilla::layers::PlanarYCbCrImage PlanarYCbCrImage;
-@@ -124,8 +126,8 @@ static AVPixelFormat ChooseVAAPIPixelFor
- return AV_PIX_FMT_NONE;
- }
-
--DMABufSurfaceWrapper::DMABufSurfaceWrapper(DMABufSurface* aSurface,
-- FFmpegLibWrapper* aLib)
-+DMABufSurfaceWrapper<LIBAV_VER>::DMABufSurfaceWrapper(DMABufSurface* aSurface,
-+ FFmpegLibWrapper* aLib)
- : mSurface(aSurface),
- mLib(aLib),
- mAVHWFramesContext(nullptr),
-@@ -138,8 +140,8 @@ DMABufSurfaceWrapper::DMABufSurfaceWrapp
- mSurface->GetUID());
- }
-
--void DMABufSurfaceWrapper::LockVAAPIData(AVCodecContext* aAVCodecContext,
-- AVFrame* aAVFrame) {
-+void DMABufSurfaceWrapper<LIBAV_VER>::LockVAAPIData(
-+ AVCodecContext* aAVCodecContext, AVFrame* aAVFrame) {
- FFMPEG_LOG("DMABufSurfaceWrapper: VAAPI locking dmabuf surface UID = %d",
- mSurface->GetUID());
- if (aAVCodecContext && aAVFrame) {
-@@ -148,7 +150,7 @@ void DMABufSurfaceWrapper::LockVAAPIData
- }
- }
-
--void DMABufSurfaceWrapper::ReleaseVAAPIData() {
-+void DMABufSurfaceWrapper<LIBAV_VER>::ReleaseVAAPIData() {
- FFMPEG_LOG("DMABufSurfaceWrapper: VAAPI releasing dmabuf surface UID = %d",
- mSurface->GetUID());
- if (mHWAVBuffer && mAVHWFramesContext) {
-@@ -158,7 +160,7 @@ void DMABufSurfaceWrapper::ReleaseVAAPID
- mSurface->ReleaseSurface();
- }
-
--DMABufSurfaceWrapper::~DMABufSurfaceWrapper() {
-+DMABufSurfaceWrapper<LIBAV_VER>::~DMABufSurfaceWrapper() {
- FFMPEG_LOG("DMABufSurfaceWrapper: deleting dmabuf surface UID = %d",
- mSurface->GetUID());
- ReleaseVAAPIData();
-@@ -181,7 +183,14 @@ AVCodec* FFmpegVideoDecoder<LIBAV_VER>::
- return nullptr;
- }
-
--class VAAPIDisplayHolder {
-+template <int V>
-+class VAAPIDisplayHolder {};
-+
-+template <>
-+class VAAPIDisplayHolder<LIBAV_VER>;
-+
-+template <>
-+class VAAPIDisplayHolder<LIBAV_VER> {
- public:
- VAAPIDisplayHolder(FFmpegLibWrapper* aLib, VADisplay aDisplay)
- : mLib(aLib), mDisplay(aDisplay){};
-@@ -193,7 +202,8 @@ class VAAPIDisplayHolder {
- };
-
- static void VAAPIDisplayReleaseCallback(struct AVHWDeviceContext* hwctx) {
-- auto displayHolder = static_cast<VAAPIDisplayHolder*>(hwctx->user_opaque);
-+ auto displayHolder =
-+ static_cast<VAAPIDisplayHolder<LIBAV_VER>*>(hwctx->user_opaque);
- delete displayHolder;
- }
-
-@@ -229,7 +239,7 @@ bool FFmpegVideoDecoder<LIBAV_VER>::Crea
- }
- }
-
-- hwctx->user_opaque = new VAAPIDisplayHolder(mLib, mDisplay);
-+ hwctx->user_opaque = new VAAPIDisplayHolder<LIBAV_VER>(mLib, mDisplay);
- hwctx->free = VAAPIDisplayReleaseCallback;
-
- int major, minor;
-@@ -703,7 +713,7 @@ void FFmpegVideoDecoder<LIBAV_VER>::Rele
- }
- }
-
--DMABufSurfaceWrapper*
-+DMABufSurfaceWrapper<LIBAV_VER>*
- FFmpegVideoDecoder<LIBAV_VER>::GetUnusedDMABufSurfaceWrapper() {
- int len = mDMABufSurfaces.Length();
- for (int i = 0; i < len; i++) {
-@@ -769,7 +779,8 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER
-
- RefPtr<DMABufSurfaceYUV> surface;
-
-- DMABufSurfaceWrapper* surfaceWrapper = GetUnusedDMABufSurfaceWrapper();
-+ DMABufSurfaceWrapper<LIBAV_VER>* surfaceWrapper =
-+ GetUnusedDMABufSurfaceWrapper();
- if (!surfaceWrapper) {
- if (mVAAPIDeviceContext) {
- surface = DMABufSurfaceYUV::CreateYUVSurface(vaDesc);
-diff -up firefox-84.0/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h.ffvpx firefox-84.0/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
---- firefox-84.0/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h.ffvpx 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h 2020-12-10 20:40:53.388541336 +0100
-@@ -55,7 +55,14 @@ namespace mozilla {
- // We own the DMABufSurface underlying GPU data and we use it for
- // repeated rendering of video frames.
- //
--class DMABufSurfaceWrapper final {
-+template <int V>
-+class DMABufSurfaceWrapper {};
-+
-+template <>
-+class DMABufSurfaceWrapper<LIBAV_VER>;
-+
-+template <>
-+class DMABufSurfaceWrapper<LIBAV_VER> final {
- public:
- DMABufSurfaceWrapper(DMABufSurface* aSurface, FFmpegLibWrapper* aLib);
- ~DMABufSurfaceWrapper();
-@@ -162,7 +169,7 @@ class FFmpegVideoDecoder<LIBAV_VER>
- MediaDataDecoder::DecodedData& aResults);
-
- void ReleaseUnusedVAAPIFrames();
-- DMABufSurfaceWrapper* GetUnusedDMABufSurfaceWrapper();
-+ DMABufSurfaceWrapper<LIBAV_VER>* GetUnusedDMABufSurfaceWrapper();
- void ReleaseDMABufSurfaces();
- #endif
-
-@@ -180,7 +187,7 @@ class FFmpegVideoDecoder<LIBAV_VER>
- const bool mDisableHardwareDecoding;
- VADisplay mDisplay;
- bool mUseDMABufSurfaces;
-- nsTArray<DMABufSurfaceWrapper> mDMABufSurfaces;
-+ nsTArray<DMABufSurfaceWrapper<LIBAV_VER>> mDMABufSurfaces;
- #endif
- RefPtr<KnowsCompositor> mImageAllocator;
- RefPtr<ImageContainer> mImageContainer;
-diff -up firefox-84.0/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp.ffvpx firefox-84.0/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp
---- firefox-84.0/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp.ffvpx 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp 2020-12-10 20:40:53.388541336 +0100
-@@ -64,6 +64,10 @@ bool FFVPXRuntimeLinker::Init() {
- MOZ_ASSERT(NS_IsMainThread());
- sLinkStatus = LinkStatus_FAILED;
-
-+#ifdef MOZ_WAYLAND
-+ sFFVPXLib.LinkVAAPILibs();
-+#endif
-+
- // We retrieve the path of the lgpllibs library as this is where mozavcodec
- // and mozavutil libs are located.
- PathString lgpllibsname = GetLibraryName(nullptr, "lgpllibs");
-diff -up firefox-84.0/dom/media/platforms/ffmpeg/ffvpx/moz.build.ffvpx firefox-84.0/dom/media/platforms/ffmpeg/ffvpx/moz.build
---- firefox-84.0/dom/media/platforms/ffmpeg/ffvpx/moz.build.ffvpx 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/dom/media/platforms/ffmpeg/ffvpx/moz.build 2020-12-10 20:36:08.431441959 +0100
-@@ -36,4 +36,8 @@ if CONFIG["CC_TYPE"] == "gcc":
- DEFINES["FFVPX_VERSION"] = 46465650
- DEFINES["USING_MOZFFVPX"] = True
-
-+if CONFIG["MOZ_WAYLAND"]:
-+ CXXFLAGS += CONFIG["TK_CFLAGS"]
-+ DEFINES["MOZ_WAYLAND_USE_VAAPI"] = 1
-+
- FINAL_LIBRARY = "xul"
-diff -up firefox-84.0/gfx/layers/DMABUFSurfaceImage.cpp.ffvpx firefox-84.0/gfx/layers/DMABUFSurfaceImage.cpp
---- firefox-84.0/gfx/layers/DMABUFSurfaceImage.cpp.ffvpx 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/gfx/layers/DMABUFSurfaceImage.cpp 2020-12-10 20:36:08.308438509 +0100
-@@ -5,16 +5,23 @@
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
- #include "DMABUFSurfaceImage.h"
--#include "gfxPlatform.h"
-+#include "mozilla/widget/DMABufSurface.h"
- #include "mozilla/layers/CompositableClient.h"
- #include "mozilla/layers/CompositableForwarder.h"
- #include "mozilla/layers/DMABUFTextureClientOGL.h"
--#include "mozilla/UniquePtr.h"
-+#include "mozilla/layers/TextureForwarder.h"
-
- using namespace mozilla;
- using namespace mozilla::layers;
- using namespace mozilla::gfx;
-
-+DMABUFSurfaceImage::DMABUFSurfaceImage(DMABufSurface* aSurface)
-+ : Image(nullptr, ImageFormat::DMABUF), mSurface(aSurface) {
-+ mSurface->GlobalRefAdd();
-+}
-+
-+DMABUFSurfaceImage::~DMABUFSurfaceImage() { mSurface->GlobalRefRelease(); }
-+
- TextureClient* DMABUFSurfaceImage::GetTextureClient(
- KnowsCompositor* aKnowsCompositor) {
- if (!mTextureClient) {
-@@ -25,3 +32,7 @@ TextureClient* DMABUFSurfaceImage::GetTe
- }
- return mTextureClient;
- }
-+
-+gfx::IntSize DMABUFSurfaceImage::GetSize() const {
-+ return gfx::IntSize::Truncate(mSurface->GetWidth(), mSurface->GetHeight());
-+}
-diff -up firefox-84.0/gfx/layers/DMABUFSurfaceImage.h.ffvpx firefox-84.0/gfx/layers/DMABUFSurfaceImage.h
---- firefox-84.0/gfx/layers/DMABUFSurfaceImage.h.ffvpx 2020-12-10 20:53:45.300792876 +0100
-+++ firefox-84.0/gfx/layers/DMABUFSurfaceImage.h 2020-12-10 20:36:08.279437696 +0100
-@@ -8,32 +8,24 @@
- #define SURFACE_DMABUF_H
-
- #include "ImageContainer.h"
--#include "mozilla/widget/DMABufSurface.h"
--#include "mozilla/gfx/Point.h"
--#include "mozilla/layers/TextureClient.h"
-+
-+class DMABufSurface;
-
- namespace mozilla {
- namespace layers {
-
-+class TextureClient;
-+
- class DMABUFSurfaceImage : public Image {
- public:
-- explicit DMABUFSurfaceImage(DMABufSurface* aSurface)
-- : Image(nullptr, ImageFormat::DMABUF), mSurface(aSurface) {
-- mSurface->GlobalRefAdd();
-- }
--
-- ~DMABUFSurfaceImage() { mSurface->GlobalRefRelease(); }
-+ explicit DMABUFSurfaceImage(DMABufSurface* aSurface);
-+ ~DMABUFSurfaceImage();
-
- DMABufSurface* GetSurface() { return mSurface; }
--
-- gfx::IntSize GetSize() const override {
-- return gfx::IntSize::Truncate(mSurface->GetWidth(), mSurface->GetHeight());
-- }
--
-+ gfx::IntSize GetSize() const override;
- already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override {
- return nullptr;
- }
--
- TextureClient* GetTextureClient(KnowsCompositor* aKnowsCompositor) override;
-
- private:
-diff -up firefox-84.0/media/ffvpx/changes.patch.ffvpx firefox-84.0/media/ffvpx/changes.patch
---- firefox-84.0/media/ffvpx/changes.patch.ffvpx 2020-12-08 00:35:04.000000000 +0100
-+++ firefox-84.0/media/ffvpx/changes.patch 2020-12-10 20:40:53.388541336 +0100
-@@ -50,3 +50,27 @@ index 9fb8d0a..97ad3b9 100644
- rgba_color[0] = rgba >> 24;
- rgba_color[1] = rgba >> 16;
- rgba_color[2] = rgba >> 8;
-+diff --git a/media/ffvpx/libavutil/hwcontext_vaapi.c b/media/ffvpx/libavutil/hwcontext_vaapi.c
-+--- a/media/ffvpx/libavutil/hwcontext_vaapi.c
-++++ b/media/ffvpx/libavutil/hwcontext_vaapi.c
-+@@ -39,17 +39,19 @@
-+ # include <unistd.h>
-+ #endif
-+
-+
-+ #include "avassert.h"
-+ #include "buffer.h"
-+ #include "common.h"
-+ #include "hwcontext.h"
-++#if CONFIG_LIBDRM
-+ #include "hwcontext_drm.h"
-++#endif
-+ #include "hwcontext_internal.h"
-+ #include "hwcontext_vaapi.h"
-+ #include "mem.h"
-+ #include "pixdesc.h"
-+ #include "pixfmt.h"
-+
-+
-+ typedef struct VAAPIDevicePriv {
-+
-diff -up firefox-84.0/media/ffvpx/config_common.h.ffvpx firefox-84.0/media/ffvpx/config_common.h
---- firefox-84.0/media/ffvpx/config_common.h.ffvpx 2020-12-08 00:35:05.000000000 +0100
-+++ firefox-84.0/media/ffvpx/config_common.h 2020-12-10 20:40:53.388541336 +0100
-@@ -18,4 +18,13 @@
- #define CONFIG_RDFT 1
- #endif
-
-+#ifdef MOZ_WAYLAND
-+#undef CONFIG_VAAPI
-+#undef CONFIG_VP8_VAAPI_HWACCEL
-+#undef CONFIG_VP9_VAAPI_HWACCEL
-+#define CONFIG_VAAPI 1
-+#define CONFIG_VP8_VAAPI_HWACCEL 1
-+#define CONFIG_VP9_VAAPI_HWACCEL 1
-+#endif
-+
- #endif
-diff -up firefox-84.0/media/ffvpx/FILES.ffvpx firefox-84.0/media/ffvpx/FILES
---- firefox-84.0/media/ffvpx/FILES.ffvpx 2020-12-08 00:35:05.000000000 +0100
-+++ firefox-84.0/media/ffvpx/FILES 2020-12-10 20:40:53.388541336 +0100
-@@ -131,6 +131,11 @@
- ./libavcodec/thread.h
- ./libavcodec/unary.h
- ./libavcodec/utils.c
-+./libavcodec/vaapi.h
-+./libavcodec/vaapi_decode.h
-+./libavcodec/vaapi_decode.c
-+./libavcodec/vaapi_vp8.c
-+./libavcodec/vaapi_vp9.c
- ./libavcodec/version.h
- ./libavcodec/videodsp.c
- ./libavcodec/videodsp.h
-@@ -264,6 +269,8 @@
- ./libavutil/hwcontext.c
- ./libavutil/hwcontext.h
- ./libavutil/hwcontext_internal.h
-+./libavutil/hwcontext_vaapi.h
-+./libavutil/hwcontext_vaapi.c
- ./libavutil/imgutils.c
- ./libavutil/imgutils.h
- ./libavutil/imgutils_internal.h
-diff -up firefox-84.0/media/ffvpx/libavcodec/avcodec.symbols.ffvpx firefox-84.0/media/ffvpx/libavcodec/avcodec.symbols
---- firefox-84.0/media/ffvpx/libavcodec/avcodec.symbols.ffvpx 2020-12-08 00:35:05.000000000 +0100
-+++ firefox-84.0/media/ffvpx/libavcodec/avcodec.symbols 2020-12-10 20:40:53.389541365 +0100
-@@ -28,6 +28,11 @@ av_get_pcm_codec
- av_get_profile_name
- av_grow_packet
- av_hwaccel_next
-+av_hwdevice_ctx_init
-+av_hwdevice_ctx_alloc
-+av_hwdevice_ctx_create_derived
-+av_hwframe_transfer_get_formats
-+av_hwframe_ctx_alloc
- av_init_packet
- av_lockmgr_register
- av_new_packet
-@@ -93,6 +98,7 @@ avcodec_free_context
- avcodec_get_class
- avcodec_get_context_defaults3
- avcodec_get_frame_class
-+avcodec_get_hw_config
- avcodec_get_name
- avcodec_get_subtitle_rect_class
- avcodec_get_type
-diff -up firefox-84.0/media/ffvpx/libavcodec/moz.build.ffvpx firefox-84.0/media/ffvpx/libavcodec/moz.build
---- firefox-84.0/media/ffvpx/libavcodec/moz.build.ffvpx 2020-12-10 20:40:53.383541192 +0100
-+++ firefox-84.0/media/ffvpx/libavcodec/moz.build 2020-12-10 20:40:53.389541365 +0100
-@@ -96,6 +96,13 @@ if not CONFIG['MOZ_FFVPX_AUDIOONLY']:
- 'vp9prob.c',
- 'vp9recon.c'
- ]
-+ if CONFIG['MOZ_WAYLAND']:
-+ SOURCES += [
-+ 'vaapi_decode.c',
-+ 'vaapi_vp8.c',
-+ 'vaapi_vp9.c',
-+ ]
-+ USE_LIBS += ['mozva']
-
- if CONFIG['MOZ_FDK_AAC']:
- SOURCES += [
-diff -up firefox-84.0/media/ffvpx/libavcodec/vaapi_decode.c.ffvpx firefox-84.0/media/ffvpx/libavcodec/vaapi_decode.c
---- firefox-84.0/media/ffvpx/libavcodec/vaapi_decode.c.ffvpx 2020-12-10 20:40:53.389541365 +0100
-+++ firefox-84.0/media/ffvpx/libavcodec/vaapi_decode.c 2020-12-10 20:40:53.389541365 +0100
-@@ -0,0 +1,732 @@
-+/*
-+ * This file is part of FFmpeg.
-+ *
-+ * FFmpeg is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * FFmpeg is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with FFmpeg; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#include "libavutil/avassert.h"
-+#include "libavutil/common.h"
-+#include "libavutil/pixdesc.h"
-+
-+#include "avcodec.h"
-+#include "decode.h"
-+#include "internal.h"
-+#include "vaapi_decode.h"
-+
-+
-+int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx,
-+ VAAPIDecodePicture *pic,
-+ int type,
-+ const void *data,
-+ size_t size)
-+{
-+ VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data;
-+ VAStatus vas;
-+ VABufferID buffer;
-+
-+ av_assert0(pic->nb_param_buffers + 1 <= MAX_PARAM_BUFFERS);
-+
-+ vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context,
-+ type, size, 1, (void*)data, &buffer);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to create parameter "
-+ "buffer (type %d): %d (%s).\n",
-+ type, vas, vaErrorStr(vas));
-+ return AVERROR(EIO);
-+ }
-+
-+ pic->param_buffers[pic->nb_param_buffers++] = buffer;
-+
-+ av_log(avctx, AV_LOG_DEBUG, "Param buffer (type %d, %zu bytes) "
-+ "is %#x.\n", type, size, buffer);
-+ return 0;
-+}
-+
-+
-+int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx,
-+ VAAPIDecodePicture *pic,
-+ const void *params_data,
-+ size_t params_size,
-+ const void *slice_data,
-+ size_t slice_size)
-+{
-+ VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data;
-+ VAStatus vas;
-+ int index;
-+
-+ av_assert0(pic->nb_slices <= pic->slices_allocated);
-+ if (pic->nb_slices == pic->slices_allocated) {
-+ if (pic->slices_allocated > 0)
-+ pic->slices_allocated *= 2;
-+ else
-+ pic->slices_allocated = 64;
-+
-+ pic->slice_buffers =
-+ av_realloc_array(pic->slice_buffers,
-+ pic->slices_allocated,
-+ 2 * sizeof(*pic->slice_buffers));
-+ if (!pic->slice_buffers)
-+ return AVERROR(ENOMEM);
-+ }
-+ av_assert0(pic->nb_slices + 1 <= pic->slices_allocated);
-+
-+ index = 2 * pic->nb_slices;
-+
-+ vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context,
-+ VASliceParameterBufferType,
-+ params_size, 1, (void*)params_data,
-+ &pic->slice_buffers[index]);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to create slice "
-+ "parameter buffer: %d (%s).\n", vas, vaErrorStr(vas));
-+ return AVERROR(EIO);
-+ }
-+
-+ av_log(avctx, AV_LOG_DEBUG, "Slice %d param buffer (%zu bytes) "
-+ "is %#x.\n", pic->nb_slices, params_size,
-+ pic->slice_buffers[index]);
-+
-+ vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context,
-+ VASliceDataBufferType,
-+ slice_size, 1, (void*)slice_data,
-+ &pic->slice_buffers[index + 1]);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to create slice "
-+ "data buffer (size %zu): %d (%s).\n",
-+ slice_size, vas, vaErrorStr(vas));
-+ vaDestroyBuffer(ctx->hwctx->display,
-+ pic->slice_buffers[index]);
-+ return AVERROR(EIO);
-+ }
-+
-+ av_log(avctx, AV_LOG_DEBUG, "Slice %d data buffer (%zu bytes) "
-+ "is %#x.\n", pic->nb_slices, slice_size,
-+ pic->slice_buffers[index + 1]);
-+
-+ ++pic->nb_slices;
-+ return 0;
-+}
-+
-+static void ff_vaapi_decode_destroy_buffers(AVCodecContext *avctx,
-+ VAAPIDecodePicture *pic)
-+{
-+ VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data;
-+ VAStatus vas;
-+ int i;
-+
-+ for (i = 0; i < pic->nb_param_buffers; i++) {
-+ vas = vaDestroyBuffer(ctx->hwctx->display,
-+ pic->param_buffers[i]);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to destroy "
-+ "parameter buffer %#x: %d (%s).\n",
-+ pic->param_buffers[i], vas, vaErrorStr(vas));
-+ }
-+ }
-+
-+ for (i = 0; i < 2 * pic->nb_slices; i++) {
-+ vas = vaDestroyBuffer(ctx->hwctx->display,
-+ pic->slice_buffers[i]);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to destroy slice "
-+ "slice buffer %#x: %d (%s).\n",
-+ pic->slice_buffers[i], vas, vaErrorStr(vas));
-+ }
-+ }
-+}
-+
-+int ff_vaapi_decode_issue(AVCodecContext *avctx,
-+ VAAPIDecodePicture *pic)
-+{
-+ VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data;
-+ VAStatus vas;
-+ int err;
-+
-+ av_log(avctx, AV_LOG_DEBUG, "Decode to surface %#x.\n",
-+ pic->output_surface);
-+
-+ vas = vaBeginPicture(ctx->hwctx->display, ctx->va_context,
-+ pic->output_surface);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to begin picture decode "
-+ "issue: %d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail_with_picture;
-+ }
-+
-+ vas = vaRenderPicture(ctx->hwctx->display, ctx->va_context,
-+ pic->param_buffers, pic->nb_param_buffers);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to upload decode "
-+ "parameters: %d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail_with_picture;
-+ }
-+
-+ vas = vaRenderPicture(ctx->hwctx->display, ctx->va_context,
-+ pic->slice_buffers, 2 * pic->nb_slices);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to upload slices: "
-+ "%d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail_with_picture;
-+ }
-+
-+ vas = vaEndPicture(ctx->hwctx->display, ctx->va_context);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to end picture decode "
-+ "issue: %d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ if (CONFIG_VAAPI_1 || ctx->hwctx->driver_quirks &
-+ AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS)
-+ goto fail;
-+ else
-+ goto fail_at_end;
-+ }
-+
-+ if (CONFIG_VAAPI_1 || ctx->hwctx->driver_quirks &
-+ AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS)
-+ ff_vaapi_decode_destroy_buffers(avctx, pic);
-+
-+ err = 0;
-+ goto exit;
-+
-+fail_with_picture:
-+ vas = vaEndPicture(ctx->hwctx->display, ctx->va_context);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to end picture decode "
-+ "after error: %d (%s).\n", vas, vaErrorStr(vas));
-+ }
-+fail:
-+ ff_vaapi_decode_destroy_buffers(avctx, pic);
-+fail_at_end:
-+exit:
-+ pic->nb_param_buffers = 0;
-+ pic->nb_slices = 0;
-+ pic->slices_allocated = 0;
-+ av_freep(&pic->slice_buffers);
-+
-+ return err;
-+}
-+
-+int ff_vaapi_decode_cancel(AVCodecContext *avctx,
-+ VAAPIDecodePicture *pic)
-+{
-+ ff_vaapi_decode_destroy_buffers(avctx, pic);
-+
-+ pic->nb_param_buffers = 0;
-+ pic->nb_slices = 0;
-+ pic->slices_allocated = 0;
-+ av_freep(&pic->slice_buffers);
-+
-+ return 0;
-+}
-+
-+static const struct {
-+ uint32_t fourcc;
-+ enum AVPixelFormat pix_fmt;
-+} vaapi_format_map[] = {
-+#define MAP(va, av) { VA_FOURCC_ ## va, AV_PIX_FMT_ ## av }
-+ // 4:0:0
-+ MAP(Y800, GRAY8),
-+ // 4:2:0
-+ MAP(NV12, NV12),
-+ MAP(YV12, YUV420P),
-+ MAP(IYUV, YUV420P),
-+#ifdef VA_FOURCC_I420
-+ MAP(I420, YUV420P),
-+#endif
-+ MAP(IMC3, YUV420P),
-+ // 4:1:1
-+ MAP(411P, YUV411P),
-+ // 4:2:2
-+ MAP(422H, YUV422P),
-+#ifdef VA_FOURCC_YV16
-+ MAP(YV16, YUV422P),
-+#endif
-+ // 4:4:0
-+ MAP(422V, YUV440P),
-+ // 4:4:4
-+ MAP(444P, YUV444P),
-+ // 4:2:0 10-bit
-+#ifdef VA_FOURCC_P010
-+ MAP(P010, P010),
-+#endif
-+#ifdef VA_FOURCC_I010
-+ MAP(I010, YUV420P10),
-+#endif
-+#undef MAP
-+};
-+
-+static int vaapi_decode_find_best_format(AVCodecContext *avctx,
-+ AVHWDeviceContext *device,
-+ VAConfigID config_id,
-+ AVHWFramesContext *frames)
-+{
-+ AVVAAPIDeviceContext *hwctx = device->hwctx;
-+ VAStatus vas;
-+ VASurfaceAttrib *attr;
-+ enum AVPixelFormat source_format, best_format, format;
-+ uint32_t best_fourcc, fourcc;
-+ int i, j, nb_attr;
-+
-+ source_format = avctx->sw_pix_fmt;
-+ av_assert0(source_format != AV_PIX_FMT_NONE);
-+
-+ vas = vaQuerySurfaceAttributes(hwctx->display, config_id,
-+ NULL, &nb_attr);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to query surface attributes: "
-+ "%d (%s).\n", vas, vaErrorStr(vas));
-+ return AVERROR(ENOSYS);
-+ }
-+
-+ attr = av_malloc_array(nb_attr, sizeof(*attr));
-+ if (!attr)
-+ return AVERROR(ENOMEM);
-+
-+ vas = vaQuerySurfaceAttributes(hwctx->display, config_id,
-+ attr, &nb_attr);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to query surface attributes: "
-+ "%d (%s).\n", vas, vaErrorStr(vas));
-+ av_freep(&attr);
-+ return AVERROR(ENOSYS);
-+ }
-+
-+ best_format = AV_PIX_FMT_NONE;
-+
-+ for (i = 0; i < nb_attr; i++) {
-+ if (attr[i].type != VASurfaceAttribPixelFormat)
-+ continue;
-+
-+ fourcc = attr[i].value.value.i;
-+ for (j = 0; j < FF_ARRAY_ELEMS(vaapi_format_map); j++) {
-+ if (fourcc == vaapi_format_map[j].fourcc)
-+ break;
-+ }
-+ if (j >= FF_ARRAY_ELEMS(vaapi_format_map)) {
-+ av_log(avctx, AV_LOG_DEBUG, "Ignoring unknown format %#x.\n",
-+ fourcc);
-+ continue;
-+ }
-+ format = vaapi_format_map[j].pix_fmt;
-+ av_log(avctx, AV_LOG_DEBUG, "Considering format %#x -> %s.\n",
-+ fourcc, av_get_pix_fmt_name(format));
-+
-+ best_format = av_find_best_pix_fmt_of_2(format, best_format,
-+ source_format, 0, NULL);
-+ if (format == best_format)
-+ best_fourcc = fourcc;
-+ }
-+
-+ av_freep(&attr);
-+
-+ if (best_format == AV_PIX_FMT_NONE) {
-+ av_log(avctx, AV_LOG_ERROR, "No usable formats for decoding!\n");
-+ return AVERROR(EINVAL);
-+ }
-+
-+ av_log(avctx, AV_LOG_DEBUG, "Picked %s (%#x) as best match for %s.\n",
-+ av_get_pix_fmt_name(best_format), best_fourcc,
-+ av_get_pix_fmt_name(source_format));
-+
-+ frames->sw_format = best_format;
-+ if (avctx->internal->hwaccel_priv_data) {
-+ VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data;
-+ AVVAAPIFramesContext *avfc = frames->hwctx;
-+
-+ ctx->pixel_format_attribute = (VASurfaceAttrib) {
-+ .type = VASurfaceAttribPixelFormat,
-+ .value.value.i = best_fourcc,
-+ };
-+
-+ avfc->attributes = &ctx->pixel_format_attribute;
-+ avfc->nb_attributes = 1;
-+ }
-+
-+ return 0;
-+}
-+
-+static const struct {
-+ enum AVCodecID codec_id;
-+ int codec_profile;
-+ VAProfile va_profile;
-+} vaapi_profile_map[] = {
-+#define MAP(c, p, v) { AV_CODEC_ID_ ## c, FF_PROFILE_ ## p, VAProfile ## v }
-+ MAP(MPEG2VIDEO, MPEG2_SIMPLE, MPEG2Simple ),
-+ MAP(MPEG2VIDEO, MPEG2_MAIN, MPEG2Main ),
-+ MAP(H263, UNKNOWN, H263Baseline),
-+ MAP(MPEG4, MPEG4_SIMPLE, MPEG4Simple ),
-+ MAP(MPEG4, MPEG4_ADVANCED_SIMPLE,
-+ MPEG4AdvancedSimple),
-+ MAP(MPEG4, MPEG4_MAIN, MPEG4Main ),
-+ MAP(H264, H264_CONSTRAINED_BASELINE,
-+ H264ConstrainedBaseline),
-+ MAP(H264, H264_MAIN, H264Main ),
-+ MAP(H264, H264_HIGH, H264High ),
-+#if VA_CHECK_VERSION(0, 37, 0)
-+ MAP(HEVC, HEVC_MAIN, HEVCMain ),
-+ MAP(HEVC, HEVC_MAIN_10, HEVCMain10 ),
-+#endif
-+ MAP(MJPEG, MJPEG_HUFFMAN_BASELINE_DCT,
-+ JPEGBaseline),
-+ MAP(WMV3, VC1_SIMPLE, VC1Simple ),
-+ MAP(WMV3, VC1_MAIN, VC1Main ),
-+ MAP(WMV3, VC1_COMPLEX, VC1Advanced ),
-+ MAP(WMV3, VC1_ADVANCED, VC1Advanced ),
-+ MAP(VC1, VC1_SIMPLE, VC1Simple ),
-+ MAP(VC1, VC1_MAIN, VC1Main ),
-+ MAP(VC1, VC1_COMPLEX, VC1Advanced ),
-+ MAP(VC1, VC1_ADVANCED, VC1Advanced ),
-+ MAP(VP8, UNKNOWN, VP8Version0_3 ),
-+#if VA_CHECK_VERSION(0, 38, 0)
-+ MAP(VP9, VP9_0, VP9Profile0 ),
-+#endif
-+#if VA_CHECK_VERSION(0, 39, 0)
-+ MAP(VP9, VP9_2, VP9Profile2 ),
-+#endif
-+#undef MAP
-+};
-+
-+/*
-+ * Set *va_config and the frames_ref fields from the current codec parameters
-+ * in avctx.
-+ */
-+static int vaapi_decode_make_config(AVCodecContext *avctx,
-+ AVBufferRef *device_ref,
-+ VAConfigID *va_config,
-+ AVBufferRef *frames_ref)
-+{
-+ AVVAAPIHWConfig *hwconfig = NULL;
-+ AVHWFramesConstraints *constraints = NULL;
-+ VAStatus vas;
-+ int err, i, j;
-+ const AVCodecDescriptor *codec_desc;
-+ VAProfile *profile_list = NULL, matched_va_profile;
-+ int profile_count, exact_match, matched_ff_profile;
-+
-+ AVHWDeviceContext *device = (AVHWDeviceContext*)device_ref->data;
-+ AVVAAPIDeviceContext *hwctx = device->hwctx;
-+
-+ codec_desc = avcodec_descriptor_get(avctx->codec_id);
-+ if (!codec_desc) {
-+ err = AVERROR(EINVAL);
-+ goto fail;
-+ }
-+
-+ profile_count = vaMaxNumProfiles(hwctx->display);
-+ profile_list = av_malloc_array(profile_count,
-+ sizeof(VAProfile));
-+ if (!profile_list) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+
-+ vas = vaQueryConfigProfiles(hwctx->display,
-+ profile_list, &profile_count);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to query profiles: "
-+ "%d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(ENOSYS);
-+ goto fail;
-+ }
-+
-+ matched_va_profile = VAProfileNone;
-+ exact_match = 0;
-+
-+ for (i = 0; i < FF_ARRAY_ELEMS(vaapi_profile_map); i++) {
-+ int profile_match = 0;
-+ if (avctx->codec_id != vaapi_profile_map[i].codec_id)
-+ continue;
-+ if (avctx->profile == vaapi_profile_map[i].codec_profile ||
-+ vaapi_profile_map[i].codec_profile == FF_PROFILE_UNKNOWN)
-+ profile_match = 1;
-+ for (j = 0; j < profile_count; j++) {
-+ if (vaapi_profile_map[i].va_profile == profile_list[j]) {
-+ exact_match = profile_match;
-+ break;
-+ }
-+ }
-+ if (j < profile_count) {
-+ matched_va_profile = vaapi_profile_map[i].va_profile;
-+ matched_ff_profile = vaapi_profile_map[i].codec_profile;
-+ if (exact_match)
-+ break;
-+ }
-+ }
-+ av_freep(&profile_list);
-+
-+ if (matched_va_profile == VAProfileNone) {
-+ av_log(avctx, AV_LOG_ERROR, "No support for codec %s "
-+ "profile %d.\n", codec_desc->name, avctx->profile);
-+ err = AVERROR(ENOSYS);
-+ goto fail;
-+ }
-+ if (!exact_match) {
-+ if (avctx->hwaccel_flags &
-+ AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH) {
-+ av_log(avctx, AV_LOG_VERBOSE, "Codec %s profile %d not "
-+ "supported for hardware decode.\n",
-+ codec_desc->name, avctx->profile);
-+ av_log(avctx, AV_LOG_WARNING, "Using possibly-"
-+ "incompatible profile %d instead.\n",
-+ matched_ff_profile);
-+ } else {
-+ av_log(avctx, AV_LOG_VERBOSE, "Codec %s profile %d not "
-+ "supported for hardware decode.\n",
-+ codec_desc->name, avctx->profile);
-+ err = AVERROR(EINVAL);
-+ goto fail;
-+ }
-+ }
-+
-+ vas = vaCreateConfig(hwctx->display, matched_va_profile,
-+ VAEntrypointVLD, NULL, 0,
-+ va_config);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to create decode "
-+ "configuration: %d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+
-+ hwconfig = av_hwdevice_hwconfig_alloc(device_ref);
-+ if (!hwconfig) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ hwconfig->config_id = *va_config;
-+
-+ constraints =
-+ av_hwdevice_get_hwframe_constraints(device_ref, hwconfig);
-+ if (!constraints) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+
-+ if (avctx->coded_width < constraints->min_width ||
-+ avctx->coded_height < constraints->min_height ||
-+ avctx->coded_width > constraints->max_width ||
-+ avctx->coded_height > constraints->max_height) {
-+ av_log(avctx, AV_LOG_ERROR, "Hardware does not support image "
-+ "size %dx%d (constraints: width %d-%d height %d-%d).\n",
-+ avctx->coded_width, avctx->coded_height,
-+ constraints->min_width, constraints->max_width,
-+ constraints->min_height, constraints->max_height);
-+ err = AVERROR(EINVAL);
-+ goto fail;
-+ }
-+ if (!constraints->valid_sw_formats ||
-+ constraints->valid_sw_formats[0] == AV_PIX_FMT_NONE) {
-+ av_log(avctx, AV_LOG_ERROR, "Hardware does not offer any "
-+ "usable surface formats.\n");
-+ err = AVERROR(EINVAL);
-+ goto fail;
-+ }
-+
-+ if (frames_ref) {
-+ AVHWFramesContext *frames = (AVHWFramesContext *)frames_ref->data;
-+
-+ frames->format = AV_PIX_FMT_VAAPI;
-+ frames->width = avctx->coded_width;
-+ frames->height = avctx->coded_height;
-+
-+ err = vaapi_decode_find_best_format(avctx, device,
-+ *va_config, frames);
-+ if (err < 0)
-+ goto fail;
-+
-+ frames->initial_pool_size = 1;
-+ // Add per-codec number of surfaces used for storing reference frames.
-+ switch (avctx->codec_id) {
-+ case AV_CODEC_ID_H264:
-+ case AV_CODEC_ID_HEVC:
-+ frames->initial_pool_size += 16;
-+ break;
-+ case AV_CODEC_ID_VP9:
-+ frames->initial_pool_size += 8;
-+ break;
-+ case AV_CODEC_ID_VP8:
-+ frames->initial_pool_size += 3;
-+ break;
-+ default:
-+ frames->initial_pool_size += 2;
-+ }
-+ }
-+
-+ av_hwframe_constraints_free(&constraints);
-+ av_freep(&hwconfig);
-+
-+ return 0;
-+
-+fail:
-+ av_hwframe_constraints_free(&constraints);
-+ av_freep(&hwconfig);
-+ if (*va_config != VA_INVALID_ID) {
-+ vaDestroyConfig(hwctx->display, *va_config);
-+ *va_config = VA_INVALID_ID;
-+ }
-+ av_freep(&profile_list);
-+ return err;
-+}
-+
-+int ff_vaapi_common_frame_params(AVCodecContext *avctx,
-+ AVBufferRef *hw_frames_ctx)
-+{
-+ AVHWFramesContext *hw_frames = (AVHWFramesContext *)hw_frames_ctx->data;
-+ AVHWDeviceContext *device_ctx = hw_frames->device_ctx;
-+ AVVAAPIDeviceContext *hwctx;
-+ VAConfigID va_config = VA_INVALID_ID;
-+ int err;
-+
-+ if (device_ctx->type != AV_HWDEVICE_TYPE_VAAPI)
-+ return AVERROR(EINVAL);
-+ hwctx = device_ctx->hwctx;
-+
-+ err = vaapi_decode_make_config(avctx, hw_frames->device_ref, &va_config,
-+ hw_frames_ctx);
-+ if (err)
-+ return err;
-+
-+ if (va_config != VA_INVALID_ID)
-+ vaDestroyConfig(hwctx->display, va_config);
-+
-+ return 0;
-+}
-+
-+int ff_vaapi_decode_init(AVCodecContext *avctx)
-+{
-+ VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data;
-+ VAStatus vas;
-+ int err;
-+
-+ ctx->va_config = VA_INVALID_ID;
-+ ctx->va_context = VA_INVALID_ID;
-+
-+#if FF_API_STRUCT_VAAPI_CONTEXT
-+ if (avctx->hwaccel_context) {
-+ av_log(avctx, AV_LOG_WARNING, "Using deprecated struct "
-+ "vaapi_context in decode.\n");
-+
-+ ctx->have_old_context = 1;
-+ ctx->old_context = avctx->hwaccel_context;
-+
-+ // Really we only want the VAAPI device context, but this
-+ // allocates a whole generic device context because we don't
-+ // have any other way to determine how big it should be.
-+ ctx->device_ref =
-+ av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_VAAPI);
-+ if (!ctx->device_ref) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ ctx->device = (AVHWDeviceContext*)ctx->device_ref->data;
-+ ctx->hwctx = ctx->device->hwctx;
-+
-+ ctx->hwctx->display = ctx->old_context->display;
-+
-+ // The old VAAPI decode setup assumed this quirk was always
-+ // present, so set it here to avoid the behaviour changing.
-+ ctx->hwctx->driver_quirks =
-+ AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS;
-+
-+ }
-+#endif
-+
-+#if FF_API_STRUCT_VAAPI_CONTEXT
-+ if (ctx->have_old_context) {
-+ ctx->va_config = ctx->old_context->config_id;
-+ ctx->va_context = ctx->old_context->context_id;
-+
-+ av_log(avctx, AV_LOG_DEBUG, "Using user-supplied decoder "
-+ "context: %#x/%#x.\n", ctx->va_config, ctx->va_context);
-+ } else {
-+#endif
-+
-+ err = ff_decode_get_hw_frames_ctx(avctx, AV_HWDEVICE_TYPE_VAAPI);
-+ if (err < 0)
-+ goto fail;
-+
-+ ctx->frames = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
-+ ctx->hwfc = ctx->frames->hwctx;
-+ ctx->device = ctx->frames->device_ctx;
-+ ctx->hwctx = ctx->device->hwctx;
-+
-+ err = vaapi_decode_make_config(avctx, ctx->frames->device_ref,
-+ &ctx->va_config, avctx->hw_frames_ctx);
-+ if (err)
-+ goto fail;
-+
-+ vas = vaCreateContext(ctx->hwctx->display, ctx->va_config,
-+ avctx->coded_width, avctx->coded_height,
-+ VA_PROGRESSIVE,
-+ ctx->hwfc->surface_ids,
-+ ctx->hwfc->nb_surfaces,
-+ &ctx->va_context);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to create decode "
-+ "context: %d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+
-+ av_log(avctx, AV_LOG_DEBUG, "Decode context initialised: "
-+ "%#x/%#x.\n", ctx->va_config, ctx->va_context);
-+#if FF_API_STRUCT_VAAPI_CONTEXT
-+ }
-+#endif
-+
-+ return 0;
-+
-+fail:
-+ ff_vaapi_decode_uninit(avctx);
-+ return err;
-+}
-+
-+int ff_vaapi_decode_uninit(AVCodecContext *avctx)
-+{
-+ VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data;
-+ VAStatus vas;
-+
-+#if FF_API_STRUCT_VAAPI_CONTEXT
-+ if (ctx->have_old_context) {
-+ av_buffer_unref(&ctx->device_ref);
-+ } else {
-+#endif
-+
-+ if (ctx->va_context != VA_INVALID_ID) {
-+ vas = vaDestroyContext(ctx->hwctx->display, ctx->va_context);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to destroy decode "
-+ "context %#x: %d (%s).\n",
-+ ctx->va_context, vas, vaErrorStr(vas));
-+ }
-+ }
-+ if (ctx->va_config != VA_INVALID_ID) {
-+ vas = vaDestroyConfig(ctx->hwctx->display, ctx->va_config);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(avctx, AV_LOG_ERROR, "Failed to destroy decode "
-+ "configuration %#x: %d (%s).\n",
-+ ctx->va_config, vas, vaErrorStr(vas));
-+ }
-+ }
-+
-+#if FF_API_STRUCT_VAAPI_CONTEXT
-+ }
-+#endif
-+
-+ return 0;
-+}
-diff -up firefox-84.0/media/ffvpx/libavcodec/vaapi_decode.h.ffvpx firefox-84.0/media/ffvpx/libavcodec/vaapi_decode.h
---- firefox-84.0/media/ffvpx/libavcodec/vaapi_decode.h.ffvpx 2020-12-10 20:40:53.389541365 +0100
-+++ firefox-84.0/media/ffvpx/libavcodec/vaapi_decode.h 2020-12-10 20:40:53.389541365 +0100
-@@ -0,0 +1,105 @@
-+/*
-+ * This file is part of FFmpeg.
-+ *
-+ * FFmpeg is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * FFmpeg is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with FFmpeg; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#ifndef AVCODEC_VAAPI_DECODE_H
-+#define AVCODEC_VAAPI_DECODE_H
-+
-+#include <va/va.h>
-+#include <va/va_dec_vp9.h>
-+
-+#include "libavutil/frame.h"
-+#include "libavutil/hwcontext.h"
-+#include "libavutil/hwcontext_vaapi.h"
-+
-+#include "avcodec.h"
-+
-+#include "version.h"
-+#if FF_API_STRUCT_VAAPI_CONTEXT
-+#include "vaapi.h"
-+#endif
-+
-+static inline VASurfaceID ff_vaapi_get_surface_id(AVFrame *pic)
-+{
-+ return (uintptr_t)pic->data[3];
-+}
-+
-+enum {
-+ MAX_PARAM_BUFFERS = 16,
-+};
-+
-+typedef struct VAAPIDecodePicture {
-+ VASurfaceID output_surface;
-+
-+ int nb_param_buffers;
-+ VABufferID param_buffers[MAX_PARAM_BUFFERS];
-+
-+ int nb_slices;
-+ VABufferID *slice_buffers;
-+ int slices_allocated;
-+} VAAPIDecodePicture;
-+
-+typedef struct VAAPIDecodeContext {
-+ VAConfigID va_config;
-+ VAContextID va_context;
-+
-+#if FF_API_STRUCT_VAAPI_CONTEXT
-+FF_DISABLE_DEPRECATION_WARNINGS
-+ int have_old_context;
-+ struct vaapi_context *old_context;
-+ AVBufferRef *device_ref;
-+FF_ENABLE_DEPRECATION_WARNINGS
-+#endif
-+
-+ AVHWDeviceContext *device;
-+ AVVAAPIDeviceContext *hwctx;
-+
-+ AVHWFramesContext *frames;
-+ AVVAAPIFramesContext *hwfc;
-+
-+ enum AVPixelFormat surface_format;
-+ int surface_count;
-+
-+ VASurfaceAttrib pixel_format_attribute;
-+} VAAPIDecodeContext;
-+
-+
-+int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx,
-+ VAAPIDecodePicture *pic,
-+ int type,
-+ const void *data,
-+ size_t size);
-+
-+int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx,
-+ VAAPIDecodePicture *pic,
-+ const void *params_data,
-+ size_t params_size,
-+ const void *slice_data,
-+ size_t slice_size);
-+
-+int ff_vaapi_decode_issue(AVCodecContext *avctx,
-+ VAAPIDecodePicture *pic);
-+int ff_vaapi_decode_cancel(AVCodecContext *avctx,
-+ VAAPIDecodePicture *pic);
-+
-+int ff_vaapi_decode_init(AVCodecContext *avctx);
-+int ff_vaapi_decode_uninit(AVCodecContext *avctx);
-+
-+int ff_vaapi_common_frame_params(AVCodecContext *avctx,
-+ AVBufferRef *hw_frames_ctx);
-+
-+#endif /* AVCODEC_VAAPI_DECODE_H */
-diff -up firefox-84.0/media/ffvpx/libavcodec/vaapi.h.ffvpx firefox-84.0/media/ffvpx/libavcodec/vaapi.h
---- firefox-84.0/media/ffvpx/libavcodec/vaapi.h.ffvpx 2020-12-10 20:40:53.389541365 +0100
-+++ firefox-84.0/media/ffvpx/libavcodec/vaapi.h 2020-12-10 20:40:53.389541365 +0100
-@@ -0,0 +1,86 @@
-+/*
-+ * Video Acceleration API (shared data between FFmpeg and the video player)
-+ * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1
-+ *
-+ * Copyright (C) 2008-2009 Splitted-Desktop Systems
-+ *
-+ * This file is part of FFmpeg.
-+ *
-+ * FFmpeg is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * FFmpeg is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with FFmpeg; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#ifndef AVCODEC_VAAPI_H
-+#define AVCODEC_VAAPI_H
-+
-+/**
-+ * @file
-+ * @ingroup lavc_codec_hwaccel_vaapi
-+ * Public libavcodec VA API header.
-+ */
-+
-+#include <stdint.h>
-+#include "libavutil/attributes.h"
-+#include "version.h"
-+
-+#if FF_API_STRUCT_VAAPI_CONTEXT
-+
-+/**
-+ * @defgroup lavc_codec_hwaccel_vaapi VA API Decoding
-+ * @ingroup lavc_codec_hwaccel
-+ * @{
-+ */
-+
-+/**
-+ * This structure is used to share data between the FFmpeg library and
-+ * the client video application.
-+ * This shall be zero-allocated and available as
-+ * AVCodecContext.hwaccel_context. All user members can be set once
-+ * during initialization or through each AVCodecContext.get_buffer()
-+ * function call. In any case, they must be valid prior to calling
-+ * decoding functions.
-+ *
-+ * Deprecated: use AVCodecContext.hw_frames_ctx instead.
-+ */
-+struct attribute_deprecated vaapi_context {
-+ /**
-+ * Window system dependent data
-+ *
-+ * - encoding: unused
-+ * - decoding: Set by user
-+ */
-+ void *display;
-+
-+ /**
-+ * Configuration ID
-+ *
-+ * - encoding: unused
-+ * - decoding: Set by user
-+ */
-+ uint32_t config_id;
-+
-+ /**
-+ * Context ID (video decode pipeline)
-+ *
-+ * - encoding: unused
-+ * - decoding: Set by user
-+ */
-+ uint32_t context_id;
-+};
-+
-+/* @} */
-+
-+#endif /* FF_API_STRUCT_VAAPI_CONTEXT */
-+
-+#endif /* AVCODEC_VAAPI_H */
-diff -up firefox-84.0/media/ffvpx/libavcodec/vaapi_vp8.c.ffvpx firefox-84.0/media/ffvpx/libavcodec/vaapi_vp8.c
---- firefox-84.0/media/ffvpx/libavcodec/vaapi_vp8.c.ffvpx 2020-12-10 20:40:53.389541365 +0100
-+++ firefox-84.0/media/ffvpx/libavcodec/vaapi_vp8.c 2020-12-10 20:40:53.389541365 +0100
-@@ -0,0 +1,237 @@
-+/*
-+ * This file is part of FFmpeg.
-+ *
-+ * FFmpeg is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * FFmpeg is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with FFmpeg; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#include <va/va.h>
-+#include <va/va_dec_vp8.h>
-+
-+#include "hwaccel.h"
-+#include "vaapi_decode.h"
-+#include "vp8.h"
-+
-+static VASurfaceID vaapi_vp8_surface_id(VP8Frame *vf)
-+{
-+ if (vf)
-+ return ff_vaapi_get_surface_id(vf->tf.f);
-+ else
-+ return VA_INVALID_SURFACE;
-+}
-+
-+static int vaapi_vp8_start_frame(AVCodecContext *avctx,
-+ av_unused const uint8_t *buffer,
-+ av_unused uint32_t size)
-+{
-+ const VP8Context *s = avctx->priv_data;
-+ VAAPIDecodePicture *pic = s->framep[VP56_FRAME_CURRENT]->hwaccel_picture_private;
-+ VAPictureParameterBufferVP8 pp;
-+ VAProbabilityDataBufferVP8 prob;
-+ VAIQMatrixBufferVP8 quant;
-+ int err, i, j, k;
-+
-+ pic->output_surface = vaapi_vp8_surface_id(s->framep[VP56_FRAME_CURRENT]);
-+
-+ pp = (VAPictureParameterBufferVP8) {
-+ .frame_width = avctx->width,
-+ .frame_height = avctx->height,
-+
-+ .last_ref_frame = vaapi_vp8_surface_id(s->framep[VP56_FRAME_PREVIOUS]),
-+ .golden_ref_frame = vaapi_vp8_surface_id(s->framep[VP56_FRAME_GOLDEN]),
-+ .alt_ref_frame = vaapi_vp8_surface_id(s->framep[VP56_FRAME_GOLDEN2]),
-+ .out_of_loop_frame = VA_INVALID_SURFACE,
-+
-+ .pic_fields.bits = {
-+ .key_frame = !s->keyframe,
-+ .version = s->profile,
-+
-+ .segmentation_enabled = s->segmentation.enabled,
-+ .update_mb_segmentation_map = s->segmentation.update_map,
-+ .update_segment_feature_data = s->segmentation.update_feature_data,
-+
-+ .filter_type = s->filter.simple,
-+ .sharpness_level = s->filter.sharpness,
-+
-+ .loop_filter_adj_enable = s->lf_delta.enabled,
-+ .mode_ref_lf_delta_update = s->lf_delta.update,
-+
-+ .sign_bias_golden = s->sign_bias[VP56_FRAME_GOLDEN],
-+ .sign_bias_alternate = s->sign_bias[VP56_FRAME_GOLDEN2],
-+
-+ .mb_no_coeff_skip = s->mbskip_enabled,
-+ .loop_filter_disable = s->filter.level == 0,
-+ },
-+
-+ .prob_skip_false = s->prob->mbskip,
-+ .prob_intra = s->prob->intra,
-+ .prob_last = s->prob->last,
-+ .prob_gf = s->prob->golden,
-+ };
-+
-+ for (i = 0; i < 3; i++)
-+ pp.mb_segment_tree_probs[i] = s->prob->segmentid[i];
-+
-+ for (i = 0; i < 4; i++) {
-+ if (s->segmentation.enabled) {
-+ pp.loop_filter_level[i] = s->segmentation.filter_level[i];
-+ if (!s->segmentation.absolute_vals)
-+ pp.loop_filter_level[i] += s->filter.level;
-+ } else {
-+ pp.loop_filter_level[i] = s->filter.level;
-+ }
-+ pp.loop_filter_level[i] = av_clip_uintp2(pp.loop_filter_level[i], 6);
-+ }
-+
-+ for (i = 0; i < 4; i++) {
-+ pp.loop_filter_deltas_ref_frame[i] = s->lf_delta.ref[i];
-+ pp.loop_filter_deltas_mode[i] = s->lf_delta.mode[i + 4];
-+ }
-+
-+ if (s->keyframe) {
-+ static const uint8_t keyframe_y_mode_probs[4] = {
-+ 145, 156, 163, 128
-+ };
-+ static const uint8_t keyframe_uv_mode_probs[3] = {
-+ 142, 114, 183
-+ };
-+ memcpy(pp.y_mode_probs, keyframe_y_mode_probs, 4);
-+ memcpy(pp.uv_mode_probs, keyframe_uv_mode_probs, 3);
-+ } else {
-+ for (i = 0; i < 4; i++)
-+ pp.y_mode_probs[i] = s->prob->pred16x16[i];
-+ for (i = 0; i < 3; i++)
-+ pp.uv_mode_probs[i] = s->prob->pred8x8c[i];
-+ }
-+ for (i = 0; i < 2; i++)
-+ for (j = 0; j < 19; j++)
-+ pp.mv_probs[i][j] = s->prob->mvc[i][j];
-+
-+ pp.bool_coder_ctx.range = s->coder_state_at_header_end.range;
-+ pp.bool_coder_ctx.value = s->coder_state_at_header_end.value;
-+ pp.bool_coder_ctx.count = s->coder_state_at_header_end.bit_count;
-+
-+ err = ff_vaapi_decode_make_param_buffer(avctx, pic,
-+ VAPictureParameterBufferType,
-+ &pp, sizeof(pp));
-+ if (err < 0)
-+ goto fail;
-+
-+ for (i = 0; i < 4; i++) {
-+ for (j = 0; j < 8; j++) {
-+ static const int coeff_bands_inverse[8] = {
-+ 0, 1, 2, 3, 5, 6, 4, 15
-+ };
-+ int coeff_pos = coeff_bands_inverse[j];
-+
-+ for (k = 0; k < 3; k++) {
-+ memcpy(prob.dct_coeff_probs[i][j][k],
-+ s->prob->token[i][coeff_pos][k], 11);
-+ }
-+ }
-+ }
-+
-+ err = ff_vaapi_decode_make_param_buffer(avctx, pic,
-+ VAProbabilityBufferType,
-+ &prob, sizeof(prob));
-+ if (err < 0)
-+ goto fail;
-+
-+ for (i = 0; i < 4; i++) {
-+ int base_qi = s->segmentation.base_quant[i];
-+ if (!s->segmentation.absolute_vals)
-+ base_qi += s->quant.yac_qi;
-+
-+ quant.quantization_index[i][0] = av_clip_uintp2(base_qi, 7);
-+ quant.quantization_index[i][1] = av_clip_uintp2(base_qi + s->quant.ydc_delta, 7);
-+ quant.quantization_index[i][2] = av_clip_uintp2(base_qi + s->quant.y2dc_delta, 7);
-+ quant.quantization_index[i][3] = av_clip_uintp2(base_qi + s->quant.y2ac_delta, 7);
-+ quant.quantization_index[i][4] = av_clip_uintp2(base_qi + s->quant.uvdc_delta, 7);
-+ quant.quantization_index[i][5] = av_clip_uintp2(base_qi + s->quant.uvac_delta, 7);
-+ }
-+
-+ err = ff_vaapi_decode_make_param_buffer(avctx, pic,
-+ VAIQMatrixBufferType,
-+ &quant, sizeof(quant));
-+ if (err < 0)
-+ goto fail;
-+
-+ return 0;
-+
-+fail:
-+ ff_vaapi_decode_cancel(avctx, pic);
-+ return err;
-+}
-+
-+static int vaapi_vp8_end_frame(AVCodecContext *avctx)
-+{
-+ const VP8Context *s = avctx->priv_data;
-+ VAAPIDecodePicture *pic = s->framep[VP56_FRAME_CURRENT]->hwaccel_picture_private;
-+
-+ return ff_vaapi_decode_issue(avctx, pic);
-+}
-+
-+static int vaapi_vp8_decode_slice(AVCodecContext *avctx,
-+ const uint8_t *buffer,
-+ uint32_t size)
-+{
-+ const VP8Context *s = avctx->priv_data;
-+ VAAPIDecodePicture *pic = s->framep[VP56_FRAME_CURRENT]->hwaccel_picture_private;
-+ VASliceParameterBufferVP8 sp;
-+ int err, i;
-+
-+ unsigned int header_size = 3 + 7 * s->keyframe;
-+ const uint8_t *data = buffer + header_size;
-+ unsigned int data_size = size - header_size;
-+
-+ sp = (VASliceParameterBufferVP8) {
-+ .slice_data_size = data_size,
-+ .slice_data_offset = 0,
-+ .slice_data_flag = VA_SLICE_DATA_FLAG_ALL,
-+
-+ .macroblock_offset = (8 * (s->coder_state_at_header_end.input - data) -
-+ s->coder_state_at_header_end.bit_count - 8),
-+ .num_of_partitions = s->num_coeff_partitions + 1,
-+ };
-+
-+ sp.partition_size[0] = s->header_partition_size - ((sp.macroblock_offset + 7) / 8);
-+ for (i = 0; i < 8; i++)
-+ sp.partition_size[i+1] = s->coeff_partition_size[i];
-+
-+ err = ff_vaapi_decode_make_slice_buffer(avctx, pic, &sp, sizeof(sp), data, data_size);
-+ if (err)
-+ goto fail;
-+
-+ return 0;
-+
-+fail:
-+ ff_vaapi_decode_cancel(avctx, pic);
-+ return err;
-+}
-+
-+const AVHWAccel ff_vp8_vaapi_hwaccel = {
-+ .name = "vp8_vaapi",
-+ .type = AVMEDIA_TYPE_VIDEO,
-+ .id = AV_CODEC_ID_VP8,
-+ .pix_fmt = AV_PIX_FMT_VAAPI,
-+ .start_frame = &vaapi_vp8_start_frame,
-+ .end_frame = &vaapi_vp8_end_frame,
-+ .decode_slice = &vaapi_vp8_decode_slice,
-+ .frame_priv_data_size = sizeof(VAAPIDecodePicture),
-+ .init = &ff_vaapi_decode_init,
-+ .uninit = &ff_vaapi_decode_uninit,
-+ .frame_params = &ff_vaapi_common_frame_params,
-+ .priv_data_size = sizeof(VAAPIDecodeContext),
-+ .caps_internal = HWACCEL_CAP_ASYNC_SAFE,
-+};
-diff -up firefox-84.0/media/ffvpx/libavcodec/vaapi_vp9.c.ffvpx firefox-84.0/media/ffvpx/libavcodec/vaapi_vp9.c
---- firefox-84.0/media/ffvpx/libavcodec/vaapi_vp9.c.ffvpx 2020-12-10 20:40:53.389541365 +0100
-+++ firefox-84.0/media/ffvpx/libavcodec/vaapi_vp9.c 2020-12-10 20:40:53.389541365 +0100
-@@ -0,0 +1,185 @@
-+/*
-+ * VP9 HW decode acceleration through VA API
-+ *
-+ * Copyright (C) 2015 Timo Rothenpieler <timo@rothenpieler.org>
-+ *
-+ * This file is part of FFmpeg.
-+ *
-+ * FFmpeg is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * FFmpeg is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with FFmpeg; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#include "libavutil/pixdesc.h"
-+
-+#include "hwaccel.h"
-+#include "vaapi_decode.h"
-+#include "vp9shared.h"
-+
-+static VASurfaceID vaapi_vp9_surface_id(const VP9Frame *vf)
-+{
-+ if (vf)
-+ return ff_vaapi_get_surface_id(vf->tf.f);
-+ else
-+ return VA_INVALID_SURFACE;
-+}
-+
-+static int vaapi_vp9_start_frame(AVCodecContext *avctx,
-+ av_unused const uint8_t *buffer,
-+ av_unused uint32_t size)
-+{
-+ const VP9SharedContext *h = avctx->priv_data;
-+ VAAPIDecodePicture *pic = h->frames[CUR_FRAME].hwaccel_picture_private;
-+ VADecPictureParameterBufferVP9 pic_param;
-+ const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
-+ int err, i;
-+
-+ pic->output_surface = vaapi_vp9_surface_id(&h->frames[CUR_FRAME]);
-+
-+ pic_param = (VADecPictureParameterBufferVP9) {
-+ .frame_width = avctx->width,
-+ .frame_height = avctx->height,
-+
-+ .pic_fields.bits = {
-+ .subsampling_x = pixdesc->log2_chroma_w,
-+ .subsampling_y = pixdesc->log2_chroma_h,
-+ .frame_type = !h->h.keyframe,
-+ .show_frame = !h->h.invisible,
-+ .error_resilient_mode = h->h.errorres,
-+ .intra_only = h->h.intraonly,
-+ .allow_high_precision_mv = h->h.keyframe ? 0 : h->h.highprecisionmvs,
-+ .mcomp_filter_type = h->h.filtermode ^ (h->h.filtermode <= 1),
-+ .frame_parallel_decoding_mode = h->h.parallelmode,
-+ .reset_frame_context = h->h.resetctx,
-+ .refresh_frame_context = h->h.refreshctx,
-+ .frame_context_idx = h->h.framectxid,
-+
-+ .segmentation_enabled = h->h.segmentation.enabled,
-+ .segmentation_temporal_update = h->h.segmentation.temporal,
-+ .segmentation_update_map = h->h.segmentation.update_map,
-+
-+ .last_ref_frame = h->h.refidx[0],
-+ .last_ref_frame_sign_bias = h->h.signbias[0],
-+ .golden_ref_frame = h->h.refidx[1],
-+ .golden_ref_frame_sign_bias = h->h.signbias[1],
-+ .alt_ref_frame = h->h.refidx[2],
-+ .alt_ref_frame_sign_bias = h->h.signbias[2],
-+ .lossless_flag = h->h.lossless,
-+ },
-+
-+ .filter_level = h->h.filter.level,
-+ .sharpness_level = h->h.filter.sharpness,
-+ .log2_tile_rows = h->h.tiling.log2_tile_rows,
-+ .log2_tile_columns = h->h.tiling.log2_tile_cols,
-+
-+ .frame_header_length_in_bytes = h->h.uncompressed_header_size,
-+ .first_partition_size = h->h.compressed_header_size,
-+
-+ .profile = h->h.profile,
-+ .bit_depth = h->h.bpp,
-+ };
-+
-+ for (i = 0; i < 7; i++)
-+ pic_param.mb_segment_tree_probs[i] = h->h.segmentation.prob[i];
-+
-+ if (h->h.segmentation.temporal) {
-+ for (i = 0; i < 3; i++)
-+ pic_param.segment_pred_probs[i] = h->h.segmentation.pred_prob[i];
-+ } else {
-+ memset(pic_param.segment_pred_probs, 255, sizeof(pic_param.segment_pred_probs));
-+ }
-+
-+ for (i = 0; i < 8; i++) {
-+ if (h->refs[i].f->buf[0])
-+ pic_param.reference_frames[i] = ff_vaapi_get_surface_id(h->refs[i].f);
-+ else
-+ pic_param.reference_frames[i] = VA_INVALID_ID;
-+ }
-+
-+ err = ff_vaapi_decode_make_param_buffer(avctx, pic,
-+ VAPictureParameterBufferType,
-+ &pic_param, sizeof(pic_param));
-+ if (err < 0) {
-+ ff_vaapi_decode_cancel(avctx, pic);
-+ return err;
-+ }
-+
-+ return 0;
-+}
-+
-+static int vaapi_vp9_end_frame(AVCodecContext *avctx)
-+{
-+ const VP9SharedContext *h = avctx->priv_data;
-+ VAAPIDecodePicture *pic = h->frames[CUR_FRAME].hwaccel_picture_private;
-+
-+ return ff_vaapi_decode_issue(avctx, pic);
-+}
-+
-+static int vaapi_vp9_decode_slice(AVCodecContext *avctx,
-+ const uint8_t *buffer,
-+ uint32_t size)
-+{
-+ const VP9SharedContext *h = avctx->priv_data;
-+ VAAPIDecodePicture *pic = h->frames[CUR_FRAME].hwaccel_picture_private;
-+ VASliceParameterBufferVP9 slice_param;
-+ int err, i;
-+
-+ slice_param = (VASliceParameterBufferVP9) {
-+ .slice_data_size = size,
-+ .slice_data_offset = 0,
-+ .slice_data_flag = VA_SLICE_DATA_FLAG_ALL,
-+ };
-+
-+ for (i = 0; i < 8; i++) {
-+ slice_param.seg_param[i] = (VASegmentParameterVP9) {
-+ .segment_flags.fields = {
-+ .segment_reference_enabled = h->h.segmentation.feat[i].ref_enabled,
-+ .segment_reference = h->h.segmentation.feat[i].ref_val,
-+ .segment_reference_skipped = h->h.segmentation.feat[i].skip_enabled,
-+ },
-+
-+ .luma_dc_quant_scale = h->h.segmentation.feat[i].qmul[0][0],
-+ .luma_ac_quant_scale = h->h.segmentation.feat[i].qmul[0][1],
-+ .chroma_dc_quant_scale = h->h.segmentation.feat[i].qmul[1][0],
-+ .chroma_ac_quant_scale = h->h.segmentation.feat[i].qmul[1][1],
-+ };
-+
-+ memcpy(slice_param.seg_param[i].filter_level, h->h.segmentation.feat[i].lflvl, sizeof(slice_param.seg_param[i].filter_level));
-+ }
-+
-+ err = ff_vaapi_decode_make_slice_buffer(avctx, pic,
-+ &slice_param, sizeof(slice_param),
-+ buffer, size);
-+ if (err) {
-+ ff_vaapi_decode_cancel(avctx, pic);
-+ return err;
-+ }
-+
-+ return 0;
-+}
-+
-+const AVHWAccel ff_vp9_vaapi_hwaccel = {
-+ .name = "vp9_vaapi",
-+ .type = AVMEDIA_TYPE_VIDEO,
-+ .id = AV_CODEC_ID_VP9,
-+ .pix_fmt = AV_PIX_FMT_VAAPI,
-+ .start_frame = vaapi_vp9_start_frame,
-+ .end_frame = vaapi_vp9_end_frame,
-+ .decode_slice = vaapi_vp9_decode_slice,
-+ .frame_priv_data_size = sizeof(VAAPIDecodePicture),
-+ .init = ff_vaapi_decode_init,
-+ .uninit = ff_vaapi_decode_uninit,
-+ .frame_params = ff_vaapi_common_frame_params,
-+ .priv_data_size = sizeof(VAAPIDecodeContext),
-+ .caps_internal = HWACCEL_CAP_ASYNC_SAFE,
-+};
-diff -up firefox-84.0/media/ffvpx/libavutil/avutil.symbols.ffvpx firefox-84.0/media/ffvpx/libavutil/avutil.symbols
---- firefox-84.0/media/ffvpx/libavutil/avutil.symbols.ffvpx 2020-12-08 00:35:05.000000000 +0100
-+++ firefox-84.0/media/ffvpx/libavutil/avutil.symbols 2020-12-10 20:40:53.389541365 +0100
-@@ -158,6 +158,9 @@ av_get_token
- av_gettime
- av_gettime_relative
- av_gettime_relative_is_monotonic
-+av_hwdevice_get_hwframe_constraints
-+av_hwdevice_hwconfig_alloc
-+av_hwframe_constraints_free
- av_hwframe_get_buffer
- av_image_alloc
- av_image_check_sar
-@@ -320,5 +323,9 @@ avpriv_slicethread_free
- av_hwdevice_get_type_name
- av_hwframe_ctx_alloc
- av_hwframe_ctx_init
-+av_hwdevice_ctx_alloc
-+av_hwdevice_ctx_init
-+av_hwframe_transfer_get_formats
-+av_hwdevice_ctx_create_derived
- av_malloc_array
- av_mallocz_array
-diff -up firefox-84.0/media/ffvpx/libavutil/hwcontext_vaapi.c.ffvpx firefox-84.0/media/ffvpx/libavutil/hwcontext_vaapi.c
---- firefox-84.0/media/ffvpx/libavutil/hwcontext_vaapi.c.ffvpx 2020-12-10 20:40:53.390541394 +0100
-+++ firefox-84.0/media/ffvpx/libavutil/hwcontext_vaapi.c 2020-12-10 20:40:53.389541365 +0100
-@@ -0,0 +1,1691 @@
-+/*
-+ * This file is part of FFmpeg.
-+ *
-+ * FFmpeg is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * FFmpeg is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with FFmpeg; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#include "config.h"
-+
-+#if HAVE_VAAPI_X11
-+# include <va/va_x11.h>
-+#endif
-+#if HAVE_VAAPI_DRM
-+# include <va/va_drm.h>
-+#endif
-+
-+#if CONFIG_LIBDRM
-+# include <va/va_drmcommon.h>
-+# include <xf86drm.h>
-+# include <drm_fourcc.h>
-+# ifndef DRM_FORMAT_MOD_INVALID
-+# define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1)
-+# endif
-+#endif
-+
-+#include <fcntl.h>
-+#if HAVE_UNISTD_H
-+# include <unistd.h>
-+#endif
-+
-+
-+#include "avassert.h"
-+#include "buffer.h"
-+#include "common.h"
-+#include "hwcontext.h"
-+#if CONFIG_LIBDRM
-+#include "hwcontext_drm.h"
-+#endif
-+#include "hwcontext_internal.h"
-+#include "hwcontext_vaapi.h"
-+#include "mem.h"
-+#include "pixdesc.h"
-+#include "pixfmt.h"
-+
-+
-+typedef struct VAAPIDevicePriv {
-+#if HAVE_VAAPI_X11
-+ Display *x11_display;
-+#endif
-+
-+ int drm_fd;
-+} VAAPIDevicePriv;
-+
-+typedef struct VAAPISurfaceFormat {
-+ enum AVPixelFormat pix_fmt;
-+ VAImageFormat image_format;
-+} VAAPISurfaceFormat;
-+
-+typedef struct VAAPIDeviceContext {
-+ // Surface formats which can be used with this device.
-+ VAAPISurfaceFormat *formats;
-+ int nb_formats;
-+} VAAPIDeviceContext;
-+
-+typedef struct VAAPIFramesContext {
-+ // Surface attributes set at create time.
-+ VASurfaceAttrib *attributes;
-+ int nb_attributes;
-+ // RT format of the underlying surface (Intel driver ignores this anyway).
-+ unsigned int rt_format;
-+ // Whether vaDeriveImage works.
-+ int derive_works;
-+} VAAPIFramesContext;
-+
-+typedef struct VAAPIMapping {
-+ // Handle to the derived or copied image which is mapped.
-+ VAImage image;
-+ // The mapping flags actually used.
-+ int flags;
-+} VAAPIMapping;
-+
-+typedef struct VAAPIFormat {
-+ unsigned int fourcc;
-+ unsigned int rt_format;
-+ enum AVPixelFormat pix_fmt;
-+ int chroma_planes_swapped;
-+} VAAPIFormatDescriptor;
-+
-+#define MAP(va, rt, av, swap_uv) { \
-+ VA_FOURCC_ ## va, \
-+ VA_RT_FORMAT_ ## rt, \
-+ AV_PIX_FMT_ ## av, \
-+ swap_uv, \
-+ }
-+// The map fourcc <-> pix_fmt isn't bijective because of the annoying U/V
-+// plane swap cases. The frame handling below tries to hide these.
-+static const VAAPIFormatDescriptor vaapi_format_map[] = {
-+ MAP(NV12, YUV420, NV12, 0),
-+#ifdef VA_FOURCC_I420
-+ MAP(I420, YUV420, YUV420P, 0),
-+#endif
-+ MAP(YV12, YUV420, YUV420P, 1),
-+ MAP(IYUV, YUV420, YUV420P, 0),
-+ MAP(422H, YUV422, YUV422P, 0),
-+#ifdef VA_FOURCC_YV16
-+ MAP(YV16, YUV422, YUV422P, 1),
-+#endif
-+ MAP(UYVY, YUV422, UYVY422, 0),
-+ MAP(YUY2, YUV422, YUYV422, 0),
-+ MAP(411P, YUV411, YUV411P, 0),
-+ MAP(422V, YUV422, YUV440P, 0),
-+ MAP(444P, YUV444, YUV444P, 0),
-+ MAP(Y800, YUV400, GRAY8, 0),
-+#ifdef VA_FOURCC_P010
-+ MAP(P010, YUV420_10BPP, P010, 0),
-+#endif
-+ MAP(BGRA, RGB32, BGRA, 0),
-+ MAP(BGRX, RGB32, BGR0, 0),
-+ MAP(RGBA, RGB32, RGBA, 0),
-+ MAP(RGBX, RGB32, RGB0, 0),
-+#ifdef VA_FOURCC_ABGR
-+ MAP(ABGR, RGB32, ABGR, 0),
-+ MAP(XBGR, RGB32, 0BGR, 0),
-+#endif
-+ MAP(ARGB, RGB32, ARGB, 0),
-+ MAP(XRGB, RGB32, 0RGB, 0),
-+};
-+#undef MAP
-+
-+static const VAAPIFormatDescriptor *
-+ vaapi_format_from_fourcc(unsigned int fourcc)
-+{
-+ int i;
-+ for (i = 0; i < FF_ARRAY_ELEMS(vaapi_format_map); i++)
-+ if (vaapi_format_map[i].fourcc == fourcc)
-+ return &vaapi_format_map[i];
-+ return NULL;
-+}
-+
-+static const VAAPIFormatDescriptor *
-+ vaapi_format_from_pix_fmt(enum AVPixelFormat pix_fmt)
-+{
-+ int i;
-+ for (i = 0; i < FF_ARRAY_ELEMS(vaapi_format_map); i++)
-+ if (vaapi_format_map[i].pix_fmt == pix_fmt)
-+ return &vaapi_format_map[i];
-+ return NULL;
-+}
-+
-+static enum AVPixelFormat vaapi_pix_fmt_from_fourcc(unsigned int fourcc)
-+{
-+ const VAAPIFormatDescriptor *desc;
-+ desc = vaapi_format_from_fourcc(fourcc);
-+ if (desc)
-+ return desc->pix_fmt;
-+ else
-+ return AV_PIX_FMT_NONE;
-+}
-+
-+static int vaapi_get_image_format(AVHWDeviceContext *hwdev,
-+ enum AVPixelFormat pix_fmt,
-+ VAImageFormat **image_format)
-+{
-+ VAAPIDeviceContext *ctx = hwdev->internal->priv;
-+ int i;
-+
-+ for (i = 0; i < ctx->nb_formats; i++) {
-+ if (ctx->formats[i].pix_fmt == pix_fmt) {
-+ if (image_format)
-+ *image_format = &ctx->formats[i].image_format;
-+ return 0;
-+ }
-+ }
-+ return AVERROR(EINVAL);
-+}
-+
-+static int vaapi_frames_get_constraints(AVHWDeviceContext *hwdev,
-+ const void *hwconfig,
-+ AVHWFramesConstraints *constraints)
-+{
-+ AVVAAPIDeviceContext *hwctx = hwdev->hwctx;
-+ const AVVAAPIHWConfig *config = hwconfig;
-+ VAAPIDeviceContext *ctx = hwdev->internal->priv;
-+ VASurfaceAttrib *attr_list = NULL;
-+ VAStatus vas;
-+ enum AVPixelFormat pix_fmt;
-+ unsigned int fourcc;
-+ int err, i, j, attr_count, pix_fmt_count;
-+
-+ if (config &&
-+ !(hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES)) {
-+ attr_count = 0;
-+ vas = vaQuerySurfaceAttributes(hwctx->display, config->config_id,
-+ 0, &attr_count);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwdev, AV_LOG_ERROR, "Failed to query surface attributes: "
-+ "%d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(ENOSYS);
-+ goto fail;
-+ }
-+
-+ attr_list = av_malloc(attr_count * sizeof(*attr_list));
-+ if (!attr_list) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+
-+ vas = vaQuerySurfaceAttributes(hwctx->display, config->config_id,
-+ attr_list, &attr_count);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwdev, AV_LOG_ERROR, "Failed to query surface attributes: "
-+ "%d (%s).\n", vas, vaErrorStr(vas));
-+ err = AVERROR(ENOSYS);
-+ goto fail;
-+ }
-+
-+ pix_fmt_count = 0;
-+ for (i = 0; i < attr_count; i++) {
-+ switch (attr_list[i].type) {
-+ case VASurfaceAttribPixelFormat:
-+ fourcc = attr_list[i].value.value.i;
-+ pix_fmt = vaapi_pix_fmt_from_fourcc(fourcc);
-+ if (pix_fmt != AV_PIX_FMT_NONE) {
-+ ++pix_fmt_count;
-+ } else {
-+ // Something unsupported - ignore.
-+ }
-+ break;
-+ case VASurfaceAttribMinWidth:
-+ constraints->min_width = attr_list[i].value.value.i;
-+ break;
-+ case VASurfaceAttribMinHeight:
-+ constraints->min_height = attr_list[i].value.value.i;
-+ break;
-+ case VASurfaceAttribMaxWidth:
-+ constraints->max_width = attr_list[i].value.value.i;
-+ break;
-+ case VASurfaceAttribMaxHeight:
-+ constraints->max_height = attr_list[i].value.value.i;
-+ break;
-+ }
-+ }
-+ if (pix_fmt_count == 0) {
-+ // Nothing usable found. Presumably there exists something which
-+ // works, so leave the set null to indicate unknown.
-+ constraints->valid_sw_formats = NULL;
-+ } else {
-+ constraints->valid_sw_formats = av_malloc_array(pix_fmt_count + 1,
-+ sizeof(pix_fmt));
-+ if (!constraints->valid_sw_formats) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+
-+ for (i = j = 0; i < attr_count; i++) {
-+ if (attr_list[i].type != VASurfaceAttribPixelFormat)
-+ continue;
-+ fourcc = attr_list[i].value.value.i;
-+ pix_fmt = vaapi_pix_fmt_from_fourcc(fourcc);
-+ if (pix_fmt != AV_PIX_FMT_NONE)
-+ constraints->valid_sw_formats[j++] = pix_fmt;
-+ }
-+ av_assert0(j == pix_fmt_count);
-+ constraints->valid_sw_formats[j] = AV_PIX_FMT_NONE;
-+ }
-+ } else {
-+ // No configuration supplied.
-+ // Return the full set of image formats known by the implementation.
-+ constraints->valid_sw_formats = av_malloc_array(ctx->nb_formats + 1,
-+ sizeof(pix_fmt));
-+ if (!constraints->valid_sw_formats) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ for (i = 0; i < ctx->nb_formats; i++)
-+ constraints->valid_sw_formats[i] = ctx->formats[i].pix_fmt;
-+ constraints->valid_sw_formats[i] = AV_PIX_FMT_NONE;
-+ }
-+
-+ constraints->valid_hw_formats = av_malloc_array(2, sizeof(pix_fmt));
-+ if (!constraints->valid_hw_formats) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ constraints->valid_hw_formats[0] = AV_PIX_FMT_VAAPI;
-+ constraints->valid_hw_formats[1] = AV_PIX_FMT_NONE;
-+
-+ err = 0;
-+fail:
-+ av_freep(&attr_list);
-+ return err;
-+}
-+
-+static const struct {
-+ const char *friendly_name;
-+ const char *match_string;
-+ unsigned int quirks;
-+} vaapi_driver_quirks_table[] = {
-+#if !VA_CHECK_VERSION(1, 0, 0)
-+ // The i965 driver did not conform before version 2.0.
-+ {
-+ "Intel i965 (Quick Sync)",
-+ "i965",
-+ AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS,
-+ },
-+#endif
-+ {
-+ "Intel iHD",
-+ "ubit",
-+ AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE,
-+ },
-+ {
-+ "VDPAU wrapper",
-+ "Splitted-Desktop Systems VDPAU backend for VA-API",
-+ AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES,
-+ },
-+};
-+
-+static int vaapi_device_init(AVHWDeviceContext *hwdev)
-+{
-+ VAAPIDeviceContext *ctx = hwdev->internal->priv;
-+ AVVAAPIDeviceContext *hwctx = hwdev->hwctx;
-+ VAImageFormat *image_list = NULL;
-+ VAStatus vas;
-+ const char *vendor_string;
-+ int err, i, image_count;
-+ enum AVPixelFormat pix_fmt;
-+ unsigned int fourcc;
-+
-+ image_count = vaMaxNumImageFormats(hwctx->display);
-+ if (image_count <= 0) {
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+ image_list = av_malloc(image_count * sizeof(*image_list));
-+ if (!image_list) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ vas = vaQueryImageFormats(hwctx->display, image_list, &image_count);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+
-+ ctx->formats = av_malloc(image_count * sizeof(*ctx->formats));
-+ if (!ctx->formats) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ ctx->nb_formats = 0;
-+ for (i = 0; i < image_count; i++) {
-+ fourcc = image_list[i].fourcc;
-+ pix_fmt = vaapi_pix_fmt_from_fourcc(fourcc);
-+ if (pix_fmt == AV_PIX_FMT_NONE) {
-+ av_log(hwdev, AV_LOG_DEBUG, "Format %#x -> unknown.\n",
-+ fourcc);
-+ } else {
-+ av_log(hwdev, AV_LOG_DEBUG, "Format %#x -> %s.\n",
-+ fourcc, av_get_pix_fmt_name(pix_fmt));
-+ ctx->formats[ctx->nb_formats].pix_fmt = pix_fmt;
-+ ctx->formats[ctx->nb_formats].image_format = image_list[i];
-+ ++ctx->nb_formats;
-+ }
-+ }
-+
-+ vendor_string = vaQueryVendorString(hwctx->display);
-+ if (vendor_string)
-+ av_log(hwdev, AV_LOG_VERBOSE, "VAAPI driver: %s.\n", vendor_string);
-+
-+ if (hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_USER_SET) {
-+ av_log(hwdev, AV_LOG_VERBOSE, "Using quirks set by user (%#x).\n",
-+ hwctx->driver_quirks);
-+ } else {
-+ // Detect the driver in use and set quirk flags if necessary.
-+ hwctx->driver_quirks = 0;
-+ if (vendor_string) {
-+ for (i = 0; i < FF_ARRAY_ELEMS(vaapi_driver_quirks_table); i++) {
-+ if (strstr(vendor_string,
-+ vaapi_driver_quirks_table[i].match_string)) {
-+ av_log(hwdev, AV_LOG_VERBOSE, "Matched driver string "
-+ "as known nonstandard driver \"%s\", setting "
-+ "quirks (%#x).\n",
-+ vaapi_driver_quirks_table[i].friendly_name,
-+ vaapi_driver_quirks_table[i].quirks);
-+ hwctx->driver_quirks |=
-+ vaapi_driver_quirks_table[i].quirks;
-+ break;
-+ }
-+ }
-+ if (!(i < FF_ARRAY_ELEMS(vaapi_driver_quirks_table))) {
-+ av_log(hwdev, AV_LOG_VERBOSE, "Driver not found in known "
-+ "nonstandard list, using standard behaviour.\n");
-+ }
-+ } else {
-+ av_log(hwdev, AV_LOG_VERBOSE, "Driver has no vendor string, "
-+ "assuming standard behaviour.\n");
-+ }
-+ }
-+
-+ av_free(image_list);
-+ return 0;
-+fail:
-+ av_freep(&ctx->formats);
-+ av_free(image_list);
-+ return err;
-+}
-+
-+static void vaapi_device_uninit(AVHWDeviceContext *hwdev)
-+{
-+ VAAPIDeviceContext *ctx = hwdev->internal->priv;
-+
-+ av_freep(&ctx->formats);
-+}
-+
-+static void vaapi_buffer_free(void *opaque, uint8_t *data)
-+{
-+ AVHWFramesContext *hwfc = opaque;
-+ AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
-+ VASurfaceID surface_id;
-+ VAStatus vas;
-+
-+ surface_id = (VASurfaceID)(uintptr_t)data;
-+
-+ vas = vaDestroySurfaces(hwctx->display, &surface_id, 1);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to destroy surface %#x: "
-+ "%d (%s).\n", surface_id, vas, vaErrorStr(vas));
-+ }
-+}
-+
-+static AVBufferRef *vaapi_pool_alloc(void *opaque, int size)
-+{
-+ AVHWFramesContext *hwfc = opaque;
-+ VAAPIFramesContext *ctx = hwfc->internal->priv;
-+ AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
-+ AVVAAPIFramesContext *avfc = hwfc->hwctx;
-+ VASurfaceID surface_id;
-+ VAStatus vas;
-+ AVBufferRef *ref;
-+
-+ if (hwfc->initial_pool_size > 0 &&
-+ avfc->nb_surfaces >= hwfc->initial_pool_size)
-+ return NULL;
-+
-+ vas = vaCreateSurfaces(hwctx->display, ctx->rt_format,
-+ hwfc->width, hwfc->height,
-+ &surface_id, 1,
-+ ctx->attributes, ctx->nb_attributes);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to create surface: "
-+ "%d (%s).\n", vas, vaErrorStr(vas));
-+ return NULL;
-+ }
-+ av_log(hwfc, AV_LOG_DEBUG, "Created surface %#x.\n", surface_id);
-+
-+ ref = av_buffer_create((uint8_t*)(uintptr_t)surface_id,
-+ sizeof(surface_id), &vaapi_buffer_free,
-+ hwfc, AV_BUFFER_FLAG_READONLY);
-+ if (!ref) {
-+ vaDestroySurfaces(hwctx->display, &surface_id, 1);
-+ return NULL;
-+ }
-+
-+ if (hwfc->initial_pool_size > 0) {
-+ // This is a fixed-size pool, so we must still be in the initial
-+ // allocation sequence.
-+ av_assert0(avfc->nb_surfaces < hwfc->initial_pool_size);
-+ avfc->surface_ids[avfc->nb_surfaces] = surface_id;
-+ ++avfc->nb_surfaces;
-+ }
-+
-+ return ref;
-+}
-+
-+static int vaapi_frames_init(AVHWFramesContext *hwfc)
-+{
-+ AVVAAPIFramesContext *avfc = hwfc->hwctx;
-+ VAAPIFramesContext *ctx = hwfc->internal->priv;
-+ AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
-+ const VAAPIFormatDescriptor *desc;
-+ VAImageFormat *expected_format;
-+ AVBufferRef *test_surface = NULL;
-+ VASurfaceID test_surface_id;
-+ VAImage test_image;
-+ VAStatus vas;
-+ int err, i;
-+
-+ desc = vaapi_format_from_pix_fmt(hwfc->sw_format);
-+ if (!desc) {
-+ av_log(hwfc, AV_LOG_ERROR, "Unsupported format: %s.\n",
-+ av_get_pix_fmt_name(hwfc->sw_format));
-+ return AVERROR(EINVAL);
-+ }
-+
-+ if (!hwfc->pool) {
-+ if (!(hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES)) {
-+ int need_memory_type = !(hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE);
-+ int need_pixel_format = 1;
-+ for (i = 0; i < avfc->nb_attributes; i++) {
-+ if (avfc->attributes[i].type == VASurfaceAttribMemoryType)
-+ need_memory_type = 0;
-+ if (avfc->attributes[i].type == VASurfaceAttribPixelFormat)
-+ need_pixel_format = 0;
-+ }
-+ ctx->nb_attributes =
-+ avfc->nb_attributes + need_memory_type + need_pixel_format;
-+
-+ ctx->attributes = av_malloc(ctx->nb_attributes *
-+ sizeof(*ctx->attributes));
-+ if (!ctx->attributes) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+
-+ for (i = 0; i < avfc->nb_attributes; i++)
-+ ctx->attributes[i] = avfc->attributes[i];
-+ if (need_memory_type) {
-+ ctx->attributes[i++] = (VASurfaceAttrib) {
-+ .type = VASurfaceAttribMemoryType,
-+ .flags = VA_SURFACE_ATTRIB_SETTABLE,
-+ .value.type = VAGenericValueTypeInteger,
-+ .value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_VA,
-+ };
-+ }
-+ if (need_pixel_format) {
-+ ctx->attributes[i++] = (VASurfaceAttrib) {
-+ .type = VASurfaceAttribPixelFormat,
-+ .flags = VA_SURFACE_ATTRIB_SETTABLE,
-+ .value.type = VAGenericValueTypeInteger,
-+ .value.value.i = desc->fourcc,
-+ };
-+ }
-+ av_assert0(i == ctx->nb_attributes);
-+ } else {
-+ ctx->attributes = NULL;
-+ ctx->nb_attributes = 0;
-+ }
-+
-+ ctx->rt_format = desc->rt_format;
-+
-+ if (hwfc->initial_pool_size > 0) {
-+ // This pool will be usable as a render target, so we need to store
-+ // all of the surface IDs somewhere that vaCreateContext() calls
-+ // will be able to access them.
-+ avfc->nb_surfaces = 0;
-+ avfc->surface_ids = av_malloc(hwfc->initial_pool_size *
-+ sizeof(*avfc->surface_ids));
-+ if (!avfc->surface_ids) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ } else {
-+ // This pool allows dynamic sizing, and will not be usable as a
-+ // render target.
-+ avfc->nb_surfaces = 0;
-+ avfc->surface_ids = NULL;
-+ }
-+
-+ hwfc->internal->pool_internal =
-+ av_buffer_pool_init2(sizeof(VASurfaceID), hwfc,
-+ &vaapi_pool_alloc, NULL);
-+ if (!hwfc->internal->pool_internal) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to create VAAPI surface pool.\n");
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ }
-+
-+ // Allocate a single surface to test whether vaDeriveImage() is going
-+ // to work for the specific configuration.
-+ if (hwfc->pool) {
-+ test_surface = av_buffer_pool_get(hwfc->pool);
-+ if (!test_surface) {
-+ av_log(hwfc, AV_LOG_ERROR, "Unable to allocate a surface from "
-+ "user-configured buffer pool.\n");
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ } else {
-+ test_surface = av_buffer_pool_get(hwfc->internal->pool_internal);
-+ if (!test_surface) {
-+ av_log(hwfc, AV_LOG_ERROR, "Unable to allocate a surface from "
-+ "internal buffer pool.\n");
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ }
-+ test_surface_id = (VASurfaceID)(uintptr_t)test_surface->data;
-+
-+ ctx->derive_works = 0;
-+
-+ err = vaapi_get_image_format(hwfc->device_ctx,
-+ hwfc->sw_format, &expected_format);
-+ if (err == 0) {
-+ vas = vaDeriveImage(hwctx->display, test_surface_id, &test_image);
-+ if (vas == VA_STATUS_SUCCESS) {
-+ if (expected_format->fourcc == test_image.format.fourcc) {
-+ av_log(hwfc, AV_LOG_DEBUG, "Direct mapping possible.\n");
-+ ctx->derive_works = 1;
-+ } else {
-+ av_log(hwfc, AV_LOG_DEBUG, "Direct mapping disabled: "
-+ "derived image format %08x does not match "
-+ "expected format %08x.\n",
-+ expected_format->fourcc, test_image.format.fourcc);
-+ }
-+ vaDestroyImage(hwctx->display, test_image.image_id);
-+ } else {
-+ av_log(hwfc, AV_LOG_DEBUG, "Direct mapping disabled: "
-+ "deriving image does not work: "
-+ "%d (%s).\n", vas, vaErrorStr(vas));
-+ }
-+ } else {
-+ av_log(hwfc, AV_LOG_DEBUG, "Direct mapping disabled: "
-+ "image format is not supported.\n");
-+ }
-+
-+ av_buffer_unref(&test_surface);
-+ return 0;
-+
-+fail:
-+ av_buffer_unref(&test_surface);
-+ av_freep(&avfc->surface_ids);
-+ av_freep(&ctx->attributes);
-+ return err;
-+}
-+
-+static void vaapi_frames_uninit(AVHWFramesContext *hwfc)
-+{
-+ AVVAAPIFramesContext *avfc = hwfc->hwctx;
-+ VAAPIFramesContext *ctx = hwfc->internal->priv;
-+
-+ av_freep(&avfc->surface_ids);
-+ av_freep(&ctx->attributes);
-+}
-+
-+static int vaapi_get_buffer(AVHWFramesContext *hwfc, AVFrame *frame)
-+{
-+ frame->buf[0] = av_buffer_pool_get(hwfc->pool);
-+ if (!frame->buf[0])
-+ return AVERROR(ENOMEM);
-+
-+ frame->data[3] = frame->buf[0]->data;
-+ frame->format = AV_PIX_FMT_VAAPI;
-+ frame->width = hwfc->width;
-+ frame->height = hwfc->height;
-+
-+ return 0;
-+}
-+
-+static int vaapi_transfer_get_formats(AVHWFramesContext *hwfc,
-+ enum AVHWFrameTransferDirection dir,
-+ enum AVPixelFormat **formats)
-+{
-+ VAAPIDeviceContext *ctx = hwfc->device_ctx->internal->priv;
-+ enum AVPixelFormat *pix_fmts;
-+ int i, k, sw_format_available;
-+
-+ sw_format_available = 0;
-+ for (i = 0; i < ctx->nb_formats; i++) {
-+ if (ctx->formats[i].pix_fmt == hwfc->sw_format)
-+ sw_format_available = 1;
-+ }
-+
-+ pix_fmts = av_malloc((ctx->nb_formats + 1) * sizeof(*pix_fmts));
-+ if (!pix_fmts)
-+ return AVERROR(ENOMEM);
-+
-+ if (sw_format_available) {
-+ pix_fmts[0] = hwfc->sw_format;
-+ k = 1;
-+ } else {
-+ k = 0;
-+ }
-+ for (i = 0; i < ctx->nb_formats; i++) {
-+ if (ctx->formats[i].pix_fmt == hwfc->sw_format)
-+ continue;
-+ av_assert0(k < ctx->nb_formats);
-+ pix_fmts[k++] = ctx->formats[i].pix_fmt;
-+ }
-+ pix_fmts[k] = AV_PIX_FMT_NONE;
-+
-+ *formats = pix_fmts;
-+ return 0;
-+}
-+
-+static void vaapi_unmap_frame(AVHWFramesContext *hwfc,
-+ HWMapDescriptor *hwmap)
-+{
-+ AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
-+ VAAPIMapping *map = hwmap->priv;
-+ VASurfaceID surface_id;
-+ VAStatus vas;
-+
-+ surface_id = (VASurfaceID)(uintptr_t)hwmap->source->data[3];
-+ av_log(hwfc, AV_LOG_DEBUG, "Unmap surface %#x.\n", surface_id);
-+
-+ vas = vaUnmapBuffer(hwctx->display, map->image.buf);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to unmap image from surface "
-+ "%#x: %d (%s).\n", surface_id, vas, vaErrorStr(vas));
-+ }
-+
-+ if ((map->flags & AV_HWFRAME_MAP_WRITE) &&
-+ !(map->flags & AV_HWFRAME_MAP_DIRECT)) {
-+ vas = vaPutImage(hwctx->display, surface_id, map->image.image_id,
-+ 0, 0, hwfc->width, hwfc->height,
-+ 0, 0, hwfc->width, hwfc->height);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to write image to surface "
-+ "%#x: %d (%s).\n", surface_id, vas, vaErrorStr(vas));
-+ }
-+ }
-+
-+ vas = vaDestroyImage(hwctx->display, map->image.image_id);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to destroy image from surface "
-+ "%#x: %d (%s).\n", surface_id, vas, vaErrorStr(vas));
-+ }
-+
-+ av_free(map);
-+}
-+
-+static int vaapi_map_frame(AVHWFramesContext *hwfc,
-+ AVFrame *dst, const AVFrame *src, int flags)
-+{
-+ AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
-+ VAAPIFramesContext *ctx = hwfc->internal->priv;
-+ VASurfaceID surface_id;
-+ const VAAPIFormatDescriptor *desc;
-+ VAImageFormat *image_format;
-+ VAAPIMapping *map;
-+ VAStatus vas;
-+ void *address = NULL;
-+ int err, i;
-+
-+ surface_id = (VASurfaceID)(uintptr_t)src->data[3];
-+ av_log(hwfc, AV_LOG_DEBUG, "Map surface %#x.\n", surface_id);
-+
-+ if (!ctx->derive_works && (flags & AV_HWFRAME_MAP_DIRECT)) {
-+ // Requested direct mapping but it is not possible.
-+ return AVERROR(EINVAL);
-+ }
-+ if (dst->format == AV_PIX_FMT_NONE)
-+ dst->format = hwfc->sw_format;
-+ if (dst->format != hwfc->sw_format && (flags & AV_HWFRAME_MAP_DIRECT)) {
-+ // Requested direct mapping but the formats do not match.
-+ return AVERROR(EINVAL);
-+ }
-+
-+ err = vaapi_get_image_format(hwfc->device_ctx, dst->format, &image_format);
-+ if (err < 0) {
-+ // Requested format is not a valid output format.
-+ return AVERROR(EINVAL);
-+ }
-+
-+ map = av_malloc(sizeof(*map));
-+ if (!map)
-+ return AVERROR(ENOMEM);
-+ map->flags = flags;
-+ map->image.image_id = VA_INVALID_ID;
-+
-+ vas = vaSyncSurface(hwctx->display, surface_id);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to sync surface "
-+ "%#x: %d (%s).\n", surface_id, vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+
-+ // The memory which we map using derive need not be connected to the CPU
-+ // in a way conducive to fast access. On Gen7-Gen9 Intel graphics, the
-+ // memory is mappable but not cached, so normal memcpy()-like access is
-+ // very slow to read it (but writing is ok). It is possible to read much
-+ // faster with a copy routine which is aware of the limitation, but we
-+ // assume for now that the user is not aware of that and would therefore
-+ // prefer not to be given direct-mapped memory if they request read access.
-+ if (ctx->derive_works && dst->format == hwfc->sw_format &&
-+ ((flags & AV_HWFRAME_MAP_DIRECT) || !(flags & AV_HWFRAME_MAP_READ))) {
-+ vas = vaDeriveImage(hwctx->display, surface_id, &map->image);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to derive image from "
-+ "surface %#x: %d (%s).\n",
-+ surface_id, vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+ if (map->image.format.fourcc != image_format->fourcc) {
-+ av_log(hwfc, AV_LOG_ERROR, "Derive image of surface %#x "
-+ "is in wrong format: expected %#08x, got %#08x.\n",
-+ surface_id, image_format->fourcc, map->image.format.fourcc);
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+ map->flags |= AV_HWFRAME_MAP_DIRECT;
-+ } else {
-+ vas = vaCreateImage(hwctx->display, image_format,
-+ hwfc->width, hwfc->height, &map->image);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to create image for "
-+ "surface %#x: %d (%s).\n",
-+ surface_id, vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+ if (!(flags & AV_HWFRAME_MAP_OVERWRITE)) {
-+ vas = vaGetImage(hwctx->display, surface_id, 0, 0,
-+ hwfc->width, hwfc->height, map->image.image_id);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to read image from "
-+ "surface %#x: %d (%s).\n",
-+ surface_id, vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+ }
-+ }
-+
-+ vas = vaMapBuffer(hwctx->display, map->image.buf, &address);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to map image from surface "
-+ "%#x: %d (%s).\n", surface_id, vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+
-+ err = ff_hwframe_map_create(src->hw_frames_ctx,
-+ dst, src, &vaapi_unmap_frame, map);
-+ if (err < 0)
-+ goto fail;
-+
-+ dst->width = src->width;
-+ dst->height = src->height;
-+
-+ for (i = 0; i < map->image.num_planes; i++) {
-+ dst->data[i] = (uint8_t*)address + map->image.offsets[i];
-+ dst->linesize[i] = map->image.pitches[i];
-+ }
-+
-+ desc = vaapi_format_from_fourcc(map->image.format.fourcc);
-+ if (desc && desc->chroma_planes_swapped) {
-+ // Chroma planes are YVU rather than YUV, so swap them.
-+ FFSWAP(uint8_t*, dst->data[1], dst->data[2]);
-+ }
-+
-+ return 0;
-+
-+fail:
-+ if (map) {
-+ if (address)
-+ vaUnmapBuffer(hwctx->display, map->image.buf);
-+ if (map->image.image_id != VA_INVALID_ID)
-+ vaDestroyImage(hwctx->display, map->image.image_id);
-+ av_free(map);
-+ }
-+ return err;
-+}
-+
-+static int vaapi_transfer_data_from(AVHWFramesContext *hwfc,
-+ AVFrame *dst, const AVFrame *src)
-+{
-+ AVFrame *map;
-+ int err;
-+
-+ if (dst->width > hwfc->width || dst->height > hwfc->height)
-+ return AVERROR(EINVAL);
-+
-+ map = av_frame_alloc();
-+ if (!map)
-+ return AVERROR(ENOMEM);
-+ map->format = dst->format;
-+
-+ err = vaapi_map_frame(hwfc, map, src, AV_HWFRAME_MAP_READ);
-+ if (err)
-+ goto fail;
-+
-+ map->width = dst->width;
-+ map->height = dst->height;
-+
-+ err = av_frame_copy(dst, map);
-+ if (err)
-+ goto fail;
-+
-+ err = 0;
-+fail:
-+ av_frame_free(&map);
-+ return err;
-+}
-+
-+static int vaapi_transfer_data_to(AVHWFramesContext *hwfc,
-+ AVFrame *dst, const AVFrame *src)
-+{
-+ AVFrame *map;
-+ int err;
-+
-+ if (src->width > hwfc->width || src->height > hwfc->height)
-+ return AVERROR(EINVAL);
-+
-+ map = av_frame_alloc();
-+ if (!map)
-+ return AVERROR(ENOMEM);
-+ map->format = src->format;
-+
-+ err = vaapi_map_frame(hwfc, map, dst, AV_HWFRAME_MAP_WRITE | AV_HWFRAME_MAP_OVERWRITE);
-+ if (err)
-+ goto fail;
-+
-+ map->width = src->width;
-+ map->height = src->height;
-+
-+ err = av_frame_copy(map, src);
-+ if (err)
-+ goto fail;
-+
-+ err = 0;
-+fail:
-+ av_frame_free(&map);
-+ return err;
-+}
-+
-+static int vaapi_map_to_memory(AVHWFramesContext *hwfc, AVFrame *dst,
-+ const AVFrame *src, int flags)
-+{
-+ int err;
-+
-+ if (dst->format != AV_PIX_FMT_NONE) {
-+ err = vaapi_get_image_format(hwfc->device_ctx, dst->format, NULL);
-+ if (err < 0)
-+ return AVERROR(ENOSYS);
-+ }
-+
-+ err = vaapi_map_frame(hwfc, dst, src, flags);
-+ if (err)
-+ return err;
-+
-+ err = av_frame_copy_props(dst, src);
-+ if (err)
-+ return err;
-+
-+ return 0;
-+}
-+
-+#if CONFIG_LIBDRM
-+
-+#define DRM_MAP(va, layers, ...) { \
-+ VA_FOURCC_ ## va, \
-+ layers, \
-+ { __VA_ARGS__ } \
-+ }
-+static const struct {
-+ uint32_t va_fourcc;
-+ int nb_layer_formats;
-+ uint32_t layer_formats[AV_DRM_MAX_PLANES];
-+} vaapi_drm_format_map[] = {
-+#ifdef DRM_FORMAT_R8
-+ DRM_MAP(NV12, 2, DRM_FORMAT_R8, DRM_FORMAT_RG88),
-+#endif
-+ DRM_MAP(NV12, 1, DRM_FORMAT_NV12),
-+#if defined(VA_FOURCC_P010) && defined(DRM_FORMAT_R16)
-+ DRM_MAP(P010, 2, DRM_FORMAT_R16, DRM_FORMAT_RG1616),
-+#endif
-+ DRM_MAP(BGRA, 1, DRM_FORMAT_ARGB8888),
-+ DRM_MAP(BGRX, 1, DRM_FORMAT_XRGB8888),
-+ DRM_MAP(RGBA, 1, DRM_FORMAT_ABGR8888),
-+ DRM_MAP(RGBX, 1, DRM_FORMAT_XBGR8888),
-+#ifdef VA_FOURCC_ABGR
-+ DRM_MAP(ABGR, 1, DRM_FORMAT_RGBA8888),
-+ DRM_MAP(XBGR, 1, DRM_FORMAT_RGBX8888),
-+#endif
-+ DRM_MAP(ARGB, 1, DRM_FORMAT_BGRA8888),
-+ DRM_MAP(XRGB, 1, DRM_FORMAT_BGRX8888),
-+};
-+#undef DRM_MAP
-+
-+static void vaapi_unmap_from_drm(AVHWFramesContext *dst_fc,
-+ HWMapDescriptor *hwmap)
-+{
-+ AVVAAPIDeviceContext *dst_dev = dst_fc->device_ctx->hwctx;
-+
-+ VASurfaceID surface_id = (VASurfaceID)(uintptr_t)hwmap->priv;
-+
-+ av_log(dst_fc, AV_LOG_DEBUG, "Destroy surface %#x.\n", surface_id);
-+
-+ vaDestroySurfaces(dst_dev->display, &surface_id, 1);
-+}
-+
-+static int vaapi_map_from_drm(AVHWFramesContext *src_fc, AVFrame *dst,
-+ const AVFrame *src, int flags)
-+{
-+ AVHWFramesContext *dst_fc =
-+ (AVHWFramesContext*)dst->hw_frames_ctx->data;
-+ AVVAAPIDeviceContext *dst_dev = dst_fc->device_ctx->hwctx;
-+ const AVDRMFrameDescriptor *desc;
-+ const VAAPIFormatDescriptor *format_desc;
-+ VASurfaceID surface_id;
-+ VAStatus vas;
-+ uint32_t va_fourcc;
-+ int err, i, j, k;
-+
-+ unsigned long buffer_handle;
-+ VASurfaceAttribExternalBuffers buffer_desc;
-+ VASurfaceAttrib attrs[2] = {
-+ {
-+ .type = VASurfaceAttribMemoryType,
-+ .flags = VA_SURFACE_ATTRIB_SETTABLE,
-+ .value.type = VAGenericValueTypeInteger,
-+ .value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME,
-+ },
-+ {
-+ .type = VASurfaceAttribExternalBufferDescriptor,
-+ .flags = VA_SURFACE_ATTRIB_SETTABLE,
-+ .value.type = VAGenericValueTypePointer,
-+ .value.value.p = &buffer_desc,
-+ }
-+ };
-+
-+ desc = (AVDRMFrameDescriptor*)src->data[0];
-+
-+ if (desc->nb_objects != 1) {
-+ av_log(dst_fc, AV_LOG_ERROR, "VAAPI can only map frames "
-+ "made from a single DRM object.\n");
-+ return AVERROR(EINVAL);
-+ }
-+
-+ va_fourcc = 0;
-+ for (i = 0; i < FF_ARRAY_ELEMS(vaapi_drm_format_map); i++) {
-+ if (desc->nb_layers != vaapi_drm_format_map[i].nb_layer_formats)
-+ continue;
-+ for (j = 0; j < desc->nb_layers; j++) {
-+ if (desc->layers[j].format !=
-+ vaapi_drm_format_map[i].layer_formats[j])
-+ break;
-+ }
-+ if (j != desc->nb_layers)
-+ continue;
-+ va_fourcc = vaapi_drm_format_map[i].va_fourcc;
-+ break;
-+ }
-+ if (!va_fourcc) {
-+ av_log(dst_fc, AV_LOG_ERROR, "DRM format not supported "
-+ "by VAAPI.\n");
-+ return AVERROR(EINVAL);
-+ }
-+
-+ av_log(dst_fc, AV_LOG_DEBUG, "Map DRM object %d to VAAPI as "
-+ "%08x.\n", desc->objects[0].fd, va_fourcc);
-+
-+ format_desc = vaapi_format_from_fourcc(va_fourcc);
-+ av_assert0(format_desc);
-+
-+ buffer_handle = desc->objects[0].fd;
-+ buffer_desc.pixel_format = va_fourcc;
-+ buffer_desc.width = src_fc->width;
-+ buffer_desc.height = src_fc->height;
-+ buffer_desc.data_size = desc->objects[0].size;
-+ buffer_desc.buffers = &buffer_handle;
-+ buffer_desc.num_buffers = 1;
-+ buffer_desc.flags = 0;
-+
-+ k = 0;
-+ for (i = 0; i < desc->nb_layers; i++) {
-+ for (j = 0; j < desc->layers[i].nb_planes; j++) {
-+ buffer_desc.pitches[k] = desc->layers[i].planes[j].pitch;
-+ buffer_desc.offsets[k] = desc->layers[i].planes[j].offset;
-+ ++k;
-+ }
-+ }
-+ buffer_desc.num_planes = k;
-+
-+ if (format_desc->chroma_planes_swapped &&
-+ buffer_desc.num_planes == 3) {
-+ FFSWAP(uint32_t, buffer_desc.pitches[1], buffer_desc.pitches[2]);
-+ FFSWAP(uint32_t, buffer_desc.offsets[1], buffer_desc.offsets[2]);
-+ }
-+
-+ vas = vaCreateSurfaces(dst_dev->display, format_desc->rt_format,
-+ src->width, src->height,
-+ &surface_id, 1,
-+ attrs, FF_ARRAY_ELEMS(attrs));
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(dst_fc, AV_LOG_ERROR, "Failed to create surface from DRM "
-+ "object: %d (%s).\n", vas, vaErrorStr(vas));
-+ return AVERROR(EIO);
-+ }
-+ av_log(dst_fc, AV_LOG_DEBUG, "Create surface %#x.\n", surface_id);
-+
-+ err = ff_hwframe_map_create(dst->hw_frames_ctx, dst, src,
-+ &vaapi_unmap_from_drm,
-+ (void*)(uintptr_t)surface_id);
-+ if (err < 0)
-+ return err;
-+
-+ dst->width = src->width;
-+ dst->height = src->height;
-+ dst->data[3] = (uint8_t*)(uintptr_t)surface_id;
-+
-+ av_log(dst_fc, AV_LOG_DEBUG, "Mapped DRM object %d to "
-+ "surface %#x.\n", desc->objects[0].fd, surface_id);
-+
-+ return 0;
-+}
-+
-+#if VA_CHECK_VERSION(1, 1, 0)
-+static void vaapi_unmap_to_drm_esh(AVHWFramesContext *hwfc,
-+ HWMapDescriptor *hwmap)
-+{
-+ AVDRMFrameDescriptor *drm_desc = hwmap->priv;
-+ int i;
-+
-+ for (i = 0; i < drm_desc->nb_objects; i++)
-+ close(drm_desc->objects[i].fd);
-+
-+ av_freep(&drm_desc);
-+}
-+
-+static int vaapi_map_to_drm_esh(AVHWFramesContext *hwfc, AVFrame *dst,
-+ const AVFrame *src, int flags)
-+{
-+ AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
-+ VASurfaceID surface_id;
-+ VAStatus vas;
-+ VADRMPRIMESurfaceDescriptor va_desc;
-+ AVDRMFrameDescriptor *drm_desc = NULL;
-+ uint32_t export_flags;
-+ int err, i, j;
-+
-+ surface_id = (VASurfaceID)(uintptr_t)src->data[3];
-+
-+ export_flags = VA_EXPORT_SURFACE_SEPARATE_LAYERS;
-+ if (flags & AV_HWFRAME_MAP_READ)
-+ export_flags |= VA_EXPORT_SURFACE_READ_ONLY;
-+ if (flags & AV_HWFRAME_MAP_WRITE)
-+ export_flags |= VA_EXPORT_SURFACE_WRITE_ONLY;
-+
-+ vas = vaExportSurfaceHandle(hwctx->display, surface_id,
-+ VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
-+ export_flags, &va_desc);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ if (vas == VA_STATUS_ERROR_UNIMPLEMENTED)
-+ return AVERROR(ENOSYS);
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to export surface %#x: "
-+ "%d (%s).\n", surface_id, vas, vaErrorStr(vas));
-+ return AVERROR(EIO);
-+ }
-+
-+ drm_desc = av_mallocz(sizeof(*drm_desc));
-+ if (!drm_desc) {
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+
-+ // By some bizarre coincidence, these structures are very similar...
-+ drm_desc->nb_objects = va_desc.num_objects;
-+ for (i = 0; i < va_desc.num_objects; i++) {
-+ drm_desc->objects[i].fd = va_desc.objects[i].fd;
-+ drm_desc->objects[i].size = va_desc.objects[i].size;
-+ drm_desc->objects[i].format_modifier =
-+ va_desc.objects[i].drm_format_modifier;
-+ }
-+ drm_desc->nb_layers = va_desc.num_layers;
-+ for (i = 0; i < va_desc.num_layers; i++) {
-+ drm_desc->layers[i].format = va_desc.layers[i].drm_format;
-+ drm_desc->layers[i].nb_planes = va_desc.layers[i].num_planes;
-+ for (j = 0; j < va_desc.layers[i].num_planes; j++) {
-+ drm_desc->layers[i].planes[j].object_index =
-+ va_desc.layers[i].object_index[j];
-+ drm_desc->layers[i].planes[j].offset =
-+ va_desc.layers[i].offset[j];
-+ drm_desc->layers[i].planes[j].pitch =
-+ va_desc.layers[i].pitch[j];
-+ }
-+ }
-+
-+ err = ff_hwframe_map_create(src->hw_frames_ctx, dst, src,
-+ &vaapi_unmap_to_drm_esh, drm_desc);
-+ if (err < 0)
-+ goto fail;
-+
-+ dst->width = src->width;
-+ dst->height = src->height;
-+ dst->data[0] = (uint8_t*)drm_desc;
-+
-+ return 0;
-+
-+fail:
-+ for (i = 0; i < va_desc.num_objects; i++)
-+ close(va_desc.objects[i].fd);
-+ av_freep(&drm_desc);
-+ return err;
-+}
-+#endif
-+
-+#if VA_CHECK_VERSION(0, 36, 0)
-+typedef struct VAAPIDRMImageBufferMapping {
-+ VAImage image;
-+ VABufferInfo buffer_info;
-+
-+ AVDRMFrameDescriptor drm_desc;
-+} VAAPIDRMImageBufferMapping;
-+
-+static void vaapi_unmap_to_drm_abh(AVHWFramesContext *hwfc,
-+ HWMapDescriptor *hwmap)
-+{
-+ AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
-+ VAAPIDRMImageBufferMapping *mapping = hwmap->priv;
-+ VASurfaceID surface_id;
-+ VAStatus vas;
-+
-+ surface_id = (VASurfaceID)(uintptr_t)hwmap->source->data[3];
-+ av_log(hwfc, AV_LOG_DEBUG, "Unmap VAAPI surface %#x from DRM.\n",
-+ surface_id);
-+
-+ // DRM PRIME file descriptors are closed by vaReleaseBufferHandle(),
-+ // so we shouldn't close them separately.
-+
-+ vas = vaReleaseBufferHandle(hwctx->display, mapping->image.buf);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to release buffer "
-+ "handle of image %#x (derived from surface %#x): "
-+ "%d (%s).\n", mapping->image.buf, surface_id,
-+ vas, vaErrorStr(vas));
-+ }
-+
-+ vas = vaDestroyImage(hwctx->display, mapping->image.image_id);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to destroy image "
-+ "derived from surface %#x: %d (%s).\n",
-+ surface_id, vas, vaErrorStr(vas));
-+ }
-+
-+ av_free(mapping);
-+}
-+
-+static int vaapi_map_to_drm_abh(AVHWFramesContext *hwfc, AVFrame *dst,
-+ const AVFrame *src, int flags)
-+{
-+ AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
-+ VAAPIDRMImageBufferMapping *mapping = NULL;
-+ VASurfaceID surface_id;
-+ VAStatus vas;
-+ int err, i, p;
-+
-+ surface_id = (VASurfaceID)(uintptr_t)src->data[3];
-+ av_log(hwfc, AV_LOG_DEBUG, "Map VAAPI surface %#x to DRM.\n",
-+ surface_id);
-+
-+ mapping = av_mallocz(sizeof(*mapping));
-+ if (!mapping)
-+ return AVERROR(ENOMEM);
-+
-+ vas = vaDeriveImage(hwctx->display, surface_id,
-+ &mapping->image);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to derive image from "
-+ "surface %#x: %d (%s).\n",
-+ surface_id, vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail;
-+ }
-+
-+ for (i = 0; i < FF_ARRAY_ELEMS(vaapi_drm_format_map); i++) {
-+ if (vaapi_drm_format_map[i].va_fourcc ==
-+ mapping->image.format.fourcc)
-+ break;
-+ }
-+ if (i >= FF_ARRAY_ELEMS(vaapi_drm_format_map)) {
-+ av_log(hwfc, AV_LOG_ERROR, "No matching DRM format for "
-+ "VAAPI format %#x.\n", mapping->image.format.fourcc);
-+ err = AVERROR(EINVAL);
-+ goto fail_derived;
-+ }
-+
-+ mapping->buffer_info.mem_type =
-+ VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME;
-+
-+ mapping->drm_desc.nb_layers =
-+ vaapi_drm_format_map[i].nb_layer_formats;
-+ if (mapping->drm_desc.nb_layers > 1) {
-+ if (mapping->drm_desc.nb_layers != mapping->image.num_planes) {
-+ av_log(hwfc, AV_LOG_ERROR, "Image properties do not match "
-+ "expected format: got %d planes, but expected %d.\n",
-+ mapping->image.num_planes, mapping->drm_desc.nb_layers);
-+ err = AVERROR(EINVAL);
-+ goto fail_derived;
-+ }
-+
-+ for(p = 0; p < mapping->drm_desc.nb_layers; p++) {
-+ mapping->drm_desc.layers[p] = (AVDRMLayerDescriptor) {
-+ .format = vaapi_drm_format_map[i].layer_formats[p],
-+ .nb_planes = 1,
-+ .planes[0] = {
-+ .object_index = 0,
-+ .offset = mapping->image.offsets[p],
-+ .pitch = mapping->image.pitches[p],
-+ },
-+ };
-+ }
-+ } else {
-+ mapping->drm_desc.layers[0].format =
-+ vaapi_drm_format_map[i].layer_formats[0];
-+ mapping->drm_desc.layers[0].nb_planes = mapping->image.num_planes;
-+ for (p = 0; p < mapping->image.num_planes; p++) {
-+ mapping->drm_desc.layers[0].planes[p] = (AVDRMPlaneDescriptor) {
-+ .object_index = 0,
-+ .offset = mapping->image.offsets[p],
-+ .pitch = mapping->image.pitches[p],
-+ };
-+ }
-+ }
-+
-+ vas = vaAcquireBufferHandle(hwctx->display, mapping->image.buf,
-+ &mapping->buffer_info);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(hwfc, AV_LOG_ERROR, "Failed to get buffer "
-+ "handle from image %#x (derived from surface %#x): "
-+ "%d (%s).\n", mapping->image.buf, surface_id,
-+ vas, vaErrorStr(vas));
-+ err = AVERROR(EIO);
-+ goto fail_derived;
-+ }
-+
-+ av_log(hwfc, AV_LOG_DEBUG, "DRM PRIME fd is %ld.\n",
-+ mapping->buffer_info.handle);
-+
-+ mapping->drm_desc.nb_objects = 1;
-+ mapping->drm_desc.objects[0] = (AVDRMObjectDescriptor) {
-+ .fd = mapping->buffer_info.handle,
-+ .size = mapping->image.data_size,
-+ // There is no way to get the format modifier with this API.
-+ .format_modifier = DRM_FORMAT_MOD_INVALID,
-+ };
-+
-+ err = ff_hwframe_map_create(src->hw_frames_ctx,
-+ dst, src, &vaapi_unmap_to_drm_abh,
-+ mapping);
-+ if (err < 0)
-+ goto fail_mapped;
-+
-+ dst->data[0] = (uint8_t*)&mapping->drm_desc;
-+ dst->width = src->width;
-+ dst->height = src->height;
-+
-+ return 0;
-+
-+fail_mapped:
-+ vaReleaseBufferHandle(hwctx->display, mapping->image.buf);
-+fail_derived:
-+ vaDestroyImage(hwctx->display, mapping->image.image_id);
-+fail:
-+ av_freep(&mapping);
-+ return err;
-+}
-+#endif
-+
-+static int vaapi_map_to_drm(AVHWFramesContext *hwfc, AVFrame *dst,
-+ const AVFrame *src, int flags)
-+{
-+#if VA_CHECK_VERSION(1, 1, 0)
-+ int err;
-+ err = vaapi_map_to_drm_esh(hwfc, dst, src, flags);
-+ if (err != AVERROR(ENOSYS))
-+ return err;
-+#endif
-+#if VA_CHECK_VERSION(0, 36, 0)
-+ return vaapi_map_to_drm_abh(hwfc, dst, src, flags);
-+#endif
-+ return AVERROR(ENOSYS);
-+}
-+
-+#endif /* CONFIG_LIBDRM */
-+
-+static int vaapi_map_to(AVHWFramesContext *hwfc, AVFrame *dst,
-+ const AVFrame *src, int flags)
-+{
-+ switch (src->format) {
-+#if CONFIG_LIBDRM
-+ case AV_PIX_FMT_DRM_PRIME:
-+ return vaapi_map_from_drm(hwfc, dst, src, flags);
-+#endif
-+ default:
-+ return AVERROR(ENOSYS);
-+ }
-+}
-+
-+static int vaapi_map_from(AVHWFramesContext *hwfc, AVFrame *dst,
-+ const AVFrame *src, int flags)
-+{
-+ switch (dst->format) {
-+#if CONFIG_LIBDRM
-+ case AV_PIX_FMT_DRM_PRIME:
-+ return vaapi_map_to_drm(hwfc, dst, src, flags);
-+#endif
-+ default:
-+ return vaapi_map_to_memory(hwfc, dst, src, flags);
-+ }
-+}
-+
-+static void vaapi_device_free(AVHWDeviceContext *ctx)
-+{
-+ AVVAAPIDeviceContext *hwctx = ctx->hwctx;
-+ VAAPIDevicePriv *priv = ctx->user_opaque;
-+
-+ if (hwctx->display)
-+ vaTerminate(hwctx->display);
-+
-+#if HAVE_VAAPI_X11
-+ if (priv->x11_display)
-+ XCloseDisplay(priv->x11_display);
-+#endif
-+
-+ if (priv->drm_fd >= 0)
-+ close(priv->drm_fd);
-+
-+ av_freep(&priv);
-+}
-+
-+#if CONFIG_VAAPI_1
-+static void vaapi_device_log_error(void *context, const char *message)
-+{
-+ AVHWDeviceContext *ctx = context;
-+
-+ av_log(ctx, AV_LOG_ERROR, "libva: %s", message);
-+}
-+
-+static void vaapi_device_log_info(void *context, const char *message)
-+{
-+ AVHWDeviceContext *ctx = context;
-+
-+ av_log(ctx, AV_LOG_VERBOSE, "libva: %s", message);
-+}
-+#endif
-+
-+static int vaapi_device_connect(AVHWDeviceContext *ctx,
-+ VADisplay display)
-+{
-+ AVVAAPIDeviceContext *hwctx = ctx->hwctx;
-+ int major, minor;
-+ VAStatus vas;
-+
-+#if CONFIG_VAAPI_1
-+ vaSetErrorCallback(display, &vaapi_device_log_error, ctx);
-+ vaSetInfoCallback (display, &vaapi_device_log_info, ctx);
-+#endif
-+
-+ hwctx->display = display;
-+
-+ vas = vaInitialize(display, &major, &minor);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(ctx, AV_LOG_ERROR, "Failed to initialise VAAPI "
-+ "connection: %d (%s).\n", vas, vaErrorStr(vas));
-+ return AVERROR(EIO);
-+ }
-+ av_log(ctx, AV_LOG_VERBOSE, "Initialised VAAPI connection: "
-+ "version %d.%d\n", major, minor);
-+
-+ return 0;
-+}
-+
-+static int vaapi_device_create(AVHWDeviceContext *ctx, const char *device,
-+ AVDictionary *opts, int flags)
-+{
-+ VAAPIDevicePriv *priv;
-+ VADisplay display = NULL;
-+ const AVDictionaryEntry *ent;
-+ int try_drm, try_x11, try_all;
-+
-+ priv = av_mallocz(sizeof(*priv));
-+ if (!priv)
-+ return AVERROR(ENOMEM);
-+
-+ priv->drm_fd = -1;
-+
-+ ctx->user_opaque = priv;
-+ ctx->free = vaapi_device_free;
-+
-+ ent = av_dict_get(opts, "connection_type", NULL, 0);
-+ if (ent) {
-+ try_all = try_drm = try_x11 = 0;
-+ if (!strcmp(ent->value, "drm")) {
-+ try_drm = 1;
-+ } else if (!strcmp(ent->value, "x11")) {
-+ try_x11 = 1;
-+ } else {
-+ av_log(ctx, AV_LOG_ERROR, "Invalid connection type %s.\n",
-+ ent->value);
-+ return AVERROR(EINVAL);
-+ }
-+ } else {
-+ try_all = 1;
-+ try_drm = HAVE_VAAPI_DRM;
-+ try_x11 = HAVE_VAAPI_X11;
-+ }
-+
-+#if HAVE_VAAPI_DRM
-+ while (!display && try_drm) {
-+ // If the device is specified, try to open it as a DRM device node.
-+ // If not, look for a usable render node, possibly restricted to those
-+ // using a specified kernel driver.
-+ int loglevel = try_all ? AV_LOG_VERBOSE : AV_LOG_ERROR;
-+ if (device) {
-+ priv->drm_fd = open(device, O_RDWR);
-+ if (priv->drm_fd < 0) {
-+ av_log(ctx, loglevel, "Failed to open %s as "
-+ "DRM device node.\n", device);
-+ break;
-+ }
-+ } else {
-+ char path[64];
-+ int n, max_devices = 8;
-+#if CONFIG_LIBDRM
-+ const AVDictionaryEntry *kernel_driver;
-+ kernel_driver = av_dict_get(opts, "kernel_driver", NULL, 0);
-+#endif
-+ for (n = 0; n < max_devices; n++) {
-+ snprintf(path, sizeof(path),
-+ "/dev/dri/renderD%d", 128 + n);
-+ priv->drm_fd = open(path, O_RDWR);
-+ if (priv->drm_fd < 0) {
-+ av_log(ctx, AV_LOG_VERBOSE, "Cannot open "
-+ "DRM render node for device %d.\n", n);
-+ break;
-+ }
-+#if CONFIG_LIBDRM
-+ if (kernel_driver) {
-+ drmVersion *info;
-+ info = drmGetVersion(priv->drm_fd);
-+ if (strcmp(kernel_driver->value, info->name)) {
-+ av_log(ctx, AV_LOG_VERBOSE, "Ignoring device %d "
-+ "with non-matching kernel driver (%s).\n",
-+ n, info->name);
-+ drmFreeVersion(info);
-+ close(priv->drm_fd);
-+ priv->drm_fd = -1;
-+ continue;
-+ }
-+ av_log(ctx, AV_LOG_VERBOSE, "Trying to use "
-+ "DRM render node for device %d, "
-+ "with matching kernel driver (%s).\n",
-+ n, info->name);
-+ drmFreeVersion(info);
-+ } else
-+#endif
-+ {
-+ av_log(ctx, AV_LOG_VERBOSE, "Trying to use "
-+ "DRM render node for device %d.\n", n);
-+ }
-+ break;
-+ }
-+ if (n >= max_devices)
-+ break;
-+ }
-+
-+ display = vaGetDisplayDRM(priv->drm_fd);
-+ if (!display) {
-+ av_log(ctx, AV_LOG_VERBOSE, "Cannot open a VA display "
-+ "from DRM device %s.\n", device);
-+ return AVERROR_EXTERNAL;
-+ }
-+ break;
-+ }
-+#endif
-+
-+#if HAVE_VAAPI_X11
-+ if (!display && try_x11) {
-+ // Try to open the device as an X11 display.
-+ priv->x11_display = XOpenDisplay(device);
-+ if (!priv->x11_display) {
-+ av_log(ctx, AV_LOG_VERBOSE, "Cannot open X11 display "
-+ "%s.\n", XDisplayName(device));
-+ } else {
-+ display = vaGetDisplay(priv->x11_display);
-+ if (!display) {
-+ av_log(ctx, AV_LOG_ERROR, "Cannot open a VA display "
-+ "from X11 display %s.\n", XDisplayName(device));
-+ return AVERROR_UNKNOWN;
-+ }
-+
-+ av_log(ctx, AV_LOG_VERBOSE, "Opened VA display via "
-+ "X11 display %s.\n", XDisplayName(device));
-+ }
-+ }
-+#endif
-+
-+ if (!display) {
-+ if (device)
-+ av_log(ctx, AV_LOG_ERROR, "No VA display found for "
-+ "device %s.\n", device);
-+ else
-+ av_log(ctx, AV_LOG_ERROR, "No VA display found for "
-+ "any default device.\n");
-+ return AVERROR(EINVAL);
-+ }
-+
-+ ent = av_dict_get(opts, "driver", NULL, 0);
-+ if (ent) {
-+#if VA_CHECK_VERSION(0, 38, 0)
-+ VAStatus vas;
-+ vas = vaSetDriverName(display, ent->value);
-+ if (vas != VA_STATUS_SUCCESS) {
-+ av_log(ctx, AV_LOG_ERROR, "Failed to set driver name to "
-+ "%s: %d (%s).\n", ent->value, vas, vaErrorStr(vas));
-+ vaTerminate(display);
-+ return AVERROR_EXTERNAL;
-+ }
-+#else
-+ av_log(ctx, AV_LOG_WARNING, "Driver name setting is not "
-+ "supported with this VAAPI version.\n");
-+#endif
-+ }
-+
-+ return vaapi_device_connect(ctx, display);
-+}
-+
-+static int vaapi_device_derive(AVHWDeviceContext *ctx,
-+ AVHWDeviceContext *src_ctx, int flags)
-+{
-+#if HAVE_VAAPI_DRM
-+ if (src_ctx->type == AV_HWDEVICE_TYPE_DRM) {
-+ AVDRMDeviceContext *src_hwctx = src_ctx->hwctx;
-+ VADisplay *display;
-+ VAAPIDevicePriv *priv;
-+
-+ if (src_hwctx->fd < 0) {
-+ av_log(ctx, AV_LOG_ERROR, "DRM instance requires an associated "
-+ "device to derive a VA display from.\n");
-+ return AVERROR(EINVAL);
-+ }
-+
-+ priv = av_mallocz(sizeof(*priv));
-+ if (!priv)
-+ return AVERROR(ENOMEM);
-+
-+ // Inherits the fd from the source context, which will close it.
-+ priv->drm_fd = -1;
-+
-+ ctx->user_opaque = priv;
-+ ctx->free = &vaapi_device_free;
-+
-+ display = vaGetDisplayDRM(src_hwctx->fd);
-+ if (!display) {
-+ av_log(ctx, AV_LOG_ERROR, "Failed to open a VA display from "
-+ "DRM device.\n");
-+ return AVERROR(EIO);
-+ }
-+
-+ return vaapi_device_connect(ctx, display);
-+ }
-+#endif
-+ return AVERROR(ENOSYS);
-+}
-+
-+const HWContextType ff_hwcontext_type_vaapi = {
-+ .type = AV_HWDEVICE_TYPE_VAAPI,
-+ .name = "VAAPI",
-+
-+ .device_hwctx_size = sizeof(AVVAAPIDeviceContext),
-+ .device_priv_size = sizeof(VAAPIDeviceContext),
-+ .device_hwconfig_size = sizeof(AVVAAPIHWConfig),
-+ .frames_hwctx_size = sizeof(AVVAAPIFramesContext),
-+ .frames_priv_size = sizeof(VAAPIFramesContext),
-+
-+ .device_create = &vaapi_device_create,
-+ .device_derive = &vaapi_device_derive,
-+ .device_init = &vaapi_device_init,
-+ .device_uninit = &vaapi_device_uninit,
-+ .frames_get_constraints = &vaapi_frames_get_constraints,
-+ .frames_init = &vaapi_frames_init,
-+ .frames_uninit = &vaapi_frames_uninit,
-+ .frames_get_buffer = &vaapi_get_buffer,
-+ .transfer_get_formats = &vaapi_transfer_get_formats,
-+ .transfer_data_to = &vaapi_transfer_data_to,
-+ .transfer_data_from = &vaapi_transfer_data_from,
-+ .map_to = &vaapi_map_to,
-+ .map_from = &vaapi_map_from,
-+
-+ .pix_fmts = (const enum AVPixelFormat[]) {
-+ AV_PIX_FMT_VAAPI,
-+ AV_PIX_FMT_NONE
-+ },
-+};
-diff -up firefox-84.0/media/ffvpx/libavutil/hwcontext_vaapi.h.ffvpx firefox-84.0/media/ffvpx/libavutil/hwcontext_vaapi.h
---- firefox-84.0/media/ffvpx/libavutil/hwcontext_vaapi.h.ffvpx 2020-12-10 20:40:53.390541394 +0100
-+++ firefox-84.0/media/ffvpx/libavutil/hwcontext_vaapi.h 2020-12-10 20:40:53.390541394 +0100
-@@ -0,0 +1,117 @@
-+/*
-+ * This file is part of FFmpeg.
-+ *
-+ * FFmpeg is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * FFmpeg is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with FFmpeg; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-+ */
-+
-+#ifndef AVUTIL_HWCONTEXT_VAAPI_H
-+#define AVUTIL_HWCONTEXT_VAAPI_H
-+
-+#include <va/va.h>
-+
-+/**
-+ * @file
-+ * API-specific header for AV_HWDEVICE_TYPE_VAAPI.
-+ *
-+ * Dynamic frame pools are supported, but note that any pool used as a render
-+ * target is required to be of fixed size in order to be be usable as an
-+ * argument to vaCreateContext().
-+ *
-+ * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs
-+ * with the data pointer set to a VASurfaceID.
-+ */
-+
-+enum {
-+ /**
-+ * The quirks field has been set by the user and should not be detected
-+ * automatically by av_hwdevice_ctx_init().
-+ */
-+ AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0),
-+ /**
-+ * The driver does not destroy parameter buffers when they are used by
-+ * vaRenderPicture(). Additional code will be required to destroy them
-+ * separately afterwards.
-+ */
-+ AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1),
-+
-+ /**
-+ * The driver does not support the VASurfaceAttribMemoryType attribute,
-+ * so the surface allocation code will not try to use it.
-+ */
-+ AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2),
-+
-+ /**
-+ * The driver does not support surface attributes at all.
-+ * The surface allocation code will never pass them to surface allocation,
-+ * and the results of the vaQuerySurfaceAttributes() call will be faked.
-+ */
-+ AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3),
-+};
-+
-+/**
-+ * VAAPI connection details.
-+ *
-+ * Allocated as AVHWDeviceContext.hwctx
-+ */
-+typedef struct AVVAAPIDeviceContext {
-+ /**
-+ * The VADisplay handle, to be filled by the user.
-+ */
-+ VADisplay display;
-+ /**
-+ * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(),
-+ * with reference to a table of known drivers, unless the
-+ * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present. The user
-+ * may need to refer to this field when performing any later
-+ * operations using VAAPI with the same VADisplay.
-+ */
-+ unsigned int driver_quirks;
-+} AVVAAPIDeviceContext;
-+
-+/**
-+ * VAAPI-specific data associated with a frame pool.
-+ *
-+ * Allocated as AVHWFramesContext.hwctx.
-+ */
-+typedef struct AVVAAPIFramesContext {
-+ /**
-+ * Set by the user to apply surface attributes to all surfaces in
-+ * the frame pool. If null, default settings are used.
-+ */
-+ VASurfaceAttrib *attributes;
-+ int nb_attributes;
-+ /**
-+ * The surfaces IDs of all surfaces in the pool after creation.
-+ * Only valid if AVHWFramesContext.initial_pool_size was positive.
-+ * These are intended to be used as the render_targets arguments to
-+ * vaCreateContext().
-+ */
-+ VASurfaceID *surface_ids;
-+ int nb_surfaces;
-+} AVVAAPIFramesContext;
-+
-+/**
-+ * VAAPI hardware pipeline configuration details.
-+ *
-+ * Allocated with av_hwdevice_hwconfig_alloc().
-+ */
-+typedef struct AVVAAPIHWConfig {
-+ /**
-+ * ID of a VAAPI pipeline configuration.
-+ */
-+ VAConfigID config_id;
-+} AVVAAPIHWConfig;
-+
-+#endif /* AVUTIL_HWCONTEXT_VAAPI_H */
-diff -up firefox-84.0/media/ffvpx/libavutil/moz.build.ffvpx firefox-84.0/media/ffvpx/libavutil/moz.build
---- firefox-84.0/media/ffvpx/libavutil/moz.build.ffvpx 2020-12-08 00:35:05.000000000 +0100
-+++ firefox-84.0/media/ffvpx/libavutil/moz.build 2020-12-10 20:40:53.390541394 +0100
-@@ -45,6 +45,11 @@ SOURCES += [
- 'time.c',
- 'utils.c'
- ]
-+if CONFIG['MOZ_WAYLAND']:
-+ SOURCES += [
-+ 'hwcontext_vaapi.c',
-+ ]
-+ USE_LIBS += ['mozva']
-
- if not CONFIG['MOZ_FFVPX_AUDIOONLY']:
- SOURCES += [
-diff -up firefox-84.0/media/ffvpx/moz.build.ffvpx firefox-84.0/media/ffvpx/moz.build
---- firefox-84.0/media/ffvpx/moz.build.ffvpx 2020-12-08 00:35:05.000000000 +0100
-+++ firefox-84.0/media/ffvpx/moz.build 2020-12-10 20:40:53.390541394 +0100
-@@ -11,3 +11,8 @@ DIRS += [
- 'libavutil',
- 'libavcodec'
- ]
-+
-+if CONFIG['MOZ_WAYLAND']:
-+ DIRS += [
-+ 'mozva',
-+ ]
-diff -up firefox-84.0/media/ffvpx/mozva/moz.build.ffvpx firefox-84.0/media/ffvpx/mozva/moz.build
---- firefox-84.0/media/ffvpx/mozva/moz.build.ffvpx 2020-12-10 20:40:53.390541394 +0100
-+++ firefox-84.0/media/ffvpx/mozva/moz.build 2020-12-10 20:40:53.390541394 +0100
-@@ -0,0 +1,13 @@
-+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-+# vim: set filetype=python:
-+# This Source Code Form is subject to the terms of the Mozilla Public
-+# License, v. 2.0. If a copy of the MPL was not distributed with this
-+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-+
-+SOURCES += [
-+ 'mozva.c',
-+]
-+
-+LOCAL_INCLUDES += ['/media/ffvpx']
-+
-+Library('mozva')
-diff -up firefox-84.0/media/ffvpx/mozva/mozva.c.ffvpx firefox-84.0/media/ffvpx/mozva/mozva.c
---- firefox-84.0/media/ffvpx/mozva/mozva.c.ffvpx 2020-12-10 20:40:53.390541394 +0100
-+++ firefox-84.0/media/ffvpx/mozva/mozva.c 2020-12-10 20:40:53.390541394 +0100
-@@ -0,0 +1,406 @@
-+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-+/* vim:expandtab:shiftwidth=4:tabstop=4:
-+ */
-+/* This Source Code Form is subject to the terms of the Mozilla Public
-+ * License, v. 2.0. If a copy of the MPL was not distributed with this
-+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-+
-+#pragma GCC visibility push(default)
-+#include <va/va.h>
-+#pragma GCC visibility pop
-+
-+#include "mozilla/Types.h"
-+#include <dlfcn.h>
-+#include <pthread.h>
-+#include <stdlib.h>
-+
-+#define GET_FUNC(func, lib) (func##Fn = dlsym(lib, #func))
-+
-+#define IS_FUNC_LOADED(func) (func##Fn != NULL)
-+
-+static VAStatus (*vaDestroyBufferFn)(VADisplay dpy, VABufferID buffer_id);
-+static VAStatus (*vaBeginPictureFn)(VADisplay dpy, VAContextID context,
-+ VASurfaceID render_target);
-+static VAStatus (*vaEndPictureFn)(VADisplay dpy, VAContextID context);
-+static VAStatus (*vaRenderPictureFn)(VADisplay dpy, VAContextID context,
-+ VABufferID* buffers, int num_buffers);
-+static int (*vaMaxNumProfilesFn)(VADisplay dpy);
-+static VAStatus (*vaCreateContextFn)(VADisplay dpy, VAConfigID config_id,
-+ int picture_width, int picture_height,
-+ int flag, VASurfaceID* render_targets,
-+ int num_render_targets,
-+ VAContextID* context /* out */);
-+static VAStatus (*vaDestroyContextFn)(VADisplay dpy, VAContextID context);
-+static VAStatus (*vaCreateBufferFn)(VADisplay dpy, VAContextID context,
-+ VABufferType type, /* in */
-+ unsigned int size, /* in */
-+ unsigned int num_elements, /* in */
-+ void* data, /* in */
-+ VABufferID* buf_id /* out */);
-+static VAStatus (*vaQuerySurfaceAttributesFn)(VADisplay dpy, VAConfigID config,
-+ VASurfaceAttrib* attrib_list,
-+ unsigned int* num_attribs);
-+static VAStatus (*vaQueryConfigProfilesFn)(VADisplay dpy,
-+ VAProfile* profile_list, /* out */
-+ int* num_profiles /* out */);
-+static const char* (*vaErrorStrFn)(VAStatus error_status);
-+static VAStatus (*vaCreateConfigFn)(VADisplay dpy, VAProfile profile,
-+ VAEntrypoint entrypoint,
-+ VAConfigAttrib* attrib_list,
-+ int num_attribs,
-+ VAConfigID* config_id /* out */);
-+static VAStatus (*vaDestroyConfigFn)(VADisplay dpy, VAConfigID config_id);
-+static int (*vaMaxNumImageFormatsFn)(VADisplay dpy);
-+static VAStatus (*vaQueryImageFormatsFn)(VADisplay dpy,
-+ VAImageFormat* format_list, /* out */
-+ int* num_formats /* out */);
-+static const char* (*vaQueryVendorStringFn)(VADisplay dpy);
-+static VAStatus (*vaDestroySurfacesFn)(VADisplay dpy, VASurfaceID* surfaces,
-+ int num_surfaces);
-+static VAStatus (*vaCreateSurfacesFn)(VADisplay dpy, unsigned int format,
-+ unsigned int width, unsigned int height,
-+ VASurfaceID* surfaces,
-+ unsigned int num_surfaces,
-+ VASurfaceAttrib* attrib_list,
-+ unsigned int num_attribs);
-+static VAStatus (*vaDeriveImageFn)(VADisplay dpy, VASurfaceID surface,
-+ VAImage* image /* out */);
-+static VAStatus (*vaDestroyImageFn)(VADisplay dpy, VAImageID image);
-+static VAStatus (*vaPutImageFn)(VADisplay dpy, VASurfaceID surface,
-+ VAImageID image, int src_x, int src_y,
-+ unsigned int src_width, unsigned int src_height,
-+ int dest_x, int dest_y, unsigned int dest_width,
-+ unsigned int dest_height);
-+static VAStatus (*vaSyncSurfaceFn)(VADisplay dpy, VASurfaceID render_target);
-+static VAStatus (*vaCreateImageFn)(VADisplay dpy, VAImageFormat* format,
-+ int width, int height,
-+ VAImage* image /* out */);
-+static VAStatus (*vaGetImageFn)(
-+ VADisplay dpy, VASurfaceID surface,
-+ int x, /* coordinates of the upper left source pixel */
-+ int y, unsigned int width, /* width and height of the region */
-+ unsigned int height, VAImageID image);
-+static VAStatus (*vaMapBufferFn)(VADisplay dpy, VABufferID buf_id, /* in */
-+ void** pbuf /* out */);
-+static VAStatus (*vaUnmapBufferFn)(VADisplay dpy, VABufferID buf_id /* in */);
-+static VAStatus (*vaTerminateFn)(VADisplay dpy);
-+static VAStatus (*vaInitializeFn)(VADisplay dpy, int* major_version, /* out */
-+ int* minor_version /* out */);
-+static VAStatus (*vaSetDriverNameFn)(VADisplay dpy, char* driver_name);
-+
-+int LoadVALibrary() {
-+ static pthread_mutex_t sVALock = PTHREAD_MUTEX_INITIALIZER;
-+ static void* sVALib = NULL;
-+ static int sVAInitialized = 0;
-+ static int sVALoaded = 0;
-+
-+ pthread_mutex_lock(&sVALock);
-+
-+ if (!sVAInitialized) {
-+ sVAInitialized = 1;
-+ sVALib = dlopen("libva.so.2", RTLD_LAZY);
-+ if (!sVALib) {
-+ pthread_mutex_unlock(&sVALock);
-+ return 0;
-+ }
-+ GET_FUNC(vaDestroyBuffer, sVALib);
-+ GET_FUNC(vaBeginPicture, sVALib);
-+ GET_FUNC(vaEndPicture, sVALib);
-+ GET_FUNC(vaRenderPicture, sVALib);
-+ GET_FUNC(vaMaxNumProfiles, sVALib);
-+ GET_FUNC(vaCreateContext, sVALib);
-+ GET_FUNC(vaDestroyContext, sVALib);
-+ GET_FUNC(vaCreateBuffer, sVALib);
-+ GET_FUNC(vaQuerySurfaceAttributes, sVALib);
-+ GET_FUNC(vaQueryConfigProfiles, sVALib);
-+ GET_FUNC(vaErrorStr, sVALib);
-+ GET_FUNC(vaCreateConfig, sVALib);
-+ GET_FUNC(vaDestroyConfig, sVALib);
-+ GET_FUNC(vaMaxNumImageFormats, sVALib);
-+ GET_FUNC(vaQueryImageFormats, sVALib);
-+ GET_FUNC(vaQueryVendorString, sVALib);
-+ GET_FUNC(vaDestroySurfaces, sVALib);
-+ GET_FUNC(vaCreateSurfaces, sVALib);
-+ GET_FUNC(vaDeriveImage, sVALib);
-+ GET_FUNC(vaDestroyImage, sVALib);
-+ GET_FUNC(vaPutImage, sVALib);
-+ GET_FUNC(vaSyncSurface, sVALib);
-+ GET_FUNC(vaCreateImage, sVALib);
-+ GET_FUNC(vaGetImage, sVALib);
-+ GET_FUNC(vaMapBuffer, sVALib);
-+ GET_FUNC(vaUnmapBuffer, sVALib);
-+ GET_FUNC(vaTerminate, sVALib);
-+ GET_FUNC(vaInitialize, sVALib);
-+ GET_FUNC(vaSetDriverName, sVALib);
-+
-+ sVALoaded =
-+ (IS_FUNC_LOADED(vaDestroyBuffer) && IS_FUNC_LOADED(vaBeginPicture) &&
-+ IS_FUNC_LOADED(vaEndPicture) && IS_FUNC_LOADED(vaRenderPicture) &&
-+ IS_FUNC_LOADED(vaMaxNumProfiles) && IS_FUNC_LOADED(vaCreateContext) &&
-+ IS_FUNC_LOADED(vaDestroyContext) && IS_FUNC_LOADED(vaCreateBuffer) &&
-+ IS_FUNC_LOADED(vaQuerySurfaceAttributes) &&
-+ IS_FUNC_LOADED(vaQueryConfigProfiles) && IS_FUNC_LOADED(vaErrorStr) &&
-+ IS_FUNC_LOADED(vaCreateConfig) && IS_FUNC_LOADED(vaDestroyConfig) &&
-+ IS_FUNC_LOADED(vaMaxNumImageFormats) &&
-+ IS_FUNC_LOADED(vaQueryImageFormats) &&
-+ IS_FUNC_LOADED(vaQueryVendorString) &&
-+ IS_FUNC_LOADED(vaDestroySurfaces) &&
-+ IS_FUNC_LOADED(vaCreateSurfaces) && IS_FUNC_LOADED(vaDeriveImage) &&
-+ IS_FUNC_LOADED(vaDestroyImage) && IS_FUNC_LOADED(vaPutImage) &&
-+ IS_FUNC_LOADED(vaSyncSurface) && IS_FUNC_LOADED(vaCreateImage) &&
-+ IS_FUNC_LOADED(vaGetImage) && IS_FUNC_LOADED(vaMapBuffer) &&
-+ IS_FUNC_LOADED(vaUnmapBuffer) && IS_FUNC_LOADED(vaTerminate) &&
-+ IS_FUNC_LOADED(vaInitialize) && IS_FUNC_LOADED(vaSetDriverName));
-+ }
-+ pthread_mutex_unlock(&sVALock);
-+ return sVALoaded;
-+}
-+
-+#pragma GCC visibility push(default)
-+
-+VAStatus vaDestroyBuffer(VADisplay dpy, VABufferID buffer_id) {
-+ if (LoadVALibrary()) {
-+ return vaDestroyBufferFn(dpy, buffer_id);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaBeginPicture(VADisplay dpy, VAContextID context,
-+ VASurfaceID render_target) {
-+ if (LoadVALibrary()) {
-+ return vaBeginPictureFn(dpy, context, render_target);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaEndPicture(VADisplay dpy, VAContextID context) {
-+ if (LoadVALibrary()) {
-+ return vaEndPictureFn(dpy, context);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaRenderPicture(VADisplay dpy, VAContextID context,
-+ VABufferID* buffers, int num_buffers) {
-+ if (LoadVALibrary()) {
-+ return vaRenderPictureFn(dpy, context, buffers, num_buffers);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+int vaMaxNumProfiles(VADisplay dpy) {
-+ if (LoadVALibrary()) {
-+ return vaMaxNumProfilesFn(dpy);
-+ }
-+ return 0;
-+}
-+
-+VAStatus vaCreateContext(VADisplay dpy, VAConfigID config_id, int picture_width,
-+ int picture_height, int flag,
-+ VASurfaceID* render_targets, int num_render_targets,
-+ VAContextID* context /* out */) {
-+ if (LoadVALibrary()) {
-+ return vaCreateContextFn(dpy, config_id, picture_width, picture_height,
-+ flag, render_targets, num_render_targets, context);
-+ }
-+ *context = 0;
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaDestroyContext(VADisplay dpy, VAContextID context) {
-+ if (LoadVALibrary()) {
-+ return vaDestroyContextFn(dpy, context);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaCreateBuffer(VADisplay dpy, VAContextID context,
-+ VABufferType type, /* in */
-+ unsigned int size, /* in */
-+ unsigned int num_elements, /* in */
-+ void* data, /* in */
-+ VABufferID* buf_id /* out */) {
-+ if (LoadVALibrary()) {
-+ return vaCreateBufferFn(dpy, context, type, size, num_elements, data,
-+ buf_id);
-+ }
-+ *buf_id = 0;
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaQuerySurfaceAttributes(VADisplay dpy, VAConfigID config,
-+ VASurfaceAttrib* attrib_list,
-+ unsigned int* num_attribs) {
-+ if (LoadVALibrary()) {
-+ return vaQuerySurfaceAttributesFn(dpy, config, attrib_list, num_attribs);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaQueryConfigProfiles(VADisplay dpy, VAProfile* profile_list, /* out */
-+ int* num_profiles /* out */) {
-+ if (LoadVALibrary()) {
-+ return vaQueryConfigProfilesFn(dpy, profile_list, num_profiles);
-+ }
-+ *num_profiles = 0;
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+const char* vaErrorStr(VAStatus error_status) {
-+ if (LoadVALibrary()) {
-+ return vaErrorStrFn(error_status);
-+ }
-+ static char tmp[] = "Unimplemented";
-+ return tmp;
-+}
-+
-+VAStatus vaCreateConfig(VADisplay dpy, VAProfile profile,
-+ VAEntrypoint entrypoint, VAConfigAttrib* attrib_list,
-+ int num_attribs, VAConfigID* config_id /* out */) {
-+ if (LoadVALibrary()) {
-+ return vaCreateConfigFn(dpy, profile, entrypoint, attrib_list, num_attribs,
-+ config_id);
-+ }
-+ *config_id = 0;
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaDestroyConfig(VADisplay dpy, VAConfigID config_id) {
-+ if (LoadVALibrary()) {
-+ return vaDestroyConfigFn(dpy, config_id);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+int vaMaxNumImageFormats(VADisplay dpy) {
-+ if (LoadVALibrary()) {
-+ return vaMaxNumImageFormatsFn(dpy);
-+ }
-+ return 0;
-+}
-+
-+VAStatus vaQueryImageFormats(VADisplay dpy, VAImageFormat* format_list,
-+ int* num_formats) {
-+ if (LoadVALibrary()) {
-+ return vaQueryImageFormatsFn(dpy, format_list, num_formats);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+const char* vaQueryVendorString(VADisplay dpy) {
-+ if (LoadVALibrary()) {
-+ return vaQueryVendorStringFn(dpy);
-+ }
-+ return NULL;
-+}
-+
-+VAStatus vaDestroySurfaces(VADisplay dpy, VASurfaceID* surfaces,
-+ int num_surfaces) {
-+ if (LoadVALibrary()) {
-+ return vaDestroySurfacesFn(dpy, surfaces, num_surfaces);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaCreateSurfaces(VADisplay dpy, unsigned int format,
-+ unsigned int width, unsigned int height,
-+ VASurfaceID* surfaces, unsigned int num_surfaces,
-+ VASurfaceAttrib* attrib_list,
-+ unsigned int num_attribs) {
-+ if (LoadVALibrary()) {
-+ return vaCreateSurfacesFn(dpy, format, width, height, surfaces,
-+ num_surfaces, attrib_list, num_attribs);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaDeriveImage(VADisplay dpy, VASurfaceID surface,
-+ VAImage* image /* out */) {
-+ if (LoadVALibrary()) {
-+ return vaDeriveImageFn(dpy, surface, image);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaDestroyImage(VADisplay dpy, VAImageID image) {
-+ if (LoadVALibrary()) {
-+ return vaDestroyImageFn(dpy, image);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaPutImage(VADisplay dpy, VASurfaceID surface, VAImageID image,
-+ int src_x, int src_y, unsigned int src_width,
-+ unsigned int src_height, int dest_x, int dest_y,
-+ unsigned int dest_width, unsigned int dest_height) {
-+ if (LoadVALibrary()) {
-+ return vaPutImageFn(dpy, surface, image, src_x, src_y, src_width,
-+ src_height, dest_x, dest_y, dest_width, dest_height);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaSyncSurface(VADisplay dpy, VASurfaceID render_target) {
-+ if (LoadVALibrary()) {
-+ return vaSyncSurfaceFn(dpy, render_target);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaCreateImage(VADisplay dpy, VAImageFormat* format, int width,
-+ int height, VAImage* image /* out */) {
-+ if (LoadVALibrary()) {
-+ return vaCreateImageFn(dpy, format, width, height, image);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaGetImage(VADisplay dpy, VASurfaceID surface,
-+ int x, /* coordinates of the upper left source pixel */
-+ int y,
-+ unsigned int width, /* width and height of the region */
-+ unsigned int height, VAImageID image) {
-+ if (LoadVALibrary()) {
-+ return vaGetImageFn(dpy, surface, x, y, width, height, image);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaMapBuffer(VADisplay dpy, VABufferID buf_id, /* in */
-+ void** pbuf /* out */) {
-+ if (LoadVALibrary()) {
-+ return vaMapBufferFn(dpy, buf_id, pbuf);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaUnmapBuffer(VADisplay dpy, VABufferID buf_id /* in */) {
-+ if (LoadVALibrary()) {
-+ return vaUnmapBufferFn(dpy, buf_id);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaTerminate(VADisplay dpy) {
-+ if (LoadVALibrary()) {
-+ return vaTerminateFn(dpy);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaInitialize(VADisplay dpy, int* major_version, /* out */
-+ int* minor_version /* out */) {
-+ if (LoadVALibrary()) {
-+ return vaInitializeFn(dpy, major_version, minor_version);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+VAStatus vaSetDriverName(VADisplay dpy, char* driver_name) {
-+ if (LoadVALibrary()) {
-+ return vaSetDriverNameFn(dpy, driver_name);
-+ }
-+ return VA_STATUS_ERROR_UNIMPLEMENTED;
-+}
-+
-+#pragma GCC visibility pop
-diff -up firefox-84.0/media/ffvpx/README_MOZILLA.ffvpx firefox-84.0/media/ffvpx/README_MOZILLA
---- firefox-84.0/media/ffvpx/README_MOZILLA.ffvpx 2020-12-08 00:35:05.000000000 +0100
-+++ firefox-84.0/media/ffvpx/README_MOZILLA 2020-12-10 20:40:53.390541394 +0100
-@@ -56,3 +56,5 @@ $ for i in `cat $PATH_CENTRAL/media/ffvp
- Then apply patch.diff on the ffvpx tree.
-
- Compilation will reveal if any files are missing.
-+
-+Apply linux-vaapi-build.patch patch to enable build VA-API support for Linux.
-diff -up firefox-84.0/media/ffvpx/va/README.ffvpx firefox-84.0/media/ffvpx/va/README
---- firefox-84.0/media/ffvpx/va/README.ffvpx 2020-12-10 20:40:53.390541394 +0100
-+++ firefox-84.0/media/ffvpx/va/README 2020-12-10 20:40:53.390541394 +0100
-@@ -0,0 +1,2 @@
-+There are libva headers from libva 1.7.0 used to build vaapi support for in-tree ffvpx.
-+Apply va.patch when you update it to new versions.
-\ No newline at end of file
-diff -up firefox-84.0/media/ffvpx/va/va_dec_vp8.h.ffvpx firefox-84.0/media/ffvpx/va/va_dec_vp8.h
---- firefox-84.0/media/ffvpx/va/va_dec_vp8.h.ffvpx 2020-12-10 20:40:53.390541394 +0100
-+++ firefox-84.0/media/ffvpx/va/va_dec_vp8.h 2020-12-10 20:40:53.390541394 +0100
-@@ -0,0 +1,254 @@
-+/*
-+ * Copyright (c) 2007-2012 Intel Corporation. All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+/**
-+ * \file va_dec_vp.h
-+ * \brief VP8 decoding API
-+ *
-+ * This file contains the \ref api_dec_vp8 "VP8 decoding API".
-+ */
-+
-+#ifndef VA_DEC_VP8_H
-+#define VA_DEC_VP8_H
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/**
-+ * \defgroup api_dec_vp8 VP8 decoding API
-+ *
-+ * @{
-+ */
-+
-+/**
-+ * \brief VPX Bool Coder Context structure
-+ *
-+ * This common structure is defined for potential sharing by other VP formats
-+ *
-+ */
-+typedef struct _VABoolCoderContextVPX
-+{
-+ /* partition 0 "range" */
-+ uint8_t range;
-+ /* partition 0 "value" */
-+ uint8_t value;
-+ /*
-+ * 'partition 0 number of shifts before an output byte is available'
-+ * it is the number of remaining bits in 'value' for decoding, range [0, 7].
-+ */
-+
-+ uint8_t count;
-+} VABoolCoderContextVPX;
-+
-+/**
-+ * \brief VP8 Decoding Picture Parameter Buffer Structure
-+ *
-+ * This structure conveys frame level parameters and should be sent once
-+ * per frame.
-+ *
-+ */
-+typedef struct _VAPictureParameterBufferVP8
-+{
-+ /* frame width in pixels */
-+ uint32_t frame_width;
-+ /* frame height in pixels */
-+ uint32_t frame_height;
-+
-+ /* specifies the "last" reference frame */
-+ VASurfaceID last_ref_frame;
-+ /* specifies the "golden" reference frame */
-+ VASurfaceID golden_ref_frame;
-+ /* specifies the "alternate" referrence frame */
-+ VASurfaceID alt_ref_frame;
-+ /* specifies the out-of-loop deblocked frame, not used currently */
-+ VASurfaceID out_of_loop_frame;
-+
-+ union {
-+ struct {
-+ /* same as key_frame in bitstream syntax, 0 means a key frame */
-+ uint32_t key_frame : 1;
-+ /* same as version in bitstream syntax */
-+ uint32_t version : 3;
-+ /* same as segmentation_enabled in bitstream syntax */
-+ uint32_t segmentation_enabled : 1;
-+ /* same as update_mb_segmentation_map in bitstream syntax */
-+ uint32_t update_mb_segmentation_map : 1;
-+ /* same as update_segment_feature_data in bitstream syntax */
-+ uint32_t update_segment_feature_data : 1;
-+ /* same as filter_type in bitstream syntax */
-+ uint32_t filter_type : 1;
-+ /* same as sharpness_level in bitstream syntax */
-+ uint32_t sharpness_level : 3;
-+ /* same as loop_filter_adj_enable in bitstream syntax */
-+ uint32_t loop_filter_adj_enable : 1;
-+ /* same as mode_ref_lf_delta_update in bitstream syntax */
-+ uint32_t mode_ref_lf_delta_update : 1;
-+ /* same as sign_bias_golden in bitstream syntax */
-+ uint32_t sign_bias_golden : 1;
-+ /* same as sign_bias_alternate in bitstream syntax */
-+ uint32_t sign_bias_alternate : 1;
-+ /* same as mb_no_coeff_skip in bitstream syntax */
-+ uint32_t mb_no_coeff_skip : 1;
-+ /* flag to indicate that loop filter should be disabled */
-+ uint32_t loop_filter_disable : 1;
-+ } bits;
-+ uint32_t value;
-+ } pic_fields;
-+
-+ /*
-+ * probabilities of the segment_id decoding tree and same as
-+ * mb_segment_tree_probs in the spec.
-+ */
-+ uint8_t mb_segment_tree_probs[3];
-+
-+ /* Post-adjustment loop filter levels for the 4 segments */
-+ uint8_t loop_filter_level[4];
-+ /* loop filter deltas for reference frame based MB level adjustment */
-+ int8_t loop_filter_deltas_ref_frame[4];
-+ /* loop filter deltas for coding mode based MB level adjustment */
-+ int8_t loop_filter_deltas_mode[4];
-+
-+ /* same as prob_skip_false in bitstream syntax */
-+ uint8_t prob_skip_false;
-+ /* same as prob_intra in bitstream syntax */
-+ uint8_t prob_intra;
-+ /* same as prob_last in bitstream syntax */
-+ uint8_t prob_last;
-+ /* same as prob_gf in bitstream syntax */
-+ uint8_t prob_gf;
-+
-+ /*
-+ * list of 4 probabilities of the luma intra prediction mode decoding
-+ * tree and same as y_mode_probs in frame header
-+ */
-+ uint8_t y_mode_probs[4];
-+ /*
-+ * list of 3 probabilities of the chroma intra prediction mode decoding
-+ * tree and same as uv_mode_probs in frame header
-+ */
-+ uint8_t uv_mode_probs[3];
-+ /*
-+ * updated mv decoding probabilities and same as mv_probs in
-+ * frame header
-+ */
-+ uint8_t mv_probs[2][19];
-+
-+ VABoolCoderContextVPX bool_coder_ctx;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAPictureParameterBufferVP8;
-+
-+/**
-+ * \brief VP8 Slice Parameter Buffer Structure
-+ *
-+ * This structure conveys parameters related to data partitions and should be
-+ * sent once per frame. Slice data buffer of VASliceDataBufferType is used
-+ * to send the partition data.
-+ *
-+ */
-+typedef struct _VASliceParameterBufferVP8
-+{
-+ /*
-+ * number of bytes in the slice data buffer for the partitions
-+ */
-+ uint32_t slice_data_size;
-+ /*
-+ * offset to the first byte of partition data (control partition)
-+ */
-+ uint32_t slice_data_offset;
-+ /*
-+ * see VA_SLICE_DATA_FLAG_XXX definitions
-+ */
-+ uint32_t slice_data_flag;
-+ /*
-+ * offset to the first bit of MB from the first byte of partition data(slice_data_offset)
-+ */
-+ uint32_t macroblock_offset;
-+
-+ /*
-+ * Partitions
-+ * (1<<log2_nbr_of_dct_partitions)+1, count both control partition (frame header) and toke partition
-+ */
-+ uint8_t num_of_partitions;
-+ /*
-+ * partition_size[0] is remaining bytes of control partition after parsed by application.
-+ * exclude current byte for the remaining bits in bool_coder_ctx.
-+ * exclude the uncompress data chunk since first_part_size 'excluding the uncompressed data chunk'
-+ */
-+ uint32_t partition_size[9];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VASliceParameterBufferVP8;
-+
-+/**
-+ * \brief VP8 Coefficient Probability Data Buffer Structure
-+ *
-+ * Contains the contents of the token probability table, which may be
-+ * incrementally modified in the frame header. There are four dimensions to
-+ * the token probability array. The outermost dimension is indexed by the
-+ * type of plane being decoded; the next dimension is selected by the
-+ * position of the coefficient being decoded; the third dimension, * roughly
-+ * speaking, measures the "local complexity" or extent to which nearby
-+ * coefficients are non-zero; the fourth, and final, dimension of the token
-+ * probability array is indexed by the position in the token tree structure,
-+ * as are all tree probability arrays. This structure is sent once per frame.
-+ *
-+ */
-+typedef struct _VAProbabilityDataBufferVP8
-+{
-+ uint8_t dct_coeff_probs[4][8][3][11];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAProbabilityDataBufferVP8;
-+
-+/**
-+ * \brief VP8 Inverse Quantization Matrix Buffer Structure
-+ *
-+ * Contains quantization indices for yac(0),ydc(1),y2dc(2),y2ac(3),uvdc(4),
-+ * uvac(5) for each segment (0-3). When segmentation is disabled, only
-+ * quantization_index[0][] will be used. This structure is sent once per frame.
-+ */
-+typedef struct _VAIQMatrixBufferVP8
-+{
-+ /*
-+ * array first dimensional is segment and 2nd dimensional is Q index
-+ * all Q indexs should be clipped to be range [0, 127]
-+ */
-+ uint16_t quantization_index[4][6];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAIQMatrixBufferVP8;
-+
-+/**@}*/
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* VA_DEC_VP8_H */
-diff -up firefox-84.0/media/ffvpx/va/va_dec_vp9.h.ffvpx firefox-84.0/media/ffvpx/va/va_dec_vp9.h
---- firefox-84.0/media/ffvpx/va/va_dec_vp9.h.ffvpx 2020-12-10 20:40:53.390541394 +0100
-+++ firefox-84.0/media/ffvpx/va/va_dec_vp9.h 2020-12-10 20:40:53.390541394 +0100
-@@ -0,0 +1,319 @@
-+/*
-+ * Copyright (c) 2014 Intel Corporation. All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+/**
-+ * \file va_dec_vp9.h
-+ * \brief The VP9 decoding API
-+ *
-+ * This file contains the \ref api_dec_vp9 "VP9 decoding API".
-+ */
-+
-+#ifndef VA_DEC_VP9_H
-+#define VA_DEC_VP9_H
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/**
-+ * \defgroup api_dec_vp9 VP9 decoding API
-+ *
-+ * This VP9 decoding API supports 8-bit 420 format only.
-+ *
-+ * @{
-+ */
-+
-+
-+
-+
-+/**
-+ * \brief VP9 Decoding Picture Parameter Buffer Structure
-+ *
-+ * This structure conveys picture level parameters.
-+ * App should send a surface with this data structure down to VAAPI once
-+ * per frame.
-+ *
-+ */
-+typedef struct _VADecPictureParameterBufferVP9
-+{
-+ /** \brief picture width
-+ * Picture original resolution. The value may not be multiple of 8.
-+ */
-+ uint16_t frame_width;
-+ /** \brief picture height
-+ * Picture original resolution. The value may not be multiple of 8.
-+ */
-+ uint16_t frame_height;
-+
-+ /** \brief Surface indices of reference frames in DPB.
-+ *
-+ * Each entry of the list specifies the surface index of the picture
-+ * that is referred by current picture or will be referred by any future
-+ * picture.
-+ * Application who calls this API should update this list based on the
-+ * refreshing information from VP9 bitstream.
-+ */
-+ VASurfaceID reference_frames[8];
-+
-+ union
-+ {
-+ struct
-+ {
-+ /** \brief flags for current picture
-+ * same syntax and semantic as those in VP9 code
-+ */
-+ uint32_t subsampling_x : 1;
-+ uint32_t subsampling_y : 1;
-+ uint32_t frame_type : 1;
-+ uint32_t show_frame : 1;
-+ uint32_t error_resilient_mode : 1;
-+ uint32_t intra_only : 1;
-+ uint32_t allow_high_precision_mv : 1;
-+ uint32_t mcomp_filter_type : 3;
-+ uint32_t frame_parallel_decoding_mode : 1;
-+ uint32_t reset_frame_context : 2;
-+ uint32_t refresh_frame_context : 1;
-+ uint32_t frame_context_idx : 2;
-+ uint32_t segmentation_enabled : 1;
-+
-+ /** \brief corresponds to variable temporal_update in VP9 code.
-+ */
-+ uint32_t segmentation_temporal_update : 1;
-+ /** \brief corresponds to variable update_mb_segmentation_map
-+ * in VP9 code.
-+ */
-+ uint32_t segmentation_update_map : 1;
-+
-+ /** \brief Index of reference_frames[] and points to the
-+ * LAST reference frame.
-+ * It corresponds to active_ref_idx[0] in VP9 code.
-+ */
-+ uint32_t last_ref_frame : 3;
-+ /** \brief Sign Bias of the LAST reference frame.
-+ * It corresponds to ref_frame_sign_bias[LAST_FRAME] in VP9 code.
-+ */
-+ uint32_t last_ref_frame_sign_bias : 1;
-+ /** \brief Index of reference_frames[] and points to the
-+ * GOLDERN reference frame.
-+ * It corresponds to active_ref_idx[1] in VP9 code.
-+ */
-+ uint32_t golden_ref_frame : 3;
-+ /** \brief Sign Bias of the GOLDERN reference frame.
-+ * Corresponds to ref_frame_sign_bias[GOLDERN_FRAME] in VP9 code.
-+ */
-+ uint32_t golden_ref_frame_sign_bias : 1;
-+ /** \brief Index of reference_frames[] and points to the
-+ * ALTERNATE reference frame.
-+ * Corresponds to active_ref_idx[2] in VP9 code.
-+ */
-+ uint32_t alt_ref_frame : 3;
-+ /** \brief Sign Bias of the ALTERNATE reference frame.
-+ * Corresponds to ref_frame_sign_bias[ALTREF_FRAME] in VP9 code.
-+ */
-+ uint32_t alt_ref_frame_sign_bias : 1;
-+ /** \brief Lossless Mode
-+ * LosslessFlag = base_qindex == 0 &&
-+ * y_dc_delta_q == 0 &&
-+ * uv_dc_delta_q == 0 &&
-+ * uv_ac_delta_q == 0;
-+ * Where base_qindex, y_dc_delta_q, uv_dc_delta_q and uv_ac_delta_q
-+ * are all variables in VP9 code.
-+ */
-+ uint32_t lossless_flag : 1;
-+ } bits;
-+ uint32_t value;
-+ } pic_fields;
-+
-+ /* following parameters have same syntax with those in VP9 code */
-+ uint8_t filter_level;
-+ uint8_t sharpness_level;
-+
-+ /** \brief number of tile rows specified by (1 << log2_tile_rows).
-+ * It corresponds the variable with same name in VP9 code.
-+ */
-+ uint8_t log2_tile_rows;
-+ /** \brief number of tile columns specified by (1 << log2_tile_columns).
-+ * It corresponds the variable with same name in VP9 code.
-+ */
-+ uint8_t log2_tile_columns;
-+ /** \brief Number of bytes taken up by the uncompressed frame header,
-+ * which corresponds to byte length of function
-+ * read_uncompressed_header() in VP9 code.
-+ * Specifically, it is the byte count from bit stream buffer start to
-+ * the last byte of uncompressed frame header.
-+ * If there are other meta data in the buffer before uncompressed header,
-+ * its size should be also included here.
-+ */
-+ uint8_t frame_header_length_in_bytes;
-+
-+ /** \brief The byte count of compressed header the bitstream buffer,
-+ * which corresponds to syntax first_partition_size in code.
-+ */
-+ uint16_t first_partition_size;
-+
-+ /** These values are segment probabilities with same names in VP9
-+ * function setup_segmentation(). They should be parsed directly from
-+ * bitstream by application.
-+ */
-+ uint8_t mb_segment_tree_probs[7];
-+ uint8_t segment_pred_probs[3];
-+
-+ /** \brief VP9 Profile definition
-+ * value range [0..3].
-+ */
-+ uint8_t profile;
-+
-+ /** \brief VP9 bit depth per sample
-+ * same for both luma and chroma samples.
-+ */
-+ uint8_t bit_depth;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_MEDIUM];
-+
-+} VADecPictureParameterBufferVP9;
-+
-+
-+
-+/**
-+ * \brief VP9 Segmentation Parameter Data Structure
-+ *
-+ * This structure conveys per segment parameters.
-+ * 8 of this data structure will be included in VASegmentationParameterBufferVP9
-+ * and sent to API in a single buffer.
-+ *
-+ */
-+typedef struct _VASegmentParameterVP9
-+{
-+ union
-+ {
-+ struct
-+ {
-+ /** \brief Indicates if per segment reference frame indicator
-+ * is enabled.
-+ * Corresponding to variable feature_enabled when
-+ * j == SEG_LVL_REF_FRAME in function setup_segmentation() VP9 code.
-+ */
-+ uint16_t segment_reference_enabled : 1;
-+ /** \brief Specifies per segment reference indication.
-+ * 0: reserved
-+ * 1: Last ref
-+ * 2: golden
-+ * 3: altref
-+ * Value can be derived from variable data when
-+ * j == SEG_LVL_REF_FRAME in function setup_segmentation() VP9 code.
-+ */
-+ uint16_t segment_reference : 2;
-+ /** \brief Indicates if per segment skip feature is enabled.
-+ * Corresponding to variable feature_enabled when
-+ * j == SEG_LVL_SKIP in function setup_segmentation() VP9 code.
-+ */
-+ uint16_t segment_reference_skipped : 1;
-+ } fields;
-+ uint16_t value;
-+ } segment_flags;
-+
-+ /** \brief Specifies the filter level information per segment.
-+ * The value corresponds to variable lfi->lvl[seg][ref][mode] in VP9 code,
-+ * where m is [ref], and n is [mode] in FilterLevel[m][n].
-+ */
-+ uint8_t filter_level[4][2];
-+ /** \brief Specifies per segment Luma AC quantization scale.
-+ * Corresponding to y_dequant[qindex][1] in vp9_mb_init_quantizer()
-+ * function of VP9 code.
-+ */
-+ int16_t luma_ac_quant_scale;
-+ /** \brief Specifies per segment Luma DC quantization scale.
-+ * Corresponding to y_dequant[qindex][0] in vp9_mb_init_quantizer()
-+ * function of VP9 code.
-+ */
-+ int16_t luma_dc_quant_scale;
-+ /** \brief Specifies per segment Chroma AC quantization scale.
-+ * Corresponding to uv_dequant[qindex][1] in vp9_mb_init_quantizer()
-+ * function of VP9 code.
-+ */
-+ int16_t chroma_ac_quant_scale;
-+ /** \brief Specifies per segment Chroma DC quantization scale.
-+ * Corresponding to uv_dequant[qindex][0] in vp9_mb_init_quantizer()
-+ * function of VP9 code.
-+ */
-+ int16_t chroma_dc_quant_scale;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+
-+} VASegmentParameterVP9;
-+
-+
-+
-+/**
-+ * \brief VP9 Slice Parameter Buffer Structure
-+ *
-+ * This structure conveys parameters related to segmentation data and should be
-+ * sent once per frame.
-+ *
-+ * When segmentation is disabled, only SegParam[0] has valid values,
-+ * all other entries should be populated with 0.
-+ * Otherwise, all eight entries should be valid.
-+ *
-+ * Slice data buffer of VASliceDataBufferType is used
-+ * to send the bitstream which should include whole or part of partition 0
-+ * (at least compressed header) to the end of frame.
-+ *
-+ */
-+typedef struct _VASliceParameterBufferVP9
-+{
-+ /** \brief The byte count of current frame in the bitstream buffer,
-+ * starting from first byte of the buffer.
-+ * It uses the name slice_data_size to be consitent with other codec,
-+ * but actually means frame_data_size.
-+ */
-+ uint32_t slice_data_size;
-+ /**
-+ * offset to the first byte of partition data (control partition)
-+ */
-+ uint32_t slice_data_offset;
-+ /**
-+ * see VA_SLICE_DATA_FLAG_XXX definitions
-+ */
-+ uint32_t slice_data_flag;
-+
-+ /**
-+ * \brief per segment information
-+ */
-+ VASegmentParameterVP9 seg_param[8];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+
-+} VASliceParameterBufferVP9;
-+
-+
-+/**@}*/
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* VA_DEC_VP9_H */
-diff -up firefox-84.0/media/ffvpx/va/va.h.ffvpx firefox-84.0/media/ffvpx/va/va.h
---- firefox-84.0/media/ffvpx/va/va.h.ffvpx 2020-12-10 20:40:53.391541423 +0100
-+++ firefox-84.0/media/ffvpx/va/va.h 2020-12-10 20:40:53.391541423 +0100
-@@ -0,0 +1,4636 @@
-+/*
-+ * Copyright (c) 2007-2009 Intel Corporation. All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+/*
-+ * Video Acceleration (VA) API Specification
-+ *
-+ * Rev. 0.30
-+ * <jonathan.bian@intel.com>
-+ *
-+ * Revision History:
-+ * rev 0.10 (12/10/2006 Jonathan Bian) - Initial draft
-+ * rev 0.11 (12/15/2006 Jonathan Bian) - Fixed some errors
-+ * rev 0.12 (02/05/2007 Jonathan Bian) - Added VC-1 data structures for slice level decode
-+ * rev 0.13 (02/28/2007 Jonathan Bian) - Added GetDisplay()
-+ * rev 0.14 (04/13/2007 Jonathan Bian) - Fixed MPEG-2 PictureParameter structure, cleaned up a few funcs.
-+ * rev 0.15 (04/20/2007 Jonathan Bian) - Overhauled buffer management
-+ * rev 0.16 (05/02/2007 Jonathan Bian) - Added error codes and fixed some issues with configuration
-+ * rev 0.17 (05/07/2007 Jonathan Bian) - Added H.264/AVC data structures for slice level decode.
-+ * rev 0.18 (05/14/2007 Jonathan Bian) - Added data structures for MPEG-4 slice level decode
-+ * and MPEG-2 motion compensation.
-+ * rev 0.19 (08/06/2007 Jonathan Bian) - Removed extra type for bitplane data.
-+ * rev 0.20 (08/08/2007 Jonathan Bian) - Added missing fields to VC-1 PictureParameter structure.
-+ * rev 0.21 (08/20/2007 Jonathan Bian) - Added image and subpicture support.
-+ * rev 0.22 (08/27/2007 Jonathan Bian) - Added support for chroma-keying and global alpha.
-+ * rev 0.23 (09/11/2007 Jonathan Bian) - Fixed some issues with images and subpictures.
-+ * rev 0.24 (09/18/2007 Jonathan Bian) - Added display attributes.
-+ * rev 0.25 (10/18/2007 Jonathan Bian) - Changed to use IDs only for some types.
-+ * rev 0.26 (11/07/2007 Waldo Bastian) - Change vaCreateBuffer semantics
-+ * rev 0.27 (11/19/2007 Matt Sottek) - Added DeriveImage
-+ * rev 0.28 (12/06/2007 Jonathan Bian) - Added new versions of PutImage and AssociateSubpicture
-+ * to enable scaling
-+ * rev 0.29 (02/07/2008 Jonathan Bian) - VC1 parameter fixes,
-+ * added VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED
-+ * rev 0.30 (03/01/2009 Jonathan Bian) - Added encoding support for H.264 BP and MPEG-4 SP and fixes
-+ * for ISO C conformance.
-+ * rev 0.31 (09/02/2009 Gwenole Beauchesne) - VC-1/H264 fields change for VDPAU and XvBA backend
-+ * Application needs to relink with the new library.
-+ *
-+ * rev 0.31.1 (03/29/2009) - Data structure for JPEG encode
-+ * rev 0.31.2 (01/13/2011 Anthony Pabon)- Added a flag to indicate Subpicture coordinates are screen
-+ * screen relative rather than source video relative.
-+ * rev 0.32.0 (01/13/2011 Xiang Haihao) - Add profile into VAPictureParameterBufferVC1
-+ * update VAAPI to 0.32.0
-+ *
-+ * Acknowledgements:
-+ * Some concepts borrowed from XvMC and XvImage.
-+ * Waldo Bastian (Intel), Matt Sottek (Intel), Austin Yuan (Intel), and Gwenole Beauchesne (SDS)
-+ * contributed to various aspects of the API.
-+ */
-+
-+/**
-+ * \file va.h
-+ * \brief The Core API
-+ *
-+ * This file contains the \ref api_core "Core API".
-+ */
-+
-+#ifndef _VA_H_
-+#define _VA_H_
-+
-+#include <stddef.h>
-+#include <stdint.h>
-+#include "va_version.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#if defined(__GNUC__) && !defined(__COVERITY__)
-+#define va_deprecated __attribute__((deprecated))
-+#if __GNUC__ >= 6
-+#define va_deprecated_enum va_deprecated
-+#else
-+#define va_deprecated_enum
-+#endif
-+#else
-+#define va_deprecated
-+#define va_deprecated_enum
-+#endif
-+
-+/**
-+ * \mainpage Video Acceleration (VA) API
-+ *
-+ * \section intro Introduction
-+ *
-+ * The main motivation for VA-API (Video Acceleration API) is to
-+ * enable hardware accelerated video decode and encode at various
-+ * entry-points (VLD, IDCT, Motion Compensation etc.) for the
-+ * prevailing coding standards today (MPEG-2, MPEG-4 ASP/H.263, MPEG-4
-+ * AVC/H.264, VC-1/VMW3, and JPEG, HEVC/H265, VP8, VP9) and video pre/post
-+ * processing
-+ *
-+ * VA-API is split into several modules:
-+ * - \ref api_core
-+ * - Encoder (H264, HEVC, JPEG, MPEG2, VP8, VP9)
-+ * - \ref api_enc_h264
-+ * - \ref api_enc_hevc
-+ * - \ref api_enc_jpeg
-+ * - \ref api_enc_mpeg2
-+ * - \ref api_enc_vp8
-+ * - \ref api_enc_vp9
-+ * - Decoder (HEVC, JPEG, VP8, VP9)
-+ * - \ref api_dec_hevc
-+ * - \ref api_dec_jpeg
-+ * - \ref api_dec_vp8
-+ * - \ref api_dec_vp9
-+ * - \ref api_vpp
-+ * - FEI (H264, HEVC)
-+ * - \ref api_fei
-+ * - \ref api_fei_h264
-+ * - \ref api_fei_hevc
-+ */
-+
-+/**
-+ * \defgroup api_core Core API
-+ *
-+ * @{
-+ */
-+
-+/**
-+Overview
-+
-+The VA API is intended to provide an interface between a video decode/encode/processing
-+application (client) and a hardware accelerator (server), to off-load
-+video decode/encode/processing operations from the host to the hardware accelerator at various
-+entry-points.
-+
-+The basic operation steps are:
-+
-+- Negotiate a mutually acceptable configuration with the server to lock
-+ down profile, entrypoints, and other attributes that will not change on
-+ a frame-by-frame basis.
-+- Create a video decode, encode or processing context which represents a
-+ "virtualized" hardware device
-+- Get and fill the render buffers with the corresponding data (depending on
-+ profiles and entrypoints)
-+- Pass the render buffers to the server to handle the current frame
-+
-+Initialization & Configuration Management
-+
-+- Find out supported profiles
-+- Find out entrypoints for a given profile
-+- Find out configuration attributes for a given profile/entrypoint pair
-+- Create a configuration for use by the application
-+
-+*/
-+
-+typedef void* VADisplay; /* window system dependent */
-+
-+typedef int VAStatus; /** Return status type from functions */
-+/** Values for the return status */
-+#define VA_STATUS_SUCCESS 0x00000000
-+#define VA_STATUS_ERROR_OPERATION_FAILED 0x00000001
-+#define VA_STATUS_ERROR_ALLOCATION_FAILED 0x00000002
-+#define VA_STATUS_ERROR_INVALID_DISPLAY 0x00000003
-+#define VA_STATUS_ERROR_INVALID_CONFIG 0x00000004
-+#define VA_STATUS_ERROR_INVALID_CONTEXT 0x00000005
-+#define VA_STATUS_ERROR_INVALID_SURFACE 0x00000006
-+#define VA_STATUS_ERROR_INVALID_BUFFER 0x00000007
-+#define VA_STATUS_ERROR_INVALID_IMAGE 0x00000008
-+#define VA_STATUS_ERROR_INVALID_SUBPICTURE 0x00000009
-+#define VA_STATUS_ERROR_ATTR_NOT_SUPPORTED 0x0000000a
-+#define VA_STATUS_ERROR_MAX_NUM_EXCEEDED 0x0000000b
-+#define VA_STATUS_ERROR_UNSUPPORTED_PROFILE 0x0000000c
-+#define VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT 0x0000000d
-+#define VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT 0x0000000e
-+#define VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE 0x0000000f
-+#define VA_STATUS_ERROR_SURFACE_BUSY 0x00000010
-+#define VA_STATUS_ERROR_FLAG_NOT_SUPPORTED 0x00000011
-+#define VA_STATUS_ERROR_INVALID_PARAMETER 0x00000012
-+#define VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED 0x00000013
-+#define VA_STATUS_ERROR_UNIMPLEMENTED 0x00000014
-+#define VA_STATUS_ERROR_SURFACE_IN_DISPLAYING 0x00000015
-+#define VA_STATUS_ERROR_INVALID_IMAGE_FORMAT 0x00000016
-+#define VA_STATUS_ERROR_DECODING_ERROR 0x00000017
-+#define VA_STATUS_ERROR_ENCODING_ERROR 0x00000018
-+/**
-+ * \brief An invalid/unsupported value was supplied.
-+ *
-+ * This is a catch-all error code for invalid or unsupported values.
-+ * e.g. value exceeding the valid range, invalid type in the context
-+ * of generic attribute values.
-+ */
-+#define VA_STATUS_ERROR_INVALID_VALUE 0x00000019
-+/** \brief An unsupported filter was supplied. */
-+#define VA_STATUS_ERROR_UNSUPPORTED_FILTER 0x00000020
-+/** \brief An invalid filter chain was supplied. */
-+#define VA_STATUS_ERROR_INVALID_FILTER_CHAIN 0x00000021
-+/** \brief Indicate HW busy (e.g. run multiple encoding simultaneously). */
-+#define VA_STATUS_ERROR_HW_BUSY 0x00000022
-+/** \brief An unsupported memory type was supplied. */
-+#define VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE 0x00000024
-+/** \brief Indicate allocated buffer size is not enough for input or output. */
-+#define VA_STATUS_ERROR_NOT_ENOUGH_BUFFER 0x00000025
-+#define VA_STATUS_ERROR_UNKNOWN 0xFFFFFFFF
-+
-+/**
-+ * 1. De-interlacing flags for vaPutSurface()
-+ * 2. Surface sample type for input/output surface flag
-+ * - Progressive: VA_FRAME_PICTURE
-+ * - Interleaved: VA_TOP_FIELD_FIRST, VA_BOTTOM_FIELD_FIRST
-+ * - Field: VA_TOP_FIELD, VA_BOTTOM_FIELD
-+*/
-+#define VA_FRAME_PICTURE 0x00000000
-+#define VA_TOP_FIELD 0x00000001
-+#define VA_BOTTOM_FIELD 0x00000002
-+#define VA_TOP_FIELD_FIRST 0x00000004
-+#define VA_BOTTOM_FIELD_FIRST 0x00000008
-+
-+/**
-+ * Enabled the positioning/cropping/blending feature:
-+ * 1, specify the video playback position in the isurface
-+ * 2, specify the cropping info for video playback
-+ * 3, encoded video will blend with background color
-+ */
-+#define VA_ENABLE_BLEND 0x00000004 /* video area blend with the constant color */
-+
-+/**
-+ * Clears the drawable with background color.
-+ * for hardware overlay based implementation this flag
-+ * can be used to turn off the overlay
-+ */
-+#define VA_CLEAR_DRAWABLE 0x00000008
-+
-+/** Color space conversion flags for vaPutSurface() */
-+#define VA_SRC_COLOR_MASK 0x000000f0
-+#define VA_SRC_BT601 0x00000010
-+#define VA_SRC_BT709 0x00000020
-+#define VA_SRC_SMPTE_240 0x00000040
-+
-+/** Scaling flags for vaPutSurface() */
-+#define VA_FILTER_SCALING_DEFAULT 0x00000000
-+#define VA_FILTER_SCALING_FAST 0x00000100
-+#define VA_FILTER_SCALING_HQ 0x00000200
-+#define VA_FILTER_SCALING_NL_ANAMORPHIC 0x00000300
-+#define VA_FILTER_SCALING_MASK 0x00000f00
-+
-+/** Padding size in 4-bytes */
-+#define VA_PADDING_LOW 4
-+#define VA_PADDING_MEDIUM 8
-+#define VA_PADDING_HIGH 16
-+#define VA_PADDING_LARGE 32
-+
-+/**
-+ * Returns a short english description of error_status
-+ */
-+const char *vaErrorStr(VAStatus error_status);
-+
-+typedef struct _VARectangle
-+{
-+ int16_t x;
-+ int16_t y;
-+ uint16_t width;
-+ uint16_t height;
-+} VARectangle;
-+
-+/** \brief Generic motion vector data structure. */
-+typedef struct _VAMotionVector {
-+ /** \mv0[0]: horizontal motion vector for past reference */
-+ /** \mv0[1]: vertical motion vector for past reference */
-+ /** \mv1[0]: horizontal motion vector for future reference */
-+ /** \mv1[1]: vertical motion vector for future reference */
-+ int16_t mv0[2]; /* past reference */
-+ int16_t mv1[2]; /* future reference */
-+} VAMotionVector;
-+
-+/** Type of a message callback, used for both error and info log. */
-+typedef void (*VAMessageCallback)(void *user_context, const char *message);
-+
-+/**
-+ * Set the callback for error messages, or NULL for no logging.
-+ * Returns the previous one, or NULL if it was disabled.
-+ */
-+VAMessageCallback vaSetErrorCallback(VADisplay dpy, VAMessageCallback callback, void *user_context);
-+
-+/**
-+ * Set the callback for info messages, or NULL for no logging.
-+ * Returns the previous one, or NULL if it was disabled.
-+ */
-+VAMessageCallback vaSetInfoCallback(VADisplay dpy, VAMessageCallback callback, void *user_context);
-+
-+/**
-+ * Initialization:
-+ * A display must be obtained by calling vaGetDisplay() before calling
-+ * vaInitialize() and other functions. This connects the API to the
-+ * native window system.
-+ * For X Windows, native_dpy would be from XOpenDisplay()
-+ */
-+typedef void* VANativeDisplay; /* window system dependent */
-+
-+int vaDisplayIsValid(VADisplay dpy);
-+
-+/**
-+ * Set the override driver name instead of queried driver driver.
-+ */
-+VAStatus vaSetDriverName(VADisplay dpy,
-+ char *driver_name
-+);
-+
-+/**
-+ * Initialize the library
-+ */
-+VAStatus vaInitialize (
-+ VADisplay dpy,
-+ int *major_version, /* out */
-+ int *minor_version /* out */
-+);
-+
-+/**
-+ * After this call, all library internal resources will be cleaned up
-+ */
-+VAStatus vaTerminate (
-+ VADisplay dpy
-+);
-+
-+/**
-+ * vaQueryVendorString returns a pointer to a zero-terminated string
-+ * describing some aspects of the VA implemenation on a specific
-+ * hardware accelerator. The format of the returned string is vendor
-+ * specific and at the discretion of the implementer.
-+ * e.g. for the Intel GMA500 implementation, an example would be:
-+ * "Intel GMA500 - 2.0.0.32L.0005"
-+ */
-+const char *vaQueryVendorString (
-+ VADisplay dpy
-+);
-+
-+typedef int (*VAPrivFunc)(void);
-+
-+/**
-+ * Return a function pointer given a function name in the library.
-+ * This allows private interfaces into the library
-+ */
-+VAPrivFunc vaGetLibFunc (
-+ VADisplay dpy,
-+ const char *func
-+);
-+
-+/** Currently defined profiles */
-+typedef enum
-+{
-+ /** \brief Profile ID used for video processing. */
-+ VAProfileNone = -1,
-+ VAProfileMPEG2Simple = 0,
-+ VAProfileMPEG2Main = 1,
-+ VAProfileMPEG4Simple = 2,
-+ VAProfileMPEG4AdvancedSimple = 3,
-+ VAProfileMPEG4Main = 4,
-+ VAProfileH264Baseline va_deprecated_enum = 5,
-+ VAProfileH264Main = 6,
-+ VAProfileH264High = 7,
-+ VAProfileVC1Simple = 8,
-+ VAProfileVC1Main = 9,
-+ VAProfileVC1Advanced = 10,
-+ VAProfileH263Baseline = 11,
-+ VAProfileJPEGBaseline = 12,
-+ VAProfileH264ConstrainedBaseline = 13,
-+ VAProfileVP8Version0_3 = 14,
-+ VAProfileH264MultiviewHigh = 15,
-+ VAProfileH264StereoHigh = 16,
-+ VAProfileHEVCMain = 17,
-+ VAProfileHEVCMain10 = 18,
-+ VAProfileVP9Profile0 = 19,
-+ VAProfileVP9Profile1 = 20,
-+ VAProfileVP9Profile2 = 21,
-+ VAProfileVP9Profile3 = 22,
-+ VAProfileHEVCMain12 = 23,
-+ VAProfileHEVCMain422_10 = 24,
-+ VAProfileHEVCMain422_12 = 25,
-+ VAProfileHEVCMain444 = 26,
-+ VAProfileHEVCMain444_10 = 27,
-+ VAProfileHEVCMain444_12 = 28,
-+ VAProfileHEVCSccMain = 29,
-+ VAProfileHEVCSccMain10 = 30,
-+ VAProfileHEVCSccMain444 = 31
-+} VAProfile;
-+
-+/**
-+ * Currently defined entrypoints
-+ */
-+typedef enum
-+{
-+ VAEntrypointVLD = 1,
-+ VAEntrypointIZZ = 2,
-+ VAEntrypointIDCT = 3,
-+ VAEntrypointMoComp = 4,
-+ VAEntrypointDeblocking = 5,
-+ VAEntrypointEncSlice = 6, /* slice level encode */
-+ VAEntrypointEncPicture = 7, /* pictuer encode, JPEG, etc */
-+ /*
-+ * For an implementation that supports a low power/high performance variant
-+ * for slice level encode, it can choose to expose the
-+ * VAEntrypointEncSliceLP entrypoint. Certain encoding tools may not be
-+ * available with this entrypoint (e.g. interlace, MBAFF) and the
-+ * application can query the encoding configuration attributes to find
-+ * out more details if this entrypoint is supported.
-+ */
-+ VAEntrypointEncSliceLP = 8,
-+ VAEntrypointVideoProc = 10, /**< Video pre/post-processing. */
-+ /**
-+ * \brief VAEntrypointFEI
-+ *
-+ * The purpose of FEI (Flexible Encoding Infrastructure) is to allow applications to
-+ * have more controls and trade off quality for speed with their own IPs.
-+ * The application can optionally provide input to ENC for extra encode control
-+ * and get the output from ENC. Application can chose to modify the ENC
-+ * output/PAK input during encoding, but the performance impact is significant.
-+ *
-+ * On top of the existing buffers for normal encode, there will be
-+ * one extra input buffer (VAEncMiscParameterFEIFrameControl) and
-+ * three extra output buffers (VAEncFEIMVBufferType, VAEncFEIMBModeBufferType
-+ * and VAEncFEIDistortionBufferType) for VAEntrypointFEI entry function.
-+ * If separate PAK is set, two extra input buffers
-+ * (VAEncFEIMVBufferType, VAEncFEIMBModeBufferType) are needed for PAK input.
-+ **/
-+ VAEntrypointFEI = 11,
-+ /**
-+ * \brief VAEntrypointStats
-+ *
-+ * A pre-processing function for getting some statistics and motion vectors is added,
-+ * and some extra controls for Encode pipeline are provided. The application can
-+ * optionally call the statistics function to get motion vectors and statistics like
-+ * variances, distortions before calling Encode function via this entry point.
-+ *
-+ * Checking whether Statistics is supported can be performed with vaQueryConfigEntrypoints().
-+ * If Statistics entry point is supported, then the list of returned entry-points will
-+ * include #VAEntrypointStats. Supported pixel format, maximum resolution and statistics
-+ * specific attributes can be obtained via normal attribute query. One input buffer
-+ * (VAStatsStatisticsParameterBufferType) and one or two output buffers
-+ * (VAStatsStatisticsBufferType, VAStatsStatisticsBottomFieldBufferType (for interlace only)
-+ * and VAStatsMVBufferType) are needed for this entry point.
-+ **/
-+ VAEntrypointStats = 12,
-+} VAEntrypoint;
-+
-+/** Currently defined configuration attribute types */
-+typedef enum
-+{
-+ VAConfigAttribRTFormat = 0,
-+ VAConfigAttribSpatialResidual = 1,
-+ VAConfigAttribSpatialClipping = 2,
-+ VAConfigAttribIntraResidual = 3,
-+ VAConfigAttribEncryption = 4,
-+ VAConfigAttribRateControl = 5,
-+
-+ /** @name Attributes for decoding */
-+ /**@{*/
-+ /**
-+ * \brief Slice Decoding mode. Read/write.
-+ *
-+ * This attribute determines what mode the driver supports for slice
-+ * decoding, through vaGetConfigAttributes(); and what mode the user
-+ * will be providing to the driver, through vaCreateConfig(), if the
-+ * driver supports those. If this attribute is not set by the user then
-+ * it is assumed that VA_DEC_SLICE_MODE_NORMAL mode is used.
-+ *
-+ * See \c VA_DEC_SLICE_MODE_xxx for the list of slice decoding modes.
-+ */
-+ VAConfigAttribDecSliceMode = 6,
-+ /**
-+ * \brief JPEG decoding attribute. Read-only.
-+ *
-+ * This attribute exposes a number of capabilities of the underlying
-+ * JPEG implementation. The attribute value is partitioned into fields as defined in the
-+ * VAConfigAttribValDecJPEG union.
-+ */
-+ VAConfigAttribDecJPEG = 7,
-+ /**
-+ * \brief Decode processing support. Read/write.
-+ *
-+ * This attribute determines if the driver supports video processing
-+ * with decoding using the decoding context in a single call, through
-+ * vaGetConfigAttributes(); and if the user may use this feature,
-+ * through vaCreateConfig(), if the driver supports the user scenario.
-+ * The user will essentially create a regular decode VAContext. Therefore,
-+ * the parameters of vaCreateContext() such as picture_width, picture_height
-+ * and render_targets are in relation to the decode output parameters
-+ * (not processing output parameters) as normal.
-+ * If this attribute is not set by the user then it is assumed that no
-+ * extra processing is done after decoding for this decode context.
-+ *
-+ * Since essentially the application is creating a decoder config and context,
-+ * all function calls that take in the config (e.g. vaQuerySurfaceAttributes())
-+ * or context are in relation to the decoder, except those video processing
-+ * function specified in the next paragraph.
-+ *
-+ * Once the decode config and context are created, the user must further
-+ * query the supported processing filters using vaQueryVideoProcFilters(),
-+ * vaQueryVideoProcFilterCaps(), vaQueryVideoProcPipelineCaps() by specifying
-+ * the created decode context. The user must provide processing information
-+ * and extra processing output surfaces as "additional_outputs" to the driver
-+ * through VAProcPipelineParameterBufferType. The render_target specified
-+ * at vaBeginPicture() time refers to the decode output surface. The
-+ * target surface for the output of processing needs to be a different
-+ * surface since the decode process requires the original reconstructed buffer.
-+ * The “surface” member of VAProcPipelineParameterBuffer should be set to the
-+ * same as “render_target” set in vaBeginPicture(), but the driver may choose
-+ * to ignore this parameter.
-+ */
-+ VAConfigAttribDecProcessing = 8,
-+ /** @name Attributes for encoding */
-+ /**@{*/
-+ /**
-+ * \brief Packed headers mode. Read/write.
-+ *
-+ * This attribute determines what packed headers the driver supports,
-+ * through vaGetConfigAttributes(); and what packed headers the user
-+ * will be providing to the driver, through vaCreateConfig(), if the
-+ * driver supports those.
-+ *
-+ * See \c VA_ENC_PACKED_HEADER_xxx for the list of packed headers.
-+ */
-+ VAConfigAttribEncPackedHeaders = 10,
-+ /**
-+ * \brief Interlaced mode. Read/write.
-+ *
-+ * This attribute determines what kind of interlaced encoding mode
-+ * the driver supports.
-+ *
-+ * See \c VA_ENC_INTERLACED_xxx for the list of interlaced modes.
-+ */
-+ VAConfigAttribEncInterlaced = 11,
-+ /**
-+ * \brief Maximum number of reference frames. Read-only.
-+ *
-+ * This attribute determines the maximum number of reference
-+ * frames supported for encoding.
-+ *
-+ * Note: for H.264 encoding, the value represents the maximum number
-+ * of reference frames for both the reference picture list 0 (bottom
-+ * 16 bits) and the reference picture list 1 (top 16 bits).
-+ */
-+ VAConfigAttribEncMaxRefFrames = 13,
-+ /**
-+ * \brief Maximum number of slices per frame. Read-only.
-+ *
-+ * This attribute determines the maximum number of slices the
-+ * driver can support to encode a single frame.
-+ */
-+ VAConfigAttribEncMaxSlices = 14,
-+ /**
-+ * \brief Slice structure. Read-only.
-+ *
-+ * This attribute determines slice structures supported by the
-+ * driver for encoding. This attribute is a hint to the user so
-+ * that he can choose a suitable surface size and how to arrange
-+ * the encoding process of multiple slices per frame.
-+ *
-+ * More specifically, for H.264 encoding, this attribute
-+ * determines the range of accepted values to
-+ * VAEncSliceParameterBufferH264::macroblock_address and
-+ * VAEncSliceParameterBufferH264::num_macroblocks.
-+ *
-+ * See \c VA_ENC_SLICE_STRUCTURE_xxx for the supported slice
-+ * structure types.
-+ */
-+ VAConfigAttribEncSliceStructure = 15,
-+ /**
-+ * \brief Macroblock information. Read-only.
-+ *
-+ * This attribute determines whether the driver supports extra
-+ * encoding information per-macroblock. e.g. QP.
-+ *
-+ * More specifically, for H.264 encoding, if the driver returns a non-zero
-+ * value for this attribute, this means the application can create
-+ * additional #VAEncMacroblockParameterBufferH264 buffers referenced
-+ * through VAEncSliceParameterBufferH264::macroblock_info.
-+ */
-+ VAConfigAttribEncMacroblockInfo = 16,
-+ /**
-+ * \brief Maximum picture width. Read-only.
-+ *
-+ * This attribute determines the maximum picture width the driver supports
-+ * for a given configuration.
-+ */
-+ VAConfigAttribMaxPictureWidth = 18,
-+ /**
-+ * \brief Maximum picture height. Read-only.
-+ *
-+ * This attribute determines the maximum picture height the driver supports
-+ * for a given configuration.
-+ */
-+ VAConfigAttribMaxPictureHeight = 19,
-+ /**
-+ * \brief JPEG encoding attribute. Read-only.
-+ *
-+ * This attribute exposes a number of capabilities of the underlying
-+ * JPEG implementation. The attribute value is partitioned into fields as defined in the
-+ * VAConfigAttribValEncJPEG union.
-+ */
-+ VAConfigAttribEncJPEG = 20,
-+ /**
-+ * \brief Encoding quality range attribute. Read-only.
-+ *
-+ * This attribute conveys whether the driver supports different quality level settings
-+ * for encoding. A value less than or equal to 1 means that the encoder only has a single
-+ * quality setting, and a value greater than 1 represents the number of quality levels
-+ * that can be configured. e.g. a value of 2 means there are two distinct quality levels.
-+ */
-+ VAConfigAttribEncQualityRange = 21,
-+ /**
-+ * \brief Encoding quantization attribute. Read-only.
-+ *
-+ * This attribute conveys whether the driver supports certain types of quantization methods
-+ * for encoding (e.g. trellis). See \c VA_ENC_QUANTIZATION_xxx for the list of quantization methods
-+ */
-+ VAConfigAttribEncQuantization = 22,
-+ /**
-+ * \brief Encoding intra refresh attribute. Read-only.
-+ *
-+ * This attribute conveys whether the driver supports certain types of intra refresh methods
-+ * for encoding (e.g. adaptive intra refresh or rolling intra refresh).
-+ * See \c VA_ENC_INTRA_REFRESH_xxx for intra refresh methods
-+ */
-+ VAConfigAttribEncIntraRefresh = 23,
-+ /**
-+ * \brief Encoding skip frame attribute. Read-only.
-+ *
-+ * This attribute conveys whether the driver supports sending skip frame parameters
-+ * (VAEncMiscParameterTypeSkipFrame) to the encoder's rate control, when the user has
-+ * externally skipped frames.
-+ */
-+ VAConfigAttribEncSkipFrame = 24,
-+ /**
-+ * \brief Encoding region-of-interest (ROI) attribute. Read-only.
-+ *
-+ * This attribute conveys whether the driver supports region-of-interest (ROI) encoding,
-+ * based on user provided ROI rectangles. The attribute value is partitioned into fields
-+ * as defined in the VAConfigAttribValEncROI union.
-+ *
-+ * If ROI encoding is supported, the ROI information is passed to the driver using
-+ * VAEncMiscParameterTypeROI.
-+ */
-+ VAConfigAttribEncROI = 25,
-+ /**
-+ * \brief Encoding extended rate control attribute. Read-only.
-+ *
-+ * This attribute conveys whether the driver supports any extended rate control features
-+ * The attribute value is partitioned into fields as defined in the
-+ * VAConfigAttribValEncRateControlExt union.
-+ */
-+ VAConfigAttribEncRateControlExt = 26,
-+ /**
-+ * \brief Processing rate reporting attribute. Read-only.
-+ *
-+ * This attribute conveys whether the driver supports reporting of
-+ * encode/decode processing rate based on certain set of parameters
-+ * (i.e. levels, I frame internvals) for a given configuration.
-+ * If this is supported, vaQueryProcessingRate() can be used to get
-+ * encode or decode processing rate.
-+ * See \c VA_PROCESSING_RATE_xxx for encode/decode processing rate
-+ */
-+ VAConfigAttribProcessingRate = 27,
-+ /**
-+ * \brief Encoding dirty rectangle. Read-only.
-+ *
-+ * This attribute conveys whether the driver supports dirty rectangle.
-+ * encoding, based on user provided ROI rectangles which indicate the rectangular areas
-+ * where the content has changed as compared to the previous picture. The regions of the
-+ * picture that are not covered by dirty rect rectangles are assumed to have not changed
-+ * compared to the previous picture. The encoder may do some optimizations based on
-+ * this information. The attribute value returned indicates the number of regions that
-+ * are supported. e.g. A value of 0 means dirty rect encoding is not supported. If dirty
-+ * rect encoding is supported, the ROI information is passed to the driver using
-+ * VAEncMiscParameterTypeDirtyRect.
-+ */
-+ VAConfigAttribEncDirtyRect = 28,
-+ /**
-+ * \brief Parallel Rate Control (hierachical B) attribute. Read-only.
-+ *
-+ * This attribute conveys whether the encoder supports parallel rate control.
-+ * It is a integer value 0 - unsupported, > 0 - maximum layer supported.
-+ * This is the way when hireachical B frames are encoded, multiple independent B frames
-+ * on the same layer may be processed at same time. If supported, app may enable it by
-+ * setting enable_parallel_brc in VAEncMiscParameterRateControl,and the number of B frames
-+ * per layer per GOP will be passed to driver through VAEncMiscParameterParallelRateControl
-+ * structure.Currently three layers are defined.
-+ */
-+ VAConfigAttribEncParallelRateControl = 29,
-+ /**
-+ * \brief Dynamic Scaling Attribute. Read-only.
-+ *
-+ * This attribute conveys whether encoder is capable to determine dynamic frame
-+ * resolutions adaptive to bandwidth utilization and processing power, etc.
-+ * It is a boolean value 0 - unsupported, 1 - supported.
-+ * If it is supported,for VP9, suggested frame resolution can be retrieved from VACodedBufferVP9Status.
-+ */
-+ VAConfigAttribEncDynamicScaling = 30,
-+ /**
-+ * \brief frame size tolerance support
-+ * it indicates the tolerance of frame size
-+ */
-+ VAConfigAttribFrameSizeToleranceSupport = 31,
-+ /**
-+ * \brief Encode function type for FEI.
-+ *
-+ * This attribute conveys whether the driver supports different function types for encode.
-+ * It can be VA_FEI_FUNCTION_ENC, VA_FEI_FUNCTION_PAK, or VA_FEI_FUNCTION_ENC_PAK. Currently
-+ * it is for FEI entry point only.
-+ * Default is VA_FEI_FUNCTION_ENC_PAK.
-+ */
-+ VAConfigAttribFEIFunctionType = 32,
-+ /**
-+ * \brief Maximum number of FEI MV predictors. Read-only.
-+ *
-+ * This attribute determines the maximum number of MV predictors the driver
-+ * can support to encode a single frame. 0 means no MV predictor is supported.
-+ * Currently it is for FEI entry point only.
-+ */
-+ VAConfigAttribFEIMVPredictors = 33,
-+ /**
-+ * \brief Statistics attribute. Read-only.
-+ *
-+ * This attribute exposes a number of capabilities of the VAEntrypointStats entry
-+ * point. The attribute value is partitioned into fields as defined in the
-+ * VAConfigAttribValStats union. Currently it is for VAEntrypointStats only.
-+ */
-+ VAConfigAttribStats = 34,
-+ /**
-+ * \brief Tile Support Attribute. Read-only.
-+ *
-+ * This attribute conveys whether encoder is capable to support tiles.
-+ * If not supported, the tile related parameters sent to encoder, such as
-+ * tiling structure, should be ignored. 0 - unsupported, 1 - supported.
-+ */
-+ VAConfigAttribEncTileSupport = 35,
-+ /**
-+ * \brief whether accept rouding setting from application. Read-only.
-+ * This attribute is for encode quality, if it is report,
-+ * application can change the rounding setting by VAEncMiscParameterTypeCustomRoundingControl
-+ */
-+ VAConfigAttribCustomRoundingControl = 36,
-+ /**
-+ * \brief Encoding QP info block size attribute. Read-only.
-+ * This attribute conveys the block sizes that underlying driver
-+ * support for QP info for buffer #VAEncQpBuffer.
-+ */
-+ VAConfigAttribQPBlockSize = 37,
-+ /**
-+ * \brief encode max frame size attribute. Read-only
-+ * attribute value \c VAConfigAttribValMaxFrameSize represent max frame size support
-+ */
-+ VAConfigAttribMaxFrameSize = 38,
-+ /** \brief inter frame prediction directrion attribute. Read-only.
-+ * this attribute conveys the prediction direction (backward or forword) for specific config
-+ * the value could be VA_PREDICTION_DIRECTION_XXXX. it can be combined with VAConfigAttribEncMaxRefFrames
-+ * to describe reference list , and the prediction direction. if this attrib is not present,both direction
-+ * should be supported, no restriction.
-+ * for example: normal HEVC encoding , maximum reference frame number in reflist 0 and reflist 1 is deduced
-+ * by VAConfigAttribEncMaxRefFrames. so there are typical P frame, B frame,
-+ * if VAConfigAttribPredictionDirection is also present. it will stipulate prediction direction in both
-+ * reference list. if only one prediction direction present(such as PREVIOUS),all reference frame should be
-+ * previous frame (PoC < current).
-+ */
-+ VAConfigAttribPredictionDirection = 39,
-+ /** \brief combined submission of multiple frames from different streams, it is optimization for different HW
-+ * implementation, multiple frames encode/decode can improve HW concurrency
-+ */
-+ VAConfigAttribMultipleFrame = 40,
-+ /**@}*/
-+ VAConfigAttribTypeMax
-+} VAConfigAttribType;
-+
-+/**
-+ * Configuration attributes
-+ * If there is more than one value for an attribute, a default
-+ * value will be assigned to the attribute if the client does not
-+ * specify the attribute when creating a configuration
-+ */
-+typedef struct _VAConfigAttrib {
-+ VAConfigAttribType type;
-+ uint32_t value; /* OR'd flags (bits) for this attribute */
-+} VAConfigAttrib;
-+
-+/* Attribute values for VAConfigAttribRTFormat. */
-+
-+#define VA_RT_FORMAT_YUV420 0x00000001 ///< YUV 4:2:0 8-bit.
-+#define VA_RT_FORMAT_YUV422 0x00000002 ///< YUV 4:2:2 8-bit.
-+#define VA_RT_FORMAT_YUV444 0x00000004 ///< YUV 4:4:4 8-bit.
-+#define VA_RT_FORMAT_YUV411 0x00000008 ///< YUV 4:1:1 8-bit.
-+#define VA_RT_FORMAT_YUV400 0x00000010 ///< Greyscale 8-bit.
-+#define VA_RT_FORMAT_YUV420_10 0x00000100 ///< YUV 4:2:0 10-bit.
-+#define VA_RT_FORMAT_YUV422_10 0x00000200 ///< YUV 4:2:2 10-bit.
-+#define VA_RT_FORMAT_YUV444_10 0x00000400 ///< YUV 4:4:4 10-bit.
-+#define VA_RT_FORMAT_YUV420_12 0x00001000 ///< YUV 4:2:0 12-bit.
-+#define VA_RT_FORMAT_YUV422_12 0x00002000 ///< YUV 4:2:2 12-bit.
-+#define VA_RT_FORMAT_YUV444_12 0x00004000 ///< YUV 4:4:4 12-bit.
-+
-+#define VA_RT_FORMAT_RGB16 0x00010000 ///< Packed RGB, 16 bits per pixel.
-+#define VA_RT_FORMAT_RGB32 0x00020000 ///< Packed RGB, 32 bits per pixel, 8 bits per colour sample.
-+#define VA_RT_FORMAT_RGBP 0x00100000 ///< Planar RGB, 8 bits per sample.
-+#define VA_RT_FORMAT_RGB32_10 0x00200000 ///< Packed RGB, 32 bits per pixel, 10 bits per colour sample.
-+
-+#define VA_RT_FORMAT_PROTECTED 0x80000000
-+
-+#define VA_RT_FORMAT_RGB32_10BPP VA_RT_FORMAT_RGB32_10 ///< @deprecated use VA_RT_FORMAT_RGB32_10 instead.
-+#define VA_RT_FORMAT_YUV420_10BPP VA_RT_FORMAT_YUV420_10 ///< @deprecated use VA_RT_FORMAT_YUV420_10 instead.
-+
-+/** @name Attribute values for VAConfigAttribRateControl */
-+/**@{*/
-+/** \brief Driver does not support any form of rate control. */
-+#define VA_RC_NONE 0x00000001
-+/** \brief Constant bitrate. */
-+#define VA_RC_CBR 0x00000002
-+/** \brief Variable bitrate. */
-+#define VA_RC_VBR 0x00000004
-+/** \brief Video conference mode. */
-+#define VA_RC_VCM 0x00000008
-+/** \brief Constant QP. */
-+#define VA_RC_CQP 0x00000010
-+/** \brief Variable bitrate with peak rate higher than average bitrate. */
-+#define VA_RC_VBR_CONSTRAINED 0x00000020
-+/** \brief Intelligent Constant Quality. Provided an initial ICQ_quality_factor,
-+ * adjusts QP at a frame and MB level based on motion to improve subjective quality. */
-+#define VA_RC_ICQ 0x00000040
-+/** \brief Macroblock based rate control. Per MB control is decided
-+ * internally in the encoder. It may be combined with other RC modes, except CQP. */
-+#define VA_RC_MB 0x00000080
-+/** \brief Constant Frame Size, it is used for small tolerent */
-+#define VA_RC_CFS 0x00000100
-+/** \brief Parallel BRC, for hierachical B.
-+ *
-+ * For hierachical B, B frames can be refered by other B frames.
-+ * Currently three layers of hierachy are defined:
-+ * B0 - regular B, no reference to other B frames.
-+ * B1 - reference to only I, P and regular B0 frames.
-+ * B2 - reference to any other frames, including B1.
-+ * In Hierachical B structure, B frames on the same layer can be processed
-+ * simultaneously. And BRC would adjust accordingly. This is so called
-+ * Parallel BRC. */
-+#define VA_RC_PARALLEL 0x00000200
-+/** \brief Quality defined VBR
-+ * Use Quality factor to determine the good enough QP for each MB such that
-+ * good enough quality can be obtained without waste of bits
-+ * for this BRC mode, you must set all legacy VBR parameters
-+ * and reuse quality_factor in \c VAEncMiscParameterRateControl
-+ * */
-+#define VA_RC_QVBR 0x00000400
-+/** \brief Average VBR
-+ * Average variable bitrate control algorithm focuses on overall encoding
-+ * quality while meeting the specified target bitrate, within the accuracy
-+ * range, after a convergence period.
-+ * bits_per_second in VAEncMiscParameterRateControl is target bitrate for AVBR.
-+ * Convergence is specified in the unit of frame.
-+ * window_size in VAEncMiscParameterRateControl is equal to convergence for AVBR.
-+ * Accuracy is in the range of [1,100], 1 means one percent, and so on.
-+ * target_percentage in VAEncMiscParameterRateControl is equal to accuracy for AVBR. */
-+#define VA_RC_AVBR 0x00000800
-+
-+/**@}*/
-+
-+/** @name Attribute values for VAConfigAttribDecSliceMode */
-+/**@{*/
-+/** \brief Driver supports normal mode for slice decoding */
-+#define VA_DEC_SLICE_MODE_NORMAL 0x00000001
-+/** \brief Driver supports base mode for slice decoding */
-+#define VA_DEC_SLICE_MODE_BASE 0x00000002
-+
-+/** @name Attribute values for VAConfigAttribDecJPEG */
-+/**@{*/
-+typedef union _VAConfigAttribValDecJPEG {
-+ struct {
-+ /** \brief Set to (1 << VA_ROTATION_xxx) for supported rotation angles. */
-+ uint32_t rotation : 4;
-+ /** \brief Reserved for future use. */
-+ uint32_t reserved : 28;
-+ } bits;
-+ uint32_t value;
-+} VAConfigAttribValDecJPEG;
-+/** @name Attribute values for VAConfigAttribDecProcessing */
-+/**@{*/
-+/** \brief No decoding + processing in a single decoding call. */
-+#define VA_DEC_PROCESSING_NONE 0x00000000
-+/** \brief Decode + processing in a single decoding call. */
-+#define VA_DEC_PROCESSING 0x00000001
-+/**@}*/
-+
-+/** @name Attribute values for VAConfigAttribEncPackedHeaders */
-+/**@{*/
-+/** \brief Driver does not support any packed headers mode. */
-+#define VA_ENC_PACKED_HEADER_NONE 0x00000000
-+/**
-+ * \brief Driver supports packed sequence headers. e.g. SPS for H.264.
-+ *
-+ * Application must provide it to driver once this flag is returned through
-+ * vaGetConfigAttributes()
-+ */
-+#define VA_ENC_PACKED_HEADER_SEQUENCE 0x00000001
-+/**
-+ * \brief Driver supports packed picture headers. e.g. PPS for H.264.
-+ *
-+ * Application must provide it to driver once this falg is returned through
-+ * vaGetConfigAttributes()
-+ */
-+#define VA_ENC_PACKED_HEADER_PICTURE 0x00000002
-+/**
-+ * \brief Driver supports packed slice headers. e.g. slice_header() for H.264.
-+ *
-+ * Application must provide it to driver once this flag is returned through
-+ * vaGetConfigAttributes()
-+ */
-+#define VA_ENC_PACKED_HEADER_SLICE 0x00000004
-+/**
-+ * \brief Driver supports misc packed headers. e.g. SEI for H.264.
-+ *
-+ * @deprecated
-+ * This is a deprecated packed header flag, All applications can use
-+ * \c VA_ENC_PACKED_HEADER_RAW_DATA to pass the corresponding packed
-+ * header data buffer to the driver
-+ */
-+#define VA_ENC_PACKED_HEADER_MISC 0x00000008
-+/** \brief Driver supports raw packed header, see VAEncPackedHeaderRawData */
-+#define VA_ENC_PACKED_HEADER_RAW_DATA 0x00000010
-+/**@}*/
-+
-+/** @name Attribute values for VAConfigAttribEncInterlaced */
-+/**@{*/
-+/** \brief Driver does not support interlaced coding. */
-+#define VA_ENC_INTERLACED_NONE 0x00000000
-+/** \brief Driver supports interlaced frame coding. */
-+#define VA_ENC_INTERLACED_FRAME 0x00000001
-+/** \brief Driver supports interlaced field coding. */
-+#define VA_ENC_INTERLACED_FIELD 0x00000002
-+/** \brief Driver supports macroblock adaptive frame field coding. */
-+#define VA_ENC_INTERLACED_MBAFF 0x00000004
-+/** \brief Driver supports picture adaptive frame field coding. */
-+#define VA_ENC_INTERLACED_PAFF 0x00000008
-+/**@}*/
-+
-+/** @name Attribute values for VAConfigAttribEncSliceStructure */
-+/**@{*/
-+/** \brief Driver supports a power-of-two number of rows per slice. */
-+#define VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS 0x00000001
-+/** \brief Driver supports an arbitrary number of macroblocks per slice. */
-+#define VA_ENC_SLICE_STRUCTURE_ARBITRARY_MACROBLOCKS 0x00000002
-+/** \brief Dirver support 1 rows per slice */
-+#define VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS 0x00000004
-+/** \brief Dirver support max encoded slice size per slice */
-+#define VA_ENC_SLICE_STRUCTURE_MAX_SLICE_SIZE 0x00000008
-+/** \brief Driver supports an arbitrary number of rows per slice. */
-+#define VA_ENC_SLICE_STRUCTURE_ARBITRARY_ROWS 0x00000010
-+/**@}*/
-+
-+/** \brief Attribute value for VAConfigAttribMaxFrameSize */
-+typedef union _VAConfigAttribValMaxFrameSize {
-+ struct {
-+ /** \brief support max frame size
-+ * if max_frame_size == 1, VAEncMiscParameterTypeMaxFrameSize/VAEncMiscParameterBufferMaxFrameSize
-+ * could be used to set the frame size, if multiple_pass also equal 1, VAEncMiscParameterTypeMultiPassFrameSize
-+ * VAEncMiscParameterBufferMultiPassFrameSize could be used to set frame size and pass information
-+ */
-+ uint32_t max_frame_size : 1;
-+ /** \brief multiple_pass support */
-+ uint32_t multiple_pass : 1;
-+ /** \brief reserved bits for future, must be zero*/
-+ uint32_t reserved :30;
-+ } bits;
-+ uint32_t value;
-+} VAConfigAttribValMaxFrameSize;
-+
-+/** \brief Attribute value for VAConfigAttribEncJPEG */
-+typedef union _VAConfigAttribValEncJPEG {
-+ struct {
-+ /** \brief set to 1 for arithmatic coding. */
-+ uint32_t arithmatic_coding_mode : 1;
-+ /** \brief set to 1 for progressive dct. */
-+ uint32_t progressive_dct_mode : 1;
-+ /** \brief set to 1 for non-interleaved. */
-+ uint32_t non_interleaved_mode : 1;
-+ /** \brief set to 1 for differential. */
-+ uint32_t differential_mode : 1;
-+ uint32_t max_num_components : 3;
-+ uint32_t max_num_scans : 4;
-+ uint32_t max_num_huffman_tables : 3;
-+ uint32_t max_num_quantization_tables : 3;
-+ } bits;
-+ uint32_t value;
-+} VAConfigAttribValEncJPEG;
-+
-+/** @name Attribute values for VAConfigAttribEncQuantization */
-+/**@{*/
-+/** \brief Driver does not support special types of quantization */
-+#define VA_ENC_QUANTIZATION_NONE 0x00000000
-+/** \brief Driver supports trellis quantization */
-+#define VA_ENC_QUANTIZATION_TRELLIS_SUPPORTED 0x00000001
-+/**@}*/
-+
-+/** @name Attribute values for VAConfigAttribPredictionDirection */
-+/**@{*/
-+/** \brief Driver support forward reference frame (inter frame for vpx, P frame for H26x MPEG)
-+ * can work with the VAConfigAttribEncMaxRefFrames. for example: low delay B frame of HEVC.
-+ * these value can be OR'd together. typical value should be VA_PREDICTION_DIRECTION_PREVIOUS
-+ * or VA_PREDICTION_DIRECTION_PREVIOUS | VA_PREDICTION_DIRECTION_FUTURE, theoretically, there
-+ * are no stream only include future reference frame.
-+ */
-+#define VA_PREDICTION_DIRECTION_PREVIOUS 0x00000001
-+/** \brief Driver support backward prediction frame/slice */
-+#define VA_PREDICTION_DIRECTION_FUTURE 0x00000002
-+/**@}*/
-+
-+/** @name Attribute values for VAConfigAttribEncIntraRefresh */
-+/**@{*/
-+/** \brief Driver does not support intra refresh */
-+#define VA_ENC_INTRA_REFRESH_NONE 0x00000000
-+/** \brief Driver supports column based rolling intra refresh */
-+#define VA_ENC_INTRA_REFRESH_ROLLING_COLUMN 0x00000001
-+/** \brief Driver supports row based rolling intra refresh */
-+#define VA_ENC_INTRA_REFRESH_ROLLING_ROW 0x00000002
-+/** \brief Driver supports adaptive intra refresh */
-+#define VA_ENC_INTRA_REFRESH_ADAPTIVE 0x00000010
-+/** \brief Driver supports cyclic intra refresh */
-+#define VA_ENC_INTRA_REFRESH_CYCLIC 0x00000020
-+/** \brief Driver supports intra refresh of P frame*/
-+#define VA_ENC_INTRA_REFRESH_P_FRAME 0x00010000
-+/** \brief Driver supports intra refresh of B frame */
-+#define VA_ENC_INTRA_REFRESH_B_FRAME 0x00020000
-+/** \brief Driver supports intra refresh of multiple reference encoder */
-+#define VA_ENC_INTRA_REFRESH_MULTI_REF 0x00040000
-+
-+/**@}*/
-+
-+/** \brief Attribute value for VAConfigAttribEncROI */
-+typedef union _VAConfigAttribValEncROI {
-+ struct {
-+ /** \brief The number of ROI regions supported, 0 if ROI is not supported. */
-+ uint32_t num_roi_regions : 8;
-+ /**
-+ * \brief A flag indicates whether ROI priority is supported
-+ *
-+ * \ref roi_rc_priority_support equal to 1 specifies the underlying driver supports
-+ * ROI priority when VAConfigAttribRateControl != VA_RC_CQP, user can use \c roi_value
-+ * in #VAEncROI to set ROI priority. \ref roi_rc_priority_support equal to 0 specifies
-+ * the underlying driver doesn't support ROI priority.
-+ *
-+ * User should ignore \ref roi_rc_priority_support when VAConfigAttribRateControl == VA_RC_CQP
-+ * because ROI delta QP is always required when VAConfigAttribRateControl == VA_RC_CQP.
-+ */
-+ uint32_t roi_rc_priority_support : 1;
-+ /**
-+ * \brief A flag indicates whether ROI delta QP is supported
-+ *
-+ * \ref roi_rc_qp_delta_support equal to 1 specifies the underlying driver supports
-+ * ROI delta QP when VAConfigAttribRateControl != VA_RC_CQP, user can use \c roi_value
-+ * in #VAEncROI to set ROI delta QP. \ref roi_rc_qp_delta_support equal to 0 specifies
-+ * the underlying driver doesn't support ROI delta QP.
-+ *
-+ * User should ignore \ref roi_rc_qp_delta_support when VAConfigAttribRateControl == VA_RC_CQP
-+ * because ROI delta QP is always required when VAConfigAttribRateControl == VA_RC_CQP.
-+ */
-+ uint32_t roi_rc_qp_delta_support : 1;
-+ uint32_t reserved : 22;
-+ } bits;
-+ uint32_t value;
-+} VAConfigAttribValEncROI;
-+
-+/** \brief Attribute value for VAConfigAttribEncRateControlExt */
-+typedef union _VAConfigAttribValEncRateControlExt {
-+ struct {
-+ /**
-+ * \brief The maximum number of temporal layers minus 1
-+ *
-+ * \ref max_num_temporal_layers_minus1 plus 1 specifies the maximum number of temporal
-+ * layers that supported by the underlying driver. \ref max_num_temporal_layers_minus1
-+ * equal to 0 implies the underlying driver doesn't support encoding with temporal layer.
-+ */
-+ uint32_t max_num_temporal_layers_minus1 : 8;
-+
-+ /**
-+ * /brief support temporal layer bit-rate control flag
-+ *
-+ * \ref temporal_layer_bitrate_control_flag equal to 1 specifies the underlying driver
-+ * can support bit-rate control per temporal layer when (#VAConfigAttribRateControl == #VA_RC_CBR ||
-+ * #VAConfigAttribRateControl == #VA_RC_VBR).
-+ *
-+ * The underlying driver must set \ref temporal_layer_bitrate_control_flag to 0 when
-+ * \c max_num_temporal_layers_minus1 is equal to 0
-+ *
-+ * To use bit-rate control per temporal layer, an application must send the right layer
-+ * structure via #VAEncMiscParameterTemporalLayerStructure at the beginning of a coded sequence
-+ * and then followed by #VAEncMiscParameterRateControl and #VAEncMiscParameterFrameRate structures
-+ * for each layer, using the \c temporal_id field as the layer identifier. Otherwise
-+ * the driver doesn't use bitrate control per temporal layer if an application doesn't send the
-+ * layer structure via #VAEncMiscParameterTemporalLayerStructure to the driver. The driver returns
-+ * VA_STATUS_ERROR_INVALID_PARAMETER if an application sends a wrong layer structure or doesn't send
-+ * #VAEncMiscParameterRateControl and #VAEncMiscParameterFrameRate for each layer.
-+ *
-+ * The driver will ignore #VAEncMiscParameterTemporalLayerStructure and the \c temporal_id field
-+ * in #VAEncMiscParameterRateControl and #VAEncMiscParameterFrameRate if
-+ * \ref temporal_layer_bitrate_control_flag is equal to 0 or #VAConfigAttribRateControl == #VA_RC_CQP
-+ */
-+ uint32_t temporal_layer_bitrate_control_flag : 1;
-+ uint32_t reserved : 23;
-+ } bits;
-+ uint32_t value;
-+} VAConfigAttribValEncRateControlExt;
-+
-+/** \brief Attribute value for VAConfigAttribMultipleFrame*/
-+typedef union _VAConfigAttribValMultipleFrame {
-+ struct {
-+ /** \brief max num of concurrent frames from different stream */
-+ uint32_t max_num_concurrent_frames : 8;
-+ /** \brief indicate whether all stream must support same quality level
-+ * if mixed_quality_level == 0, same quality level setting for multple streams is required
-+ * if mixed_quality_level == 1, different stream can have different quality level*/
-+ uint32_t mixed_quality_level : 1;
-+ /** \brief reserved bit for future, must be zero */
-+ uint32_t reserved : 23;
-+ } bits;
-+ uint32_t value;
-+}VAConfigAttribValMultipleFrame;
-+
-+/** @name Attribute values for VAConfigAttribProcessingRate. */
-+/**@{*/
-+/** \brief Driver does not support processing rate report */
-+#define VA_PROCESSING_RATE_NONE 0x00000000
-+/** \brief Driver supports encode processing rate report */
-+#define VA_PROCESSING_RATE_ENCODE 0x00000001
-+/** \brief Driver supports decode processing rate report */
-+#define VA_PROCESSING_RATE_DECODE 0x00000002
-+/**@}*/
-+/**
-+ * if an attribute is not applicable for a given
-+ * profile/entrypoint pair, then set the value to the following
-+ */
-+#define VA_ATTRIB_NOT_SUPPORTED 0x80000000
-+
-+/** Get maximum number of profiles supported by the implementation */
-+int vaMaxNumProfiles (
-+ VADisplay dpy
-+);
-+
-+/** Get maximum number of entrypoints supported by the implementation */
-+int vaMaxNumEntrypoints (
-+ VADisplay dpy
-+);
-+
-+/** Get maximum number of attributs supported by the implementation */
-+int vaMaxNumConfigAttributes (
-+ VADisplay dpy
-+);
-+
-+/**
-+ * Query supported profiles
-+ * The caller must provide a "profile_list" array that can hold at
-+ * least vaMaxNumProfile() entries. The actual number of profiles
-+ * returned in "profile_list" is returned in "num_profile".
-+ */
-+VAStatus vaQueryConfigProfiles (
-+ VADisplay dpy,
-+ VAProfile *profile_list, /* out */
-+ int *num_profiles /* out */
-+);
-+
-+/**
-+ * Query supported entrypoints for a given profile
-+ * The caller must provide an "entrypoint_list" array that can hold at
-+ * least vaMaxNumEntrypoints() entries. The actual number of entrypoints
-+ * returned in "entrypoint_list" is returned in "num_entrypoints".
-+ */
-+VAStatus vaQueryConfigEntrypoints (
-+ VADisplay dpy,
-+ VAProfile profile,
-+ VAEntrypoint *entrypoint_list, /* out */
-+ int *num_entrypoints /* out */
-+);
-+
-+/**
-+ * Get attributes for a given profile/entrypoint pair
-+ * The caller must provide an "attrib_list" with all attributes to be
-+ * retrieved. Upon return, the attributes in "attrib_list" have been
-+ * updated with their value. Unknown attributes or attributes that are
-+ * not supported for the given profile/entrypoint pair will have their
-+ * value set to VA_ATTRIB_NOT_SUPPORTED
-+ */
-+VAStatus vaGetConfigAttributes (
-+ VADisplay dpy,
-+ VAProfile profile,
-+ VAEntrypoint entrypoint,
-+ VAConfigAttrib *attrib_list, /* in/out */
-+ int num_attribs
-+);
-+
-+/** Generic ID type, can be re-typed for specific implementation */
-+typedef unsigned int VAGenericID;
-+
-+typedef VAGenericID VAConfigID;
-+
-+/**
-+ * Create a configuration for the video decode/encode/processing pipeline
-+ * it passes in the attribute list that specifies the attributes it cares
-+ * about, with the rest taking default values.
-+ */
-+VAStatus vaCreateConfig (
-+ VADisplay dpy,
-+ VAProfile profile,
-+ VAEntrypoint entrypoint,
-+ VAConfigAttrib *attrib_list,
-+ int num_attribs,
-+ VAConfigID *config_id /* out */
-+);
-+
-+/**
-+ * Free resources associdated with a given config
-+ */
-+VAStatus vaDestroyConfig (
-+ VADisplay dpy,
-+ VAConfigID config_id
-+);
-+
-+/**
-+ * Query all attributes for a given configuration
-+ * The profile of the configuration is returned in "profile"
-+ * The entrypoint of the configuration is returned in "entrypoint"
-+ * The caller must provide an "attrib_list" array that can hold at least
-+ * vaMaxNumConfigAttributes() entries. The actual number of attributes
-+ * returned in "attrib_list" is returned in "num_attribs"
-+ */
-+VAStatus vaQueryConfigAttributes (
-+ VADisplay dpy,
-+ VAConfigID config_id,
-+ VAProfile *profile, /* out */
-+ VAEntrypoint *entrypoint, /* out */
-+ VAConfigAttrib *attrib_list,/* out */
-+ int *num_attribs /* out */
-+);
-+
-+
-+/**
-+ * Contexts and Surfaces
-+ *
-+ * Context represents a "virtual" video decode, encode or video processing
-+ * pipeline. Surfaces are render targets for a given context. The data in the
-+ * surfaces are not accessible to the client except if derived image is supported
-+ * and the internal data format of the surface is implementation specific.
-+ *
-+ * Surfaces are provided as a hint of what surfaces will be used when the context
-+ * is created through vaCreateContext(). A surface may be used by different contexts
-+ * at the same time as soon as application can make sure the operations are synchronized
-+ * between different contexts, e.g. a surface is used as the output of a decode context
-+ * and the input of a video process context. Surfaces can only be destroyed after all
-+ * contexts using these surfaces have been destroyed.
-+ *
-+ * Both contexts and surfaces are identified by unique IDs and its
-+ * implementation specific internals are kept opaque to the clients
-+ */
-+
-+typedef VAGenericID VAContextID;
-+
-+typedef VAGenericID VASurfaceID;
-+
-+#define VA_INVALID_ID 0xffffffff
-+#define VA_INVALID_SURFACE VA_INVALID_ID
-+
-+/** \brief Generic value types. */
-+typedef enum {
-+ VAGenericValueTypeInteger = 1, /**< 32-bit signed integer. */
-+ VAGenericValueTypeFloat, /**< 32-bit floating-point value. */
-+ VAGenericValueTypePointer, /**< Generic pointer type */
-+ VAGenericValueTypeFunc /**< Pointer to function */
-+} VAGenericValueType;
-+
-+/** \brief Generic function type. */
-+typedef void (*VAGenericFunc)(void);
-+
-+/** \brief Generic value. */
-+typedef struct _VAGenericValue {
-+ /** \brief Value type. See #VAGenericValueType. */
-+ VAGenericValueType type;
-+ /** \brief Value holder. */
-+ union {
-+ /** \brief 32-bit signed integer. */
-+ int32_t i;
-+ /** \brief 32-bit float. */
-+ float f;
-+ /** \brief Generic pointer. */
-+ void *p;
-+ /** \brief Pointer to function. */
-+ VAGenericFunc fn;
-+ } value;
-+} VAGenericValue;
-+
-+/** @name Surface attribute flags */
-+/**@{*/
-+/** \brief Surface attribute is not supported. */
-+#define VA_SURFACE_ATTRIB_NOT_SUPPORTED 0x00000000
-+/** \brief Surface attribute can be got through vaQuerySurfaceAttributes(). */
-+#define VA_SURFACE_ATTRIB_GETTABLE 0x00000001
-+/** \brief Surface attribute can be set through vaCreateSurfaces(). */
-+#define VA_SURFACE_ATTRIB_SETTABLE 0x00000002
-+/**@}*/
-+
-+/** \brief Surface attribute types. */
-+typedef enum {
-+ VASurfaceAttribNone = 0,
-+ /**
-+ * \brief Pixel format (fourcc).
-+ *
-+ * The value is meaningful as input to vaQuerySurfaceAttributes().
-+ * If zero, the driver returns the optimal pixel format for the
-+ * specified config. Otherwise, if non-zero, the value represents
-+ * a pixel format (FOURCC) that is kept as is on output, if the
-+ * driver supports it. Otherwise, the driver sets the value to
-+ * zero and drops the \c VA_SURFACE_ATTRIB_SETTABLE flag.
-+ */
-+ VASurfaceAttribPixelFormat,
-+ /** \brief Minimal width in pixels (int, read-only). */
-+ VASurfaceAttribMinWidth,
-+ /** \brief Maximal width in pixels (int, read-only). */
-+ VASurfaceAttribMaxWidth,
-+ /** \brief Minimal height in pixels (int, read-only). */
-+ VASurfaceAttribMinHeight,
-+ /** \brief Maximal height in pixels (int, read-only). */
-+ VASurfaceAttribMaxHeight,
-+ /** \brief Surface memory type expressed in bit fields (int, read/write). */
-+ VASurfaceAttribMemoryType,
-+ /** \brief External buffer descriptor (pointer, write).
-+ *
-+ * Refer to the documentation for the memory type being created to
-+ * determine what descriptor structure to pass here. If not otherwise
-+ * stated, the common VASurfaceAttribExternalBuffers should be used.
-+ */
-+ VASurfaceAttribExternalBufferDescriptor,
-+ /** \brief Surface usage hint, gives the driver a hint of intended usage
-+ * to optimize allocation (e.g. tiling) (int, read/write). */
-+ VASurfaceAttribUsageHint,
-+ /** \brief Number of surface attributes. */
-+ VASurfaceAttribCount
-+} VASurfaceAttribType;
-+
-+/** \brief Surface attribute. */
-+typedef struct _VASurfaceAttrib {
-+ /** \brief Type. */
-+ VASurfaceAttribType type;
-+ /** \brief Flags. See "Surface attribute flags". */
-+ uint32_t flags;
-+ /** \brief Value. See "Surface attribute types" for the expected types. */
-+ VAGenericValue value;
-+} VASurfaceAttrib;
-+
-+/**
-+ * @name VASurfaceAttribMemoryType values in bit fields.
-+ * Bit 0:7 are reserved for generic types, Bit 31:28 are reserved for
-+ * Linux DRM, Bit 23:20 are reserved for Android. DRM and Android specific
-+ * types are defined in DRM and Android header files.
-+ */
-+/**@{*/
-+/** \brief VA memory type (default) is supported. */
-+#define VA_SURFACE_ATTRIB_MEM_TYPE_VA 0x00000001
-+/** \brief V4L2 buffer memory type is supported. */
-+#define VA_SURFACE_ATTRIB_MEM_TYPE_V4L2 0x00000002
-+/** \brief User pointer memory type is supported. */
-+#define VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR 0x00000004
-+/**@}*/
-+
-+/**
-+ * \brief VASurfaceAttribExternalBuffers structure for
-+ * the VASurfaceAttribExternalBufferDescriptor attribute.
-+ */
-+typedef struct _VASurfaceAttribExternalBuffers {
-+ /** \brief pixel format in fourcc. */
-+ uint32_t pixel_format;
-+ /** \brief width in pixels. */
-+ uint32_t width;
-+ /** \brief height in pixels. */
-+ uint32_t height;
-+ /** \brief total size of the buffer in bytes. */
-+ uint32_t data_size;
-+ /** \brief number of planes for planar layout */
-+ uint32_t num_planes;
-+ /** \brief pitch for each plane in bytes */
-+ uint32_t pitches[4];
-+ /** \brief offset for each plane in bytes */
-+ uint32_t offsets[4];
-+ /** \brief buffer handles or user pointers */
-+ uintptr_t *buffers;
-+ /** \brief number of elements in the "buffers" array */
-+ uint32_t num_buffers;
-+ /** \brief flags. See "Surface external buffer descriptor flags". */
-+ uint32_t flags;
-+ /** \brief reserved for passing private data */
-+ void *private_data;
-+} VASurfaceAttribExternalBuffers;
-+
-+/** @name VASurfaceAttribExternalBuffers flags */
-+/**@{*/
-+/** \brief Enable memory tiling */
-+#define VA_SURFACE_EXTBUF_DESC_ENABLE_TILING 0x00000001
-+/** \brief Memory is cacheable */
-+#define VA_SURFACE_EXTBUF_DESC_CACHED 0x00000002
-+/** \brief Memory is non-cacheable */
-+#define VA_SURFACE_EXTBUF_DESC_UNCACHED 0x00000004
-+/** \brief Memory is write-combined */
-+#define VA_SURFACE_EXTBUF_DESC_WC 0x00000008
-+/** \brief Memory is protected */
-+#define VA_SURFACE_EXTBUF_DESC_PROTECTED 0x80000000
-+
-+/** @name VASurfaceAttribUsageHint attribute usage hint flags */
-+/**@{*/
-+/** \brief Surface usage not indicated. */
-+#define VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC 0x00000000
-+/** \brief Surface used by video decoder. */
-+#define VA_SURFACE_ATTRIB_USAGE_HINT_DECODER 0x00000001
-+/** \brief Surface used by video encoder. */
-+#define VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER 0x00000002
-+/** \brief Surface read by video post-processing. */
-+#define VA_SURFACE_ATTRIB_USAGE_HINT_VPP_READ 0x00000004
-+/** \brief Surface written by video post-processing. */
-+#define VA_SURFACE_ATTRIB_USAGE_HINT_VPP_WRITE 0x00000008
-+/** \brief Surface used for display. */
-+#define VA_SURFACE_ATTRIB_USAGE_HINT_DISPLAY 0x00000010
-+/** \brief Surface used for export to third-party APIs, e.g. via
-+ * vaExportSurfaceHandle(). */
-+#define VA_SURFACE_ATTRIB_USAGE_HINT_EXPORT 0x00000020
-+
-+/**@}*/
-+
-+/**
-+ * \brief Queries surface attributes for the supplied config.
-+ *
-+ * This function queries for all supported attributes for the
-+ * supplied VA @config. In particular, if the underlying hardware
-+ * supports the creation of VA surfaces in various formats, then
-+ * this function will enumerate all pixel formats that are supported.
-+ *
-+ * The \c attrib_list array is allocated by the user and \c
-+ * num_attribs shall be initialized to the number of allocated
-+ * elements in that array. Upon successful return, the actual number
-+ * of attributes will be overwritten into \c num_attribs. Otherwise,
-+ * \c VA_STATUS_ERROR_MAX_NUM_EXCEEDED is returned and \c num_attribs
-+ * is adjusted to the number of elements that would be returned if
-+ * enough space was available.
-+ *
-+ * Note: it is perfectly valid to pass NULL to the \c attrib_list
-+ * argument when vaQuerySurfaceAttributes() is used to determine the
-+ * actual number of elements that need to be allocated.
-+ *
-+ * @param[in] dpy the VA display
-+ * @param[in] config the config identifying a codec or a video
-+ * processing pipeline
-+ * @param[out] attrib_list the output array of #VASurfaceAttrib elements
-+ * @param[in,out] num_attribs the number of elements allocated on
-+ * input, the number of elements actually filled in output
-+ */
-+VAStatus
-+vaQuerySurfaceAttributes(
-+ VADisplay dpy,
-+ VAConfigID config,
-+ VASurfaceAttrib *attrib_list,
-+ unsigned int *num_attribs
-+);
-+
-+/**
-+ * \brief Creates an array of surfaces
-+ *
-+ * Creates an array of surfaces. The optional list of attributes shall
-+ * be constructed based on what the underlying hardware could expose
-+ * through vaQuerySurfaceAttributes().
-+ *
-+ * @param[in] dpy the VA display
-+ * @param[in] format the desired surface format. See \c VA_RT_FORMAT_*
-+ * @param[in] width the surface width
-+ * @param[in] height the surface height
-+ * @param[out] surfaces the array of newly created surfaces
-+ * @param[in] num_surfaces the number of surfaces to create
-+ * @param[in] attrib_list the list of (optional) attributes, or \c NULL
-+ * @param[in] num_attribs the number of attributes supplied in
-+ * \c attrib_list, or zero
-+ */
-+VAStatus
-+vaCreateSurfaces(
-+ VADisplay dpy,
-+ unsigned int format,
-+ unsigned int width,
-+ unsigned int height,
-+ VASurfaceID *surfaces,
-+ unsigned int num_surfaces,
-+ VASurfaceAttrib *attrib_list,
-+ unsigned int num_attribs
-+);
-+
-+/**
-+ * vaDestroySurfaces - Destroy resources associated with surfaces.
-+ * Surfaces can only be destroyed after all contexts using these surfaces have been
-+ * destroyed.
-+ * dpy: display
-+ * surfaces: array of surfaces to destroy
-+ * num_surfaces: number of surfaces in the array to be destroyed.
-+ */
-+VAStatus vaDestroySurfaces (
-+ VADisplay dpy,
-+ VASurfaceID *surfaces,
-+ int num_surfaces
-+);
-+
-+#define VA_PROGRESSIVE 0x1
-+/**
-+ * vaCreateContext - Create a context
-+ * dpy: display
-+ * config_id: configuration for the context
-+ * picture_width: coded picture width
-+ * picture_height: coded picture height
-+ * flag: any combination of the following:
-+ * VA_PROGRESSIVE (only progressive frame pictures in the sequence when set)
-+ * render_targets: a hint for render targets (surfaces) tied to the context
-+ * num_render_targets: number of render targets in the above array
-+ * context: created context id upon return
-+ */
-+VAStatus vaCreateContext (
-+ VADisplay dpy,
-+ VAConfigID config_id,
-+ int picture_width,
-+ int picture_height,
-+ int flag,
-+ VASurfaceID *render_targets,
-+ int num_render_targets,
-+ VAContextID *context /* out */
-+);
-+
-+/**
-+ * vaDestroyContext - Destroy a context
-+ * dpy: display
-+ * context: context to be destroyed
-+ */
-+VAStatus vaDestroyContext (
-+ VADisplay dpy,
-+ VAContextID context
-+);
-+
-+//Multi-frame context
-+typedef VAGenericID VAMFContextID;
-+/**
-+ * vaCreateMFContext - Create a multi-frame context
-+ * interface encapsulating common for all streams memory objects and structures
-+ * required for single GPU task submission from several VAContextID's.
-+ * Allocation: This call only creates an instance, doesn't allocate any additional memory.
-+ * Support identification: Application can identify multi-frame feature support by ability
-+ * to create multi-frame context. If driver supports multi-frame - call successful,
-+ * mf_context != NULL and VAStatus = VA_STATUS_SUCCESS, otherwise if multi-frame processing
-+ * not supported driver returns VA_STATUS_ERROR_UNIMPLEMENTED and mf_context = NULL.
-+ * return values:
-+ * VA_STATUS_SUCCESS - operation successful.
-+ * VA_STATUS_ERROR_UNIMPLEMENTED - no support for multi-frame.
-+ * dpy: display adapter.
-+ * mf_context: Multi-Frame context encapsulating all associated context
-+ * for multi-frame submission.
-+ */
-+VAStatus vaCreateMFContext (
-+ VADisplay dpy,
-+ VAMFContextID *mf_context /* out */
-+);
-+
-+/**
-+ * vaMFAddContext - Provide ability to associate each context used for
-+ * Multi-Frame submission and common Multi-Frame context.
-+ * Try to add context to understand if it is supported.
-+ * Allocation: this call allocates and/or reallocates all memory objects
-+ * common for all contexts associated with particular Multi-Frame context.
-+ * All memory required for each context(pixel buffers, internal driver
-+ * buffers required for processing) allocated during standard vaCreateContext call for each context.
-+ * Runtime dependency - if current implementation doesn't allow to run different entry points/profile,
-+ * first context added will set entry point/profile for whole Multi-Frame context,
-+ * all other entry points and profiles can be rejected to be added.
-+ * Return values:
-+ * VA_STATUS_SUCCESS - operation successful, context was added.
-+ * VA_STATUS_ERROR_OPERATION_FAILED - something unexpected happened - application have to close
-+ * current mf_context and associated contexts and start working with new ones.
-+ * VA_STATUS_ERROR_INVALID_CONTEXT - ContextID is invalid, means:
-+ * 1 - mf_context is not valid context or
-+ * 2 - driver can't suport different VAEntrypoint or VAProfile simultaneosly
-+ * and current context contradicts with previously added, application can continue with current mf_context
-+ * and other contexts passed this call, rejected context can continue work in stand-alone
-+ * mode or other mf_context.
-+ * VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT - particular context being added was created with with
-+ * unsupported VAEntrypoint. Application can continue with current mf_context
-+ * and other contexts passed this call, rejected context can continue work in stand-alone
-+ * mode.
-+ * VA_STATUS_ERROR_UNSUPPORTED_PROFILE - Current context with Particular VAEntrypoint is supported
-+ * but VAProfile is not supported. Application can continue with current mf_context
-+ * and other contexts passed this call, rejected context can continue work in stand-alone
-+ * mode.
-+ * dpy: display adapter.
-+ * context: context being associated with Multi-Frame context.
-+ * mf_context: - multi-frame context used to associate contexts for multi-frame submission.
-+ */
-+VAStatus vaMFAddContext (
-+ VADisplay dpy,
-+ VAMFContextID mf_context,
-+ VAContextID context
-+);
-+
-+/**
-+ * vaMFReleaseContext - Removes context from multi-frame and
-+ * association with multi-frame context.
-+ * After association removed vaEndPicture will submit tasks, but not vaMFSubmit.
-+ * Return values:
-+ * VA_STATUS_SUCCESS - operation successful, context was removed.
-+ * VA_STATUS_ERROR_OPERATION_FAILED - something unexpected happened.
-+ * application need to destroy this VAMFContextID and all assotiated VAContextID
-+ * dpy: display
-+ * mf_context: VAMFContextID where context is added
-+ * context: VAContextID to be added
-+ */
-+VAStatus vaMFReleaseContext (
-+ VADisplay dpy,
-+ VAMFContextID mf_context,
-+ VAContextID context
-+);
-+
-+/**
-+ * Buffers
-+ * Buffers are used to pass various types of data from the
-+ * client to the server. The server maintains a data store
-+ * for each buffer created, and the client idenfies a buffer
-+ * through a unique buffer id assigned by the server.
-+ */
-+
-+typedef VAGenericID VABufferID;
-+
-+typedef enum
-+{
-+ VAPictureParameterBufferType = 0,
-+ VAIQMatrixBufferType = 1,
-+ VABitPlaneBufferType = 2,
-+ VASliceGroupMapBufferType = 3,
-+ VASliceParameterBufferType = 4,
-+ VASliceDataBufferType = 5,
-+ VAMacroblockParameterBufferType = 6,
-+ VAResidualDataBufferType = 7,
-+ VADeblockingParameterBufferType = 8,
-+ VAImageBufferType = 9,
-+ VAProtectedSliceDataBufferType = 10,
-+ VAQMatrixBufferType = 11,
-+ VAHuffmanTableBufferType = 12,
-+ VAProbabilityBufferType = 13,
-+
-+/* Following are encode buffer types */
-+ VAEncCodedBufferType = 21,
-+ VAEncSequenceParameterBufferType = 22,
-+ VAEncPictureParameterBufferType = 23,
-+ VAEncSliceParameterBufferType = 24,
-+ VAEncPackedHeaderParameterBufferType = 25,
-+ VAEncPackedHeaderDataBufferType = 26,
-+ VAEncMiscParameterBufferType = 27,
-+ VAEncMacroblockParameterBufferType = 28,
-+ VAEncMacroblockMapBufferType = 29,
-+
-+ /**
-+ * \brief Encoding QP buffer
-+ *
-+ * This buffer contains QP per MB for encoding. Currently
-+ * VAEncQPBufferH264 is defined for H.264 encoding, see
-+ * #VAEncQPBufferH264 for details
-+ */
-+ VAEncQPBufferType = 30,
-+/* Following are video processing buffer types */
-+ /**
-+ * \brief Video processing pipeline parameter buffer.
-+ *
-+ * This buffer describes the video processing pipeline. See
-+ * #VAProcPipelineParameterBuffer for details.
-+ */
-+ VAProcPipelineParameterBufferType = 41,
-+ /**
-+ * \brief Video filter parameter buffer.
-+ *
-+ * This buffer describes the video filter parameters. All buffers
-+ * inherit from #VAProcFilterParameterBufferBase, thus including
-+ * a unique filter buffer type.
-+ *
-+ * The default buffer used by most filters is #VAProcFilterParameterBuffer.
-+ * Filters requiring advanced parameters include, but are not limited to,
-+ * deinterlacing (#VAProcFilterParameterBufferDeinterlacing),
-+ * color balance (#VAProcFilterParameterBufferColorBalance), etc.
-+ */
-+ VAProcFilterParameterBufferType = 42,
-+ /**
-+ * \brief FEI specific buffer types
-+ */
-+ VAEncFEIMVBufferType = 43,
-+ VAEncFEIMBCodeBufferType = 44,
-+ VAEncFEIDistortionBufferType = 45,
-+ VAEncFEIMBControlBufferType = 46,
-+ VAEncFEIMVPredictorBufferType = 47,
-+ VAStatsStatisticsParameterBufferType = 48,
-+ /** \brief Statistics output for VAEntrypointStats progressive and top field of interlaced case*/
-+ VAStatsStatisticsBufferType = 49,
-+ /** \brief Statistics output for VAEntrypointStats bottom field of interlaced case*/
-+ VAStatsStatisticsBottomFieldBufferType = 50,
-+ VAStatsMVBufferType = 51,
-+ VAStatsMVPredictorBufferType = 52,
-+ /** Force MB's to be non skip for encode.it's per-mb control buffer, The width of the MB map
-+ * Surface is (width of the Picture in MB unit) * 1 byte, multiple of 64 bytes.
-+ * The height is (height of the picture in MB unit). The picture is either
-+ * frame or non-interleaved top or bottom field. If the application provides this
-+ *surface, it will override the "skipCheckDisable" setting in VAEncMiscParameterEncQuality.
-+ */
-+ VAEncMacroblockDisableSkipMapBufferType = 53,
-+ /**
-+ * \brief HEVC FEI CTB level cmd buffer
-+ * it is CTB level information for future usage.
-+ */
-+ VAEncFEICTBCmdBufferType = 54,
-+ /**
-+ * \brief HEVC FEI CU level data buffer
-+ * it's CTB level information for future usage
-+ */
-+ VAEncFEICURecordBufferType = 55,
-+ /** decode stream out buffer, intermedia data of decode, it may include MV, MB mode etc.
-+ * it can be used to detect motion and analyze the frame contain */
-+ VADecodeStreamoutBufferType = 56,
-+
-+ /** \brief HEVC Decoding Subset Parameter buffer type
-+ *
-+ * The subsets parameter buffer is concatenation with one or multiple
-+ * subset entry point offsets. All the offset values are layed out one
-+ * by one according to slice order with first slice segment first, second
-+ * slice segment second, etc... The entry number is indicated by parameter
-+ * \ref num_entry_point_offsets. And the first entry position of the entry
-+ * point offsets for any slice segment is indicated by parameter
-+ * entry_offset_to_subset_array in VAPictureParameterBufferHEVC data structure.
-+ */
-+ VASubsetsParameterBufferType = 57,
-+
-+ VABufferTypeMax
-+} VABufferType;
-+
-+/**
-+ * Processing rate parameter for encode.
-+ */
-+typedef struct _VAProcessingRateParameterEnc {
-+ /** \brief Profile level */
-+ uint8_t level_idc;
-+ uint8_t reserved[3];
-+ /** \brief quality level. When set to 0, default quality
-+ * level is used.
-+ */
-+ uint32_t quality_level;
-+ /** \brief Period between I frames. */
-+ uint32_t intra_period;
-+ /** \brief Period between I/P frames. */
-+ uint32_t ip_period;
-+} VAProcessingRateParameterEnc;
-+
-+/**
-+ * Processing rate parameter for decode.
-+ */
-+typedef struct _VAProcessingRateParameterDec {
-+ /** \brief Profile level */
-+ uint8_t level_idc;
-+ uint8_t reserved0[3];
-+ uint32_t reserved;
-+} VAProcessingRateParameterDec;
-+
-+typedef struct _VAProcessingRateParameter {
-+ union {
-+ VAProcessingRateParameterEnc proc_buf_enc;
-+ VAProcessingRateParameterDec proc_buf_dec;
-+ };
-+} VAProcessingRateParameter;
-+
-+/**
-+ * \brief Queries processing rate for the supplied config.
-+ *
-+ * This function queries the processing rate based on parameters in
-+ * \c proc_buf for the given \c config. Upon successful return, the processing
-+ * rate value will be stored in \c processing_rate. Processing rate is
-+ * specified as the number of macroblocks/CTU per second.
-+ *
-+ * If NULL is passed to the \c proc_buf, the default processing rate for the
-+ * given configuration will be returned.
-+ *
-+ * @param[in] dpy the VA display
-+ * @param[in] config the config identifying a codec or a video
-+ * processing pipeline
-+ * @param[in] proc_buf the buffer that contains the parameters for
-+ either the encode or decode processing rate
-+ * @param[out] processing_rate processing rate in number of macroblocks per
-+ second constrained by parameters specified in proc_buf
-+ *
-+ */
-+VAStatus
-+vaQueryProcessingRate(
-+ VADisplay dpy,
-+ VAConfigID config,
-+ VAProcessingRateParameter *proc_buf,
-+ unsigned int *processing_rate
-+);
-+
-+typedef enum
-+{
-+ VAEncMiscParameterTypeFrameRate = 0,
-+ VAEncMiscParameterTypeRateControl = 1,
-+ VAEncMiscParameterTypeMaxSliceSize = 2,
-+ VAEncMiscParameterTypeAIR = 3,
-+ /** \brief Buffer type used to express a maximum frame size (in bits). */
-+ VAEncMiscParameterTypeMaxFrameSize = 4,
-+ /** \brief Buffer type used for HRD parameters. */
-+ VAEncMiscParameterTypeHRD = 5,
-+ VAEncMiscParameterTypeQualityLevel = 6,
-+ /** \brief Buffer type used for Rolling intra refresh */
-+ VAEncMiscParameterTypeRIR = 7,
-+ /** \brief Buffer type used for quantization parameters, it's per-sequence parameter*/
-+ VAEncMiscParameterTypeQuantization = 8,
-+ /** \brief Buffer type used for sending skip frame parameters to the encoder's
-+ * rate control, when the user has externally skipped frames. */
-+ VAEncMiscParameterTypeSkipFrame = 9,
-+ /** \brief Buffer type used for region-of-interest (ROI) parameters. */
-+ VAEncMiscParameterTypeROI = 10,
-+ /** \brief Buffer type used to express a maximum frame size (in bytes) settings for multiple pass. */
-+ VAEncMiscParameterTypeMultiPassFrameSize = 11,
-+ /** \brief Buffer type used for temporal layer structure */
-+ VAEncMiscParameterTypeTemporalLayerStructure = 12,
-+ /** \brief Buffer type used for dirty region-of-interest (ROI) parameters. */
-+ VAEncMiscParameterTypeDirtyRect = 13,
-+ /** \brief Buffer type used for parallel BRC parameters. */
-+ VAEncMiscParameterTypeParallelBRC = 14,
-+ /** \brief Set MB partion mode mask and Half-pel/Quant-pel motion search */
-+ VAEncMiscParameterTypeSubMbPartPel = 15,
-+ /** \brief set encode quality tuning */
-+ VAEncMiscParameterTypeEncQuality = 16,
-+ /** \brief Buffer type used for encoder rounding offset parameters. */
-+ VAEncMiscParameterTypeCustomRoundingControl = 17,
-+ /** \brief Buffer type used for FEI input frame level parameters */
-+ VAEncMiscParameterTypeFEIFrameControl = 18,
-+ /** \brief encode extension buffer, ect. MPEG2 Sequence extenstion data */
-+ VAEncMiscParameterTypeExtensionData = 19
-+} VAEncMiscParameterType;
-+
-+/** \brief Packed header type. */
-+typedef enum {
-+ /** \brief Packed sequence header. */
-+ VAEncPackedHeaderSequence = 1,
-+ /** \brief Packed picture header. */
-+ VAEncPackedHeaderPicture = 2,
-+ /** \brief Packed slice header. */
-+ VAEncPackedHeaderSlice = 3,
-+ /**
-+ * \brief Packed raw header.
-+ *
-+ * Packed raw data header can be used by the client to insert a header
-+ * into the bitstream data buffer at the point it is passed, the driver
-+ * will handle the raw packed header based on "has_emulation_bytes" field
-+ * in the packed header parameter structure.
-+ */
-+ VAEncPackedHeaderRawData = 4,
-+ /**
-+ * \brief Misc packed header. See codec-specific definitions.
-+ *
-+ * @deprecated
-+ * This is a deprecated packed header type. All applications can use
-+ * \c VAEncPackedHeaderRawData to insert a codec-specific packed header
-+ */
-+ VAEncPackedHeaderMiscMask va_deprecated_enum = 0x80000000,
-+} VAEncPackedHeaderType;
-+
-+/** \brief Packed header parameter. */
-+typedef struct _VAEncPackedHeaderParameterBuffer {
-+ /** Type of the packed header buffer. See #VAEncPackedHeaderType. */
-+ uint32_t type;
-+ /** \brief Size of the #VAEncPackedHeaderDataBuffer in bits. */
-+ uint32_t bit_length;
-+ /** \brief Flag: buffer contains start code emulation prevention bytes? */
-+ uint8_t has_emulation_bytes;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncPackedHeaderParameterBuffer;
-+
-+/**
-+ * For application, e.g. set a new bitrate
-+ * VABufferID buf_id;
-+ * VAEncMiscParameterBuffer *misc_param;
-+ * VAEncMiscParameterRateControl *misc_rate_ctrl;
-+ *
-+ * vaCreateBuffer(dpy, context, VAEncMiscParameterBufferType,
-+ * sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterRateControl),
-+ * 1, NULL, &buf_id);
-+ *
-+ * vaMapBuffer(dpy,buf_id,(void **)&misc_param);
-+ * misc_param->type = VAEncMiscParameterTypeRateControl;
-+ * misc_rate_ctrl= (VAEncMiscParameterRateControl *)misc_param->data;
-+ * misc_rate_ctrl->bits_per_second = 6400000;
-+ * vaUnmapBuffer(dpy, buf_id);
-+ * vaRenderPicture(dpy, context, &buf_id, 1);
-+ */
-+typedef struct _VAEncMiscParameterBuffer
-+{
-+ VAEncMiscParameterType type;
-+ uint32_t data[];
-+} VAEncMiscParameterBuffer;
-+
-+/** \brief Temporal layer Structure*/
-+typedef struct _VAEncMiscParameterTemporalLayerStructure
-+{
-+ /** \brief The number of temporal layers */
-+ uint32_t number_of_layers;
-+ /** \brief The length of the array defining frame layer membership. Should be 1-32 */
-+ uint32_t periodicity;
-+ /**
-+ * \brief The array indicating the layer id for each frame
-+ *
-+ * The layer id for the first frame in a coded sequence is always 0, so layer_id[] specifies the layer
-+ * ids for frames starting from the 2nd frame.
-+ */
-+ uint32_t layer_id[32];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterTemporalLayerStructure;
-+
-+
-+/** \brief Rate control parameters */
-+typedef struct _VAEncMiscParameterRateControl
-+{
-+ /** The maximum bit-rate which the the rate controller should generate. */
-+ uint32_t bits_per_second;
-+ /** The target bit-rate which the rate controller should generate, as a percentage of the
-+ * maximum bit-rate.
-+ *
-+ * In CBR mode this value is ignored (treated as 100%).
-+ */
-+ uint32_t target_percentage;
-+ /** Rate control window size in milliseconds.
-+ *
-+ * The rate controller will attempt to guarantee that the target and maximum bit-rates are
-+ * correct over this window.
-+ */
-+ uint32_t window_size;
-+ /** Initial quantiser value used at the start of the stream.
-+ *
-+ * Ignored if set to zero.
-+ */
-+ uint32_t initial_qp;
-+ /** Minimum quantiser value to use.
-+ *
-+ * The quantiser will not go below the value - if this limit is hit, the output bitrate may
-+ * be lower than the target. Ignored if set to zero.
-+ */
-+ uint32_t min_qp;
-+ /** Basic unit size.
-+ *
-+ * Only used by some drivers - see driver documentation for details. Set to zero if unused.
-+ */
-+ uint32_t basic_unit_size;
-+ union
-+ {
-+ struct
-+ {
-+ /** Force rate controller reset.
-+ *
-+ * The next frame will be treated as the start of a new stream, with all rate
-+ * controller state reset to its initial values.
-+ */
-+ uint32_t reset : 1;
-+ /** Disable frame skip in rate control mode. */
-+ uint32_t disable_frame_skip : 1;
-+ /** Disable bit stuffing in rate control mode. */
-+ uint32_t disable_bit_stuffing : 1;
-+ /** Macroblock-level rate control.
-+ *
-+ * 0: use default, 1: always enable, 2: always disable, other: reserved.
-+ *
-+ * This feature is only available if VAConfigAttribRateControl has the
-+ * \ref VA_RC_MB bit set.
-+ */
-+ uint32_t mb_rate_control : 4;
-+ /** The temporal layer that these rate control parameters apply to. */
-+ uint32_t temporal_id : 8;
-+ /** Ensure that intra frames also conform to the constant frame size. */
-+ uint32_t cfs_I_frames : 1;
-+ /** Enable parallel rate control for hierarchical B frames.
-+ *
-+ * See \ref VA_RC_PARALLEL.
-+ */
-+ uint32_t enable_parallel_brc : 1;
-+ uint32_t enable_dynamic_scaling : 1;
-+ /** Frame tolerance mode.
-+ *
-+ * Indicates the tolerance the application has to variations in the frame size.
-+ * For example, wireless display scenarios may require very steady bit rate to
-+ * reduce buffering time. It affects the rate control algorithm used,
-+ * but may or may not have an effect based on the combination of other BRC
-+ * parameters. Only valid when the driver reports support for
-+ * #VAConfigAttribFrameSizeToleranceSupport.
-+ *
-+ * equals 0 -- normal mode;
-+ * equals 1 -- maps to sliding window;
-+ * equals 2 -- maps to low delay mode;
-+ * other -- invalid.
-+ */
-+ uint32_t frame_tolerance_mode : 2;
-+ /** Reserved for future use, must be zero. */
-+ uint32_t reserved : 12;
-+ } bits;
-+ uint32_t value;
-+ } rc_flags;
-+ /** Initial quality factor used in ICQ mode.
-+ *
-+ * This value must be between 1 and 51.
-+ * this value will be deprecated in future, to use quality_factor instead of it.
-+ */
-+ uint32_t ICQ_quality_factor;
-+ /** Maximum quantiser value to use.
-+ *
-+ * The quantiser will not go above this value - if this limit is hit, the output bitrate
-+ * may exceed the target. Ignored if set to zero.
-+ */
-+ uint32_t max_qp;
-+ /** Quality factor
-+ *
-+ * the range will be different for different codec
-+ */
-+ uint32_t quality_factor;
-+ /** Reserved bytes for future use, must be zero. */
-+ uint32_t va_reserved[VA_PADDING_MEDIUM - 3];
-+} VAEncMiscParameterRateControl;
-+
-+/** Encode framerate parameters.
-+ *
-+ * Sets the encode framerate used by the rate controller. This should be
-+ * provided in all modes using a bitrate target (variable framerate is not
-+ * supported).
-+ */
-+typedef struct _VAEncMiscParameterFrameRate
-+{
-+ /** Encode framerate.
-+ *
-+ * The framerate is specified as a number of frames per second, as a
-+ * fraction. The denominator of the fraction is given in the top half
-+ * (the high two bytes) of the framerate field, and the numerator is
-+ * given in the bottom half (the low two bytes).
-+ *
-+ * That is:
-+ * denominator = framerate >> 16 & 0xffff;
-+ * numerator = framerate & 0xffff;
-+ * fps = numerator / denominator;
-+ *
-+ * For example, if framerate is set to (100 << 16 | 750), this is
-+ * 750 / 100, hence 7.5fps.
-+ *
-+ * If the denominator is zero (the high two bytes are both zero) then
-+ * it takes the value one instead, so the framerate is just the integer
-+ * in the low 2 bytes.
-+ */
-+ uint32_t framerate;
-+ union
-+ {
-+ struct
-+ {
-+ /** The temporal layer that these framerate parameters apply to. */
-+ uint32_t temporal_id : 8;
-+ /** Reserved for future use, must be zero. */
-+ uint32_t reserved : 24;
-+ } bits;
-+ uint32_t value;
-+ } framerate_flags;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterFrameRate;
-+
-+/**
-+ * Allow a maximum slice size to be specified (in bits).
-+ * The encoder will attempt to make sure that individual slices do not exceed this size
-+ * Or to signal applicate if the slice size exceed this size, see "status" of VACodedBufferSegment
-+ */
-+typedef struct _VAEncMiscParameterMaxSliceSize
-+{
-+ uint32_t max_slice_size;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterMaxSliceSize;
-+
-+typedef struct _VAEncMiscParameterAIR
-+{
-+ uint32_t air_num_mbs;
-+ uint32_t air_threshold;
-+ uint32_t air_auto; /* if set to 1 then hardware auto-tune the AIR threshold */
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterAIR;
-+
-+/*
-+ * \brief Rolling intra refresh data structure for encoding.
-+ */
-+typedef struct _VAEncMiscParameterRIR
-+{
-+ union
-+ {
-+ struct
-+ /**
-+ * \brief Indicate if intra refresh is enabled in column/row.
-+ *
-+ * App should query VAConfigAttribEncIntraRefresh to confirm RIR support
-+ * by the driver before sending this structure.
-+ */
-+ {
-+ /* \brief enable RIR in column */
-+ uint32_t enable_rir_column : 1;
-+ /* \brief enable RIR in row */
-+ uint32_t enable_rir_row : 1;
-+ uint32_t reserved : 30;
-+ } bits;
-+ uint32_t value;
-+ } rir_flags;
-+ /**
-+ * \brief Indicates the column or row location in MB. It is ignored if
-+ * rir_flags is 0.
-+ */
-+ uint16_t intra_insertion_location;
-+ /**
-+ * \brief Indicates the number of columns or rows in MB. It is ignored if
-+ * rir_flags is 0.
-+ */
-+ uint16_t intra_insert_size;
-+ /**
-+ * \brief indicates the Qp difference for inserted intra columns or rows.
-+ * App can use this to adjust intra Qp based on bitrate & max frame size.
-+ */
-+ uint8_t qp_delta_for_inserted_intra;
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterRIR;
-+
-+/** HRD / VBV buffering parameters for encoding.
-+ *
-+ * This sets the HRD / VBV parameters which will be used by the rate
-+ * controller for encoding. It should be specified in modes using a bitrate
-+ * target when the buffering of the output stream needs to be constrained.
-+ *
-+ * If not provided, the encoder may use arbitrary amounts of buffering.
-+ */
-+typedef struct _VAEncMiscParameterHRD
-+{
-+ /** The initial fullness of the HRD coded picture buffer, in bits.
-+ *
-+ * This sets how full the CPB is when encoding begins - that is, how much
-+ * buffering will happen on the decoder side before the first frame.
-+ * The CPB fullness will be reset to this value after any rate control
-+ * reset (a change in parameters or an explicit reset).
-+ *
-+ * For H.264, it should match the value of initial_cpb_removal_delay in
-+ * buffering_period SEI messages.
-+ */
-+ uint32_t initial_buffer_fullness;
-+ /** The HRD coded picture buffer size, in bits.
-+ *
-+ * For H.264, it should match the value of cpb_size_value_minus1 in the VUI
-+ * parameters.
-+ */
-+ uint32_t buffer_size;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterHRD;
-+
-+/**
-+ * \brief Defines a maximum frame size (in bits).
-+ *
-+ * This misc parameter buffer defines the maximum size of a frame (in
-+ * bits). The encoder will try to make sure that each frame does not
-+ * exceed this size. Otherwise, if the frame size exceeds this size,
-+ * the \c status flag of #VACodedBufferSegment will contain
-+ * #VA_CODED_BUF_STATUS_FRAME_SIZE_OVERFLOW.
-+ */
-+typedef struct _VAEncMiscParameterBufferMaxFrameSize {
-+ /** \brief Type. Shall be set to #VAEncMiscParameterTypeMaxFrameSize. */
-+ /** duplicated with VAEncMiscParameterBuffer, should be deprecated*/
-+ va_deprecated VAEncMiscParameterType type;
-+ /** \brief Maximum size of a frame (in bits). */
-+ uint32_t max_frame_size;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterBufferMaxFrameSize;
-+
-+/**
-+ * \brief Maximum frame size (in bytes) settings for multiple pass.
-+ *
-+ * This misc parameter buffer defines the maximum size of a frame (in
-+ * bytes) settings for multiple pass. currently only AVC encoder can
-+ * support this settings in multiple pass case. If the frame size exceeds
-+ * this size, the encoder will do more pak passes to adjust the QP value
-+ * to control the frame size.
-+ */
-+typedef struct _VAEncMiscParameterBufferMultiPassFrameSize {
-+ /** \brief Type. Shall be set to #VAEncMiscParameterTypeMultiPassMaxFrameSize. */
-+ /** duplicated with VAEncMiscParameterBuffer, should be deprecated*/
-+ va_deprecated VAEncMiscParameterType type;
-+ /** \brief Maximum size of a frame (in byte) */
-+ uint32_t max_frame_size;
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t reserved;
-+ /** \brief number of passes, every pass has different QP, currently AVC encoder can support up to 4 passes */
-+ uint8_t num_passes;
-+ /** \brief delta QP list for every pass */
-+ uint8_t *delta_qp;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ unsigned long va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterBufferMultiPassFrameSize;
-+
-+/**
-+ * \brief Encoding quality level.
-+ *
-+ * The encoding quality could be set through this structure, if the implementation
-+ * supports multiple quality levels. The quality level set through this structure is
-+ * persistent over the entire coded sequence, or until a new structure is being sent.
-+ * The quality level range can be queried through the VAConfigAttribEncQualityRange
-+ * attribute. A lower value means higher quality, and a value of 1 represents the highest
-+ * quality. The quality level setting is used as a trade-off between quality and speed/power
-+ * consumption, with higher quality corresponds to lower speed and higher power consumption.
-+ */
-+typedef struct _VAEncMiscParameterBufferQualityLevel {
-+ /** \brief Encoding quality level setting. When set to 0, default quality
-+ * level is used.
-+ */
-+ uint32_t quality_level;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterBufferQualityLevel;
-+
-+/**
-+ * \brief Quantization settings for encoding.
-+ *
-+ * Some encoders support special types of quantization such as trellis, and this structure
-+ * can be used by the app to control these special types of quantization by the encoder.
-+ */
-+typedef struct _VAEncMiscParameterQuantization
-+{
-+ union
-+ {
-+ /* if no flags is set then quantization is determined by the driver */
-+ struct
-+ {
-+ /* \brief disable trellis for all frames/fields */
-+ uint32_t disable_trellis : 1;
-+ /* \brief enable trellis for I frames/fields */
-+ uint32_t enable_trellis_I : 1;
-+ /* \brief enable trellis for P frames/fields */
-+ uint32_t enable_trellis_P : 1;
-+ /* \brief enable trellis for B frames/fields */
-+ uint32_t enable_trellis_B : 1;
-+ uint32_t reserved : 28;
-+ } bits;
-+ uint32_t value;
-+ } quantization_flags;
-+ uint32_t va_reserved;
-+} VAEncMiscParameterQuantization;
-+
-+/**
-+ * \brief Encoding skip frame.
-+ *
-+ * The application may choose to skip frames externally to the encoder (e.g. drop completely or
-+ * code as all skip's). For rate control purposes the encoder will need to know the size and number
-+ * of skipped frames. Skip frame(s) indicated through this structure is applicable only to the
-+ * current frame. It is allowed for the application to still send in packed headers for the driver to
-+ * pack, although no frame will be encoded (e.g. for HW to encrypt the frame).
-+ */
-+typedef struct _VAEncMiscParameterSkipFrame {
-+ /** \brief Indicates skip frames as below.
-+ * 0: Encode as normal, no skip.
-+ * 1: One or more frames were skipped prior to the current frame, encode the current frame as normal.
-+ * 2: The current frame is to be skipped, do not encode it but pack/encrypt the packed header contents
-+ * (all except VAEncPackedHeaderSlice) which could contain actual frame contents (e.g. pack the frame
-+ * in VAEncPackedHeaderPicture). */
-+ uint8_t skip_frame_flag;
-+ /** \brief The number of frames skipped prior to the current frame. Valid when skip_frame_flag = 1. */
-+ uint8_t num_skip_frames;
-+ /** \brief When skip_frame_flag = 1, the size of the skipped frames in bits. When skip_frame_flag = 2,
-+ * the size of the current skipped frame that is to be packed/encrypted in bits. */
-+ uint32_t size_skip_frames;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterSkipFrame;
-+
-+/**
-+ * \brief Encoding region-of-interest (ROI).
-+ *
-+ * The encoding ROI can be set through VAEncMiscParameterBufferROI, if the implementation
-+ * supports ROI input. The ROI set through this structure is applicable only to the
-+ * current frame or field, so must be sent every frame or field to be applied. The number of
-+ * supported ROIs can be queried through the VAConfigAttribEncROI. The encoder will use the
-+ * ROI information to adjust the QP values of the MB's that fall within the ROIs.
-+ */
-+typedef struct _VAEncROI
-+{
-+ /** \brief Defines the ROI boundary in pixels, the driver will map it to appropriate
-+ * codec coding units. It is relative to frame coordinates for the frame case and
-+ * to field coordinates for the field case. */
-+ VARectangle roi_rectangle;
-+ /**
-+ * \brief ROI value
-+ *
-+ * \ref roi_value specifies ROI delta QP or ROI priority.
-+ * -- ROI delta QP is the value that will be added on top of the frame level QP.
-+ * -- ROI priority specifies the priority of a region, it can be positive (more important)
-+ * or negative (less important) values and is compared with non-ROI region (taken as value 0),
-+ * E.g. ROI region with \ref roi_value -3 is less important than the non-ROI region (\ref roi_value
-+ * implied to be 0) which is less important than ROI region with roi_value +2. For overlapping
-+ * regions, the roi_value that is first in the ROI array will have priority.
-+ *
-+ * \ref roi_value always specifes ROI delta QP when VAConfigAttribRateControl == VA_RC_CQP, no matter
-+ * the value of \c roi_value_is_qp_delta in #VAEncMiscParameterBufferROI.
-+ *
-+ * \ref roi_value depends on \c roi_value_is_qp_delta in #VAEncMiscParameterBufferROI when
-+ * VAConfigAttribRateControl != VA_RC_CQP. \ref roi_value specifies ROI_delta QP if \c roi_value_is_qp_delta
-+ * in VAEncMiscParameterBufferROI is 1, otherwise \ref roi_value specifies ROI priority.
-+ */
-+ int8_t roi_value;
-+} VAEncROI;
-+
-+typedef struct _VAEncMiscParameterBufferROI {
-+ /** \brief Number of ROIs being sent.*/
-+ uint32_t num_roi;
-+
-+ /** \brief Valid when VAConfigAttribRateControl != VA_RC_CQP, then the encoder's
-+ * rate control will determine actual delta QPs. Specifies the max/min allowed delta
-+ * QPs. */
-+ int8_t max_delta_qp;
-+ int8_t min_delta_qp;
-+
-+ /** \brief Pointer to a VAEncROI array with num_roi elements. It is relative to frame
-+ * coordinates for the frame case and to field coordinates for the field case.*/
-+ VAEncROI *roi;
-+ union {
-+ struct {
-+ /**
-+ * \brief An indication for roi value.
-+ *
-+ * \ref roi_value_is_qp_delta equal to 1 indicates \c roi_value in #VAEncROI should
-+ * be used as ROI delta QP. \ref roi_value_is_qp_delta equal to 0 indicates \c roi_value
-+ * in #VAEncROI should be used as ROI priority.
-+ *
-+ * \ref roi_value_is_qp_delta is only available when VAConfigAttribRateControl != VA_RC_CQP,
-+ * the setting must comply with \c roi_rc_priority_support and \c roi_rc_qp_delta_support in
-+ * #VAConfigAttribValEncROI. The underlying driver should ignore this field
-+ * when VAConfigAttribRateControl == VA_RC_CQP.
-+ */
-+ uint32_t roi_value_is_qp_delta : 1;
-+ uint32_t reserved : 31;
-+ } bits;
-+ uint32_t value;
-+ } roi_flags;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncMiscParameterBufferROI;
-+/*
-+ * \brief Dirty rectangle data structure for encoding.
-+ *
-+ * The encoding dirty rect can be set through VAEncMiscParameterBufferDirtyRect, if the
-+ * implementation supports dirty rect input. The rect set through this structure is applicable
-+ * only to the current frame or field, so must be sent every frame or field to be applied.
-+ * The number of supported rects can be queried through the VAConfigAttribEncDirtyRect. The
-+ * encoder will use the rect information to know those rectangle areas have changed while the
-+ * areas not covered by dirty rect rectangles are assumed to have not changed compared to the
-+ * previous picture. The encoder may do some internal optimizations.
-+ */
-+typedef struct _VAEncMiscParameterBufferDirtyRect
-+{
-+ /** \brief Number of Rectangle being sent.*/
-+ uint32_t num_roi_rectangle;
-+
-+ /** \brief Pointer to a VARectangle array with num_roi_rectangle elements.*/
-+ VARectangle *roi_rectangle;
-+} VAEncMiscParameterBufferDirtyRect;
-+
-+/** \brief Attribute value for VAConfigAttribEncParallelRateControl */
-+typedef struct _VAEncMiscParameterParallelRateControl {
-+ /** brief Number of layers*/
-+ uint32_t num_layers;
-+ /** brief Number of B frames per layer per GOP.
-+ *
-+ * it should be allocated by application, and the is num_layers.
-+ * num_b_in_gop[0] is the number of regular B which refers to only I or P frames. */
-+ uint32_t *num_b_in_gop;
-+} VAEncMiscParameterParallelRateControl;
-+
-+/** per frame encoder quality controls, once set they will persist for all future frames
-+ *till it is updated again. */
-+typedef struct _VAEncMiscParameterEncQuality
-+{
-+ union
-+ {
-+ struct
-+ {
-+ /** Use raw frames for reference instead of reconstructed frames.
-+ * it only impact motion estimation (ME) stage, and will not impact MC stage
-+ * so the reconstruct picture will can match with decode side */
-+ uint32_t useRawPicForRef : 1;
-+ /** Disables skip check for ME stage, it will increase the bistream size
-+ * but will improve the qulity */
-+ uint32_t skipCheckDisable : 1;
-+ /** Indicates app will override default driver FTQ settings using FTQEnable.
-+ * FTQ is forward transform quantization */
-+ uint32_t FTQOverride : 1;
-+ /** Enables/disables FTQ. */
-+ uint32_t FTQEnable : 1;
-+ /** Indicates the app will provide the Skip Threshold LUT to use when FTQ is
-+ * enabled (FTQSkipThresholdLUT), else default driver thresholds will be used. */
-+ uint32_t FTQSkipThresholdLUTInput : 1;
-+ /** Indicates the app will provide the Skip Threshold LUT to use when FTQ is
-+ * disabled (NonFTQSkipThresholdLUT), else default driver thresholds will be used. */
-+ uint32_t NonFTQSkipThresholdLUTInput : 1;
-+ uint32_t ReservedBit : 1;
-+ /** Control to enable the ME mode decision algorithm to bias to fewer B Direct/Skip types.
-+ * Applies only to B frames, all other frames will ignore this setting. */
-+ uint32_t directBiasAdjustmentEnable : 1;
-+ /** Enables global motion bias. global motion also is called HME (Heirarchical Motion Estimation )
-+ * HME is used to handle large motions and avoiding local minima in the video encoding process
-+ * down scaled the input and reference picture, then do ME. the result will be a predictor to next level HME or ME
-+ * current interface divide the HME to 3 level. UltraHME , SuperHME, and HME, result of UltraHME will be input of SurperHME,
-+ * result of superHME will be a input for HME. HME result will be input of ME. it is a switch for HMEMVCostScalingFactor
-+ * can change the HME bias inside RDO stage*/
-+ uint32_t globalMotionBiasAdjustmentEnable : 1;
-+ /** MV cost scaling ratio for HME ( predictors. It is used when
-+ * globalMotionBiasAdjustmentEnable == 1, else it is ignored. Values are:
-+ * 0: set MV cost to be 0 for HME predictor.
-+ * 1: scale MV cost to be 1/2 of the default value for HME predictor.
-+ * 2: scale MV cost to be 1/4 of the default value for HME predictor.
-+ * 3: scale MV cost to be 1/8 of the default value for HME predictor. */
-+ uint32_t HMEMVCostScalingFactor : 2;
-+ /**disable HME, if it is disabled. Super*ultraHME should also be disabled */
-+ uint32_t HMEDisable : 1;
-+ /**disable Super HME, if it is disabled, ultraHME should be disabled */
-+ uint32_t SuperHMEDisable : 1;
-+ /** disable Ultra HME */
-+ uint32_t UltraHMEDisable : 1;
-+ /** disable panic mode. Panic mode happened when there are extreme BRC (bit rate control) requirement
-+ * frame size cant achieve the target of BRC. when Panic mode is triggered, Coefficients will
-+ * be set to zero. disable panic mode will improve quality but will impact BRC */
-+ uint32_t PanicModeDisable : 1;
-+ /** Force RepartitionCheck
-+ * 0: DEFAULT - follow driver default settings.
-+ * 1: FORCE_ENABLE - enable this feature totally for all cases.
-+ * 2: FORCE_DISABLE - disable this feature totally for all cases. */
-+ uint32_t ForceRepartitionCheck : 2;
-+
-+ };
-+ uint32_t encControls;
-+ };
-+
-+ /** Maps QP to skip thresholds when FTQ is enabled. Valid range is 0-255. */
-+ uint8_t FTQSkipThresholdLUT[52];
-+ /** Maps QP to skip thresholds when FTQ is disabled. Valid range is 0-65535. */
-+ uint16_t NonFTQSkipThresholdLUT[52];
-+
-+ uint32_t reserved[VA_PADDING_HIGH]; // Reserved for future use.
-+
-+} VAEncMiscParameterEncQuality;
-+
-+/**
-+ * \brief Custom Encoder Rounding Offset Control.
-+ * Application may use this structure to set customized rounding
-+ * offset parameters for quantization.
-+ * Valid when \c VAConfigAttribCustomRoundingControl equals 1.
-+ */
-+typedef struct _VAEncMiscParameterCustomRoundingControl
-+{
-+ union {
-+ struct {
-+ /** \brief Enable customized rounding offset for intra blocks.
-+ * If 0, default value would be taken by driver for intra
-+ * rounding offset.
-+ */
-+ uint32_t enable_custom_rouding_intra : 1 ;
-+
-+ /** \brief Intra rounding offset
-+ * Ignored if \c enable_custom_rouding_intra equals 0.
-+ */
-+ uint32_t rounding_offset_intra : 7;
-+
-+ /** \brief Enable customized rounding offset for inter blocks.
-+ * If 0, default value would be taken by driver for inter
-+ * rounding offset.
-+ */
-+ uint32_t enable_custom_rounding_inter : 1 ;
-+
-+ /** \brief Inter rounding offset
-+ * Ignored if \c enable_custom_rouding_inter equals 0.
-+ */
-+ uint32_t rounding_offset_inter : 7;
-+
-+ /* Reserved */
-+ uint32_t reserved :16;
-+ } bits;
-+ uint32_t value;
-+ } rounding_offset_setting;
-+} VAEncMiscParameterCustomRoundingControl;
-+/**
-+ * There will be cases where the bitstream buffer will not have enough room to hold
-+ * the data for the entire slice, and the following flags will be used in the slice
-+ * parameter to signal to the server for the possible cases.
-+ * If a slice parameter buffer and slice data buffer pair is sent to the server with
-+ * the slice data partially in the slice data buffer (BEGIN and MIDDLE cases below),
-+ * then a slice parameter and data buffer needs to be sent again to complete this slice.
-+ */
-+#define VA_SLICE_DATA_FLAG_ALL 0x00 /* whole slice is in the buffer */
-+#define VA_SLICE_DATA_FLAG_BEGIN 0x01 /* The beginning of the slice is in the buffer but the end if not */
-+#define VA_SLICE_DATA_FLAG_MIDDLE 0x02 /* Neither beginning nor end of the slice is in the buffer */
-+#define VA_SLICE_DATA_FLAG_END 0x04 /* end of the slice is in the buffer */
-+
-+/* Codec-independent Slice Parameter Buffer base */
-+typedef struct _VASliceParameterBufferBase
-+{
-+ uint32_t slice_data_size; /* number of bytes in the slice data buffer for this slice */
-+ uint32_t slice_data_offset; /* the offset to the first byte of slice data */
-+ uint32_t slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX definitions */
-+} VASliceParameterBufferBase;
-+
-+/**********************************
-+ * JPEG common data structures
-+ **********************************/
-+/**
-+ * \brief Huffman table for JPEG decoding.
-+ *
-+ * This structure holds the complete Huffman tables. This is an
-+ * aggregation of all Huffman table (DHT) segments maintained by the
-+ * application. i.e. up to 2 Huffman tables are stored in there for
-+ * baseline profile.
-+ *
-+ * The #load_huffman_table array can be used as a hint to notify the
-+ * VA driver implementation about which table(s) actually changed
-+ * since the last submission of this buffer.
-+ */
-+typedef struct _VAHuffmanTableBufferJPEGBaseline {
-+ /** \brief Specifies which #huffman_table is valid. */
-+ uint8_t load_huffman_table[2];
-+ /** \brief Huffman tables indexed by table identifier (Th). */
-+ struct {
-+ /** @name DC table (up to 12 categories) */
-+ /**@{*/
-+ /** \brief Number of Huffman codes of length i + 1 (Li). */
-+ uint8_t num_dc_codes[16];
-+ /** \brief Value associated with each Huffman code (Vij). */
-+ uint8_t dc_values[12];
-+ /**@}*/
-+ /** @name AC table (2 special codes + up to 16 * 10 codes) */
-+ /**@{*/
-+ /** \brief Number of Huffman codes of length i + 1 (Li). */
-+ uint8_t num_ac_codes[16];
-+ /** \brief Value associated with each Huffman code (Vij). */
-+ uint8_t ac_values[162];
-+ /** \brief Padding to 4-byte boundaries. Must be set to zero. */
-+ uint8_t pad[2];
-+ /**@}*/
-+ } huffman_table[2];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAHuffmanTableBufferJPEGBaseline;
-+
-+/****************************
-+ * MPEG-2 data structures
-+ ****************************/
-+
-+/* MPEG-2 Picture Parameter Buffer */
-+/*
-+ * For each frame or field, and before any slice data, a single
-+ * picture parameter buffer must be send.
-+ */
-+typedef struct _VAPictureParameterBufferMPEG2
-+{
-+ uint16_t horizontal_size;
-+ uint16_t vertical_size;
-+ VASurfaceID forward_reference_picture;
-+ VASurfaceID backward_reference_picture;
-+ /* meanings of the following fields are the same as in the standard */
-+ int32_t picture_coding_type;
-+ int32_t f_code; /* pack all four fcode into this */
-+ union {
-+ struct {
-+ uint32_t intra_dc_precision : 2;
-+ uint32_t picture_structure : 2;
-+ uint32_t top_field_first : 1;
-+ uint32_t frame_pred_frame_dct : 1;
-+ uint32_t concealment_motion_vectors : 1;
-+ uint32_t q_scale_type : 1;
-+ uint32_t intra_vlc_format : 1;
-+ uint32_t alternate_scan : 1;
-+ uint32_t repeat_first_field : 1;
-+ uint32_t progressive_frame : 1;
-+ uint32_t is_first_field : 1; /* indicate whether the current field
-+ * is the first field for field picture
-+ */
-+ } bits;
-+ uint32_t value;
-+ } picture_coding_extension;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAPictureParameterBufferMPEG2;
-+
-+/** MPEG-2 Inverse Quantization Matrix Buffer */
-+typedef struct _VAIQMatrixBufferMPEG2
-+{
-+ /** \brief Same as the MPEG-2 bitstream syntax element. */
-+ int32_t load_intra_quantiser_matrix;
-+ /** \brief Same as the MPEG-2 bitstream syntax element. */
-+ int32_t load_non_intra_quantiser_matrix;
-+ /** \brief Same as the MPEG-2 bitstream syntax element. */
-+ int32_t load_chroma_intra_quantiser_matrix;
-+ /** \brief Same as the MPEG-2 bitstream syntax element. */
-+ int32_t load_chroma_non_intra_quantiser_matrix;
-+ /** \brief Luminance intra matrix, in zig-zag scan order. */
-+ uint8_t intra_quantiser_matrix[64];
-+ /** \brief Luminance non-intra matrix, in zig-zag scan order. */
-+ uint8_t non_intra_quantiser_matrix[64];
-+ /** \brief Chroma intra matrix, in zig-zag scan order. */
-+ uint8_t chroma_intra_quantiser_matrix[64];
-+ /** \brief Chroma non-intra matrix, in zig-zag scan order. */
-+ uint8_t chroma_non_intra_quantiser_matrix[64];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAIQMatrixBufferMPEG2;
-+
-+/** MPEG-2 Slice Parameter Buffer */
-+typedef struct _VASliceParameterBufferMPEG2
-+{
-+ uint32_t slice_data_size;/* number of bytes in the slice data buffer for this slice */
-+ uint32_t slice_data_offset;/* the offset to the first byte of slice data */
-+ uint32_t slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
-+ uint32_t macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
-+ uint32_t slice_horizontal_position;
-+ uint32_t slice_vertical_position;
-+ int32_t quantiser_scale_code;
-+ int32_t intra_slice_flag;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VASliceParameterBufferMPEG2;
-+
-+/** MPEG-2 Macroblock Parameter Buffer */
-+typedef struct _VAMacroblockParameterBufferMPEG2
-+{
-+ uint16_t macroblock_address;
-+ /*
-+ * macroblock_address (in raster scan order)
-+ * top-left: 0
-+ * bottom-right: picture-height-in-mb*picture-width-in-mb - 1
-+ */
-+ uint8_t macroblock_type; /* see definition below */
-+ union {
-+ struct {
-+ uint32_t frame_motion_type : 2;
-+ uint32_t field_motion_type : 2;
-+ uint32_t dct_type : 1;
-+ } bits;
-+ uint32_t value;
-+ } macroblock_modes;
-+ uint8_t motion_vertical_field_select;
-+ /*
-+ * motion_vertical_field_select:
-+ * see section 6.3.17.2 in the spec
-+ * only the lower 4 bits are used
-+ * bit 0: first vector forward
-+ * bit 1: first vector backward
-+ * bit 2: second vector forward
-+ * bit 3: second vector backward
-+ */
-+ int16_t PMV[2][2][2]; /* see Table 7-7 in the spec */
-+ uint16_t coded_block_pattern;
-+ /*
-+ * The bitplanes for coded_block_pattern are described
-+ * in Figure 6.10-12 in the spec
-+ */
-+
-+ /* Number of skipped macroblocks after this macroblock */
-+ uint16_t num_skipped_macroblocks;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAMacroblockParameterBufferMPEG2;
-+
-+/*
-+ * OR'd flags for macroblock_type (section 6.3.17.1 in the spec)
-+ */
-+#define VA_MB_TYPE_MOTION_FORWARD 0x02
-+#define VA_MB_TYPE_MOTION_BACKWARD 0x04
-+#define VA_MB_TYPE_MOTION_PATTERN 0x08
-+#define VA_MB_TYPE_MOTION_INTRA 0x10
-+
-+/**
-+ * MPEG-2 Residual Data Buffer
-+ * For each macroblock, there wil be 64 shorts (16-bit) in the
-+ * residual data buffer
-+ */
-+
-+/****************************
-+ * MPEG-4 Part 2 data structures
-+ ****************************/
-+
-+/* MPEG-4 Picture Parameter Buffer */
-+/*
-+ * For each frame or field, and before any slice data, a single
-+ * picture parameter buffer must be send.
-+ */
-+typedef struct _VAPictureParameterBufferMPEG4
-+{
-+ uint16_t vop_width;
-+ uint16_t vop_height;
-+ VASurfaceID forward_reference_picture;
-+ VASurfaceID backward_reference_picture;
-+ union {
-+ struct {
-+ uint32_t short_video_header : 1;
-+ uint32_t chroma_format : 2;
-+ uint32_t interlaced : 1;
-+ uint32_t obmc_disable : 1;
-+ uint32_t sprite_enable : 2;
-+ uint32_t sprite_warping_accuracy : 2;
-+ uint32_t quant_type : 1;
-+ uint32_t quarter_sample : 1;
-+ uint32_t data_partitioned : 1;
-+ uint32_t reversible_vlc : 1;
-+ uint32_t resync_marker_disable : 1;
-+ } bits;
-+ uint32_t value;
-+ } vol_fields;
-+ uint8_t no_of_sprite_warping_points;
-+ int16_t sprite_trajectory_du[3];
-+ int16_t sprite_trajectory_dv[3];
-+ uint8_t quant_precision;
-+ union {
-+ struct {
-+ uint32_t vop_coding_type : 2;
-+ uint32_t backward_reference_vop_coding_type : 2;
-+ uint32_t vop_rounding_type : 1;
-+ uint32_t intra_dc_vlc_thr : 3;
-+ uint32_t top_field_first : 1;
-+ uint32_t alternate_vertical_scan_flag : 1;
-+ } bits;
-+ uint32_t value;
-+ } vop_fields;
-+ uint8_t vop_fcode_forward;
-+ uint8_t vop_fcode_backward;
-+ uint16_t vop_time_increment_resolution;
-+ /* short header related */
-+ uint8_t num_gobs_in_vop;
-+ uint8_t num_macroblocks_in_gob;
-+ /* for direct mode prediction */
-+ int16_t TRB;
-+ int16_t TRD;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAPictureParameterBufferMPEG4;
-+
-+/** MPEG-4 Inverse Quantization Matrix Buffer */
-+typedef struct _VAIQMatrixBufferMPEG4
-+{
-+ /** Same as the MPEG-4:2 bitstream syntax element. */
-+ int32_t load_intra_quant_mat;
-+ /** Same as the MPEG-4:2 bitstream syntax element. */
-+ int32_t load_non_intra_quant_mat;
-+ /** The matrix for intra blocks, in zig-zag scan order. */
-+ uint8_t intra_quant_mat[64];
-+ /** The matrix for non-intra blocks, in zig-zag scan order. */
-+ uint8_t non_intra_quant_mat[64];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAIQMatrixBufferMPEG4;
-+
-+/** MPEG-4 Slice Parameter Buffer */
-+typedef struct _VASliceParameterBufferMPEG4
-+{
-+ uint32_t slice_data_size;/* number of bytes in the slice data buffer for this slice */
-+ uint32_t slice_data_offset;/* the offset to the first byte of slice data */
-+ uint32_t slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
-+ uint32_t macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
-+ uint32_t macroblock_number;
-+ int32_t quant_scale;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VASliceParameterBufferMPEG4;
-+
-+/**
-+ VC-1 data structures
-+*/
-+
-+typedef enum /* see 7.1.1.32 */
-+{
-+ VAMvMode1Mv = 0,
-+ VAMvMode1MvHalfPel = 1,
-+ VAMvMode1MvHalfPelBilinear = 2,
-+ VAMvModeMixedMv = 3,
-+ VAMvModeIntensityCompensation = 4
-+} VAMvModeVC1;
-+
-+/** VC-1 Picture Parameter Buffer */
-+/*
-+ * For each picture, and before any slice data, a picture parameter
-+ * buffer must be send. Multiple picture parameter buffers may be
-+ * sent for a single picture. In that case picture parameters will
-+ * apply to all slice data that follow it until a new picture
-+ * parameter buffer is sent.
-+ *
-+ * Notes:
-+ * pic_quantizer_type should be set to the applicable quantizer
-+ * type as defined by QUANTIZER (J.1.19) and either
-+ * PQUANTIZER (7.1.1.8) or PQINDEX (7.1.1.6)
-+ */
-+typedef struct _VAPictureParameterBufferVC1
-+{
-+ VASurfaceID forward_reference_picture;
-+ VASurfaceID backward_reference_picture;
-+ /* if out-of-loop post-processing is done on the render
-+ target, then we need to keep the in-loop decoded
-+ picture as a reference picture */
-+ VASurfaceID inloop_decoded_picture;
-+
-+ /* sequence layer for AP or meta data for SP and MP */
-+ union {
-+ struct {
-+ uint32_t pulldown : 1; /* SEQUENCE_LAYER::PULLDOWN */
-+ uint32_t interlace : 1; /* SEQUENCE_LAYER::INTERLACE */
-+ uint32_t tfcntrflag : 1; /* SEQUENCE_LAYER::TFCNTRFLAG */
-+ uint32_t finterpflag : 1; /* SEQUENCE_LAYER::FINTERPFLAG */
-+ uint32_t psf : 1; /* SEQUENCE_LAYER::PSF */
-+ uint32_t multires : 1; /* METADATA::MULTIRES */
-+ uint32_t overlap : 1; /* METADATA::OVERLAP */
-+ uint32_t syncmarker : 1; /* METADATA::SYNCMARKER */
-+ uint32_t rangered : 1; /* METADATA::RANGERED */
-+ uint32_t max_b_frames : 3; /* METADATA::MAXBFRAMES */
-+ uint32_t profile : 2; /* SEQUENCE_LAYER::PROFILE or The MSB of METADATA::PROFILE */
-+ } bits;
-+ uint32_t value;
-+ } sequence_fields;
-+
-+ uint16_t coded_width; /* ENTRY_POINT_LAYER::CODED_WIDTH */
-+ uint16_t coded_height; /* ENTRY_POINT_LAYER::CODED_HEIGHT */
-+ union {
-+ struct {
-+ uint32_t broken_link : 1; /* ENTRY_POINT_LAYER::BROKEN_LINK */
-+ uint32_t closed_entry : 1; /* ENTRY_POINT_LAYER::CLOSED_ENTRY */
-+ uint32_t panscan_flag : 1; /* ENTRY_POINT_LAYER::PANSCAN_FLAG */
-+ uint32_t loopfilter : 1; /* ENTRY_POINT_LAYER::LOOPFILTER */
-+ } bits;
-+ uint32_t value;
-+ } entrypoint_fields;
-+ uint8_t conditional_overlap_flag; /* ENTRY_POINT_LAYER::CONDOVER */
-+ uint8_t fast_uvmc_flag; /* ENTRY_POINT_LAYER::FASTUVMC */
-+ union {
-+ struct {
-+ uint32_t luma_flag : 1; /* ENTRY_POINT_LAYER::RANGE_MAPY_FLAG */
-+ uint32_t luma : 3; /* ENTRY_POINT_LAYER::RANGE_MAPY */
-+ uint32_t chroma_flag : 1; /* ENTRY_POINT_LAYER::RANGE_MAPUV_FLAG */
-+ uint32_t chroma : 3; /* ENTRY_POINT_LAYER::RANGE_MAPUV */
-+ } bits;
-+ uint32_t value;
-+ } range_mapping_fields;
-+
-+ uint8_t b_picture_fraction; /* Index for PICTURE_LAYER::BFRACTION value in Table 40 (7.1.1.14) */
-+ uint8_t cbp_table; /* PICTURE_LAYER::CBPTAB/ICBPTAB */
-+ uint8_t mb_mode_table; /* PICTURE_LAYER::MBMODETAB */
-+ uint8_t range_reduction_frame;/* PICTURE_LAYER::RANGEREDFRM */
-+ uint8_t rounding_control; /* PICTURE_LAYER::RNDCTRL */
-+ uint8_t post_processing; /* PICTURE_LAYER::POSTPROC */
-+ uint8_t picture_resolution_index; /* PICTURE_LAYER::RESPIC */
-+ uint8_t luma_scale; /* PICTURE_LAYER::LUMSCALE */
-+ uint8_t luma_shift; /* PICTURE_LAYER::LUMSHIFT */
-+
-+ union {
-+ struct {
-+ uint32_t picture_type : 3; /* PICTURE_LAYER::PTYPE */
-+ uint32_t frame_coding_mode : 3; /* PICTURE_LAYER::FCM */
-+ uint32_t top_field_first : 1; /* PICTURE_LAYER::TFF */
-+ uint32_t is_first_field : 1; /* set to 1 if it is the first field */
-+ uint32_t intensity_compensation : 1; /* PICTURE_LAYER::INTCOMP */
-+ } bits;
-+ uint32_t value;
-+ } picture_fields;
-+ union {
-+ struct {
-+ uint32_t mv_type_mb : 1; /* PICTURE::MVTYPEMB */
-+ uint32_t direct_mb : 1; /* PICTURE::DIRECTMB */
-+ uint32_t skip_mb : 1; /* PICTURE::SKIPMB */
-+ uint32_t field_tx : 1; /* PICTURE::FIELDTX */
-+ uint32_t forward_mb : 1; /* PICTURE::FORWARDMB */
-+ uint32_t ac_pred : 1; /* PICTURE::ACPRED */
-+ uint32_t overflags : 1; /* PICTURE::OVERFLAGS */
-+ } flags;
-+ uint32_t value;
-+ } raw_coding;
-+ union {
-+ struct {
-+ uint32_t bp_mv_type_mb : 1; /* PICTURE::MVTYPEMB */
-+ uint32_t bp_direct_mb : 1; /* PICTURE::DIRECTMB */
-+ uint32_t bp_skip_mb : 1; /* PICTURE::SKIPMB */
-+ uint32_t bp_field_tx : 1; /* PICTURE::FIELDTX */
-+ uint32_t bp_forward_mb : 1; /* PICTURE::FORWARDMB */
-+ uint32_t bp_ac_pred : 1; /* PICTURE::ACPRED */
-+ uint32_t bp_overflags : 1; /* PICTURE::OVERFLAGS */
-+ } flags;
-+ uint32_t value;
-+ } bitplane_present; /* signal what bitplane is being passed via the bitplane buffer */
-+ union {
-+ struct {
-+ uint32_t reference_distance_flag : 1;/* PICTURE_LAYER::REFDIST_FLAG */
-+ uint32_t reference_distance : 5;/* PICTURE_LAYER::REFDIST */
-+ uint32_t num_reference_pictures: 1;/* PICTURE_LAYER::NUMREF */
-+ uint32_t reference_field_pic_indicator : 1;/* PICTURE_LAYER::REFFIELD */
-+ } bits;
-+ uint32_t value;
-+ } reference_fields;
-+ union {
-+ struct {
-+ uint32_t mv_mode : 3; /* PICTURE_LAYER::MVMODE */
-+ uint32_t mv_mode2 : 3; /* PICTURE_LAYER::MVMODE2 */
-+ uint32_t mv_table : 3; /* PICTURE_LAYER::MVTAB/IMVTAB */
-+ uint32_t two_mv_block_pattern_table: 2; /* PICTURE_LAYER::2MVBPTAB */
-+ uint32_t four_mv_switch : 1; /* PICTURE_LAYER::4MVSWITCH */
-+ uint32_t four_mv_block_pattern_table : 2; /* PICTURE_LAYER::4MVBPTAB */
-+ uint32_t extended_mv_flag : 1; /* ENTRY_POINT_LAYER::EXTENDED_MV */
-+ uint32_t extended_mv_range : 2; /* PICTURE_LAYER::MVRANGE */
-+ uint32_t extended_dmv_flag : 1; /* ENTRY_POINT_LAYER::EXTENDED_DMV */
-+ uint32_t extended_dmv_range : 2; /* PICTURE_LAYER::DMVRANGE */
-+ } bits;
-+ uint32_t value;
-+ } mv_fields;
-+ union {
-+ struct {
-+ uint32_t dquant : 2; /* ENTRY_POINT_LAYER::DQUANT */
-+ uint32_t quantizer : 2; /* ENTRY_POINT_LAYER::QUANTIZER */
-+ uint32_t half_qp : 1; /* PICTURE_LAYER::HALFQP */
-+ uint32_t pic_quantizer_scale : 5;/* PICTURE_LAYER::PQUANT */
-+ uint32_t pic_quantizer_type : 1;/* PICTURE_LAYER::PQUANTIZER */
-+ uint32_t dq_frame : 1; /* VOPDQUANT::DQUANTFRM */
-+ uint32_t dq_profile : 2; /* VOPDQUANT::DQPROFILE */
-+ uint32_t dq_sb_edge : 2; /* VOPDQUANT::DQSBEDGE */
-+ uint32_t dq_db_edge : 2; /* VOPDQUANT::DQDBEDGE */
-+ uint32_t dq_binary_level : 1; /* VOPDQUANT::DQBILEVEL */
-+ uint32_t alt_pic_quantizer : 5;/* VOPDQUANT::ALTPQUANT */
-+ } bits;
-+ uint32_t value;
-+ } pic_quantizer_fields;
-+ union {
-+ struct {
-+ uint32_t variable_sized_transform_flag : 1;/* ENTRY_POINT_LAYER::VSTRANSFORM */
-+ uint32_t mb_level_transform_type_flag : 1;/* PICTURE_LAYER::TTMBF */
-+ uint32_t frame_level_transform_type : 2;/* PICTURE_LAYER::TTFRM */
-+ uint32_t transform_ac_codingset_idx1 : 2;/* PICTURE_LAYER::TRANSACFRM */
-+ uint32_t transform_ac_codingset_idx2 : 2;/* PICTURE_LAYER::TRANSACFRM2 */
-+ uint32_t intra_transform_dc_table : 1;/* PICTURE_LAYER::TRANSDCTAB */
-+ } bits;
-+ uint32_t value;
-+ } transform_fields;
-+
-+ uint8_t luma_scale2; /* PICTURE_LAYER::LUMSCALE2 */
-+ uint8_t luma_shift2; /* PICTURE_LAYER::LUMSHIFT2 */
-+ uint8_t intensity_compensation_field; /* Index for PICTURE_LAYER::INTCOMPFIELD value in Table 109 (9.1.1.48) */
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_MEDIUM - 1];
-+} VAPictureParameterBufferVC1;
-+
-+/** VC-1 Bitplane Buffer
-+There will be at most three bitplanes coded in any picture header. To send
-+the bitplane data more efficiently, each byte is divided in two nibbles, with
-+each nibble carrying three bitplanes for one macroblock. The following table
-+shows the bitplane data arrangement within each nibble based on the picture
-+type.
-+
-+Picture Type Bit3 Bit2 Bit1 Bit0
-+I or BI OVERFLAGS ACPRED FIELDTX
-+P MYTYPEMB SKIPMB DIRECTMB
-+B FORWARDMB SKIPMB DIRECTMB
-+
-+Within each byte, the lower nibble is for the first MB and the upper nibble is
-+for the second MB. E.g. the lower nibble of the first byte in the bitplane
-+buffer is for Macroblock #1 and the upper nibble of the first byte is for
-+Macroblock #2 in the first row.
-+*/
-+
-+/* VC-1 Slice Parameter Buffer */
-+typedef struct _VASliceParameterBufferVC1
-+{
-+ uint32_t slice_data_size;/* number of bytes in the slice data buffer for this slice */
-+ uint32_t slice_data_offset;/* the offset to the first byte of slice data */
-+ uint32_t slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
-+ uint32_t macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
-+ uint32_t slice_vertical_position;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VASliceParameterBufferVC1;
-+
-+/* VC-1 Slice Data Buffer */
-+/*
-+This is simplely a buffer containing raw bit-stream bytes
-+*/
-+
-+/****************************
-+ * H.264/AVC data structures
-+ ****************************/
-+
-+typedef struct _VAPictureH264
-+{
-+ VASurfaceID picture_id;
-+ uint32_t frame_idx;
-+ uint32_t flags;
-+ int32_t TopFieldOrderCnt;
-+ int32_t BottomFieldOrderCnt;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAPictureH264;
-+/* flags in VAPictureH264 could be OR of the following */
-+#define VA_PICTURE_H264_INVALID 0x00000001
-+#define VA_PICTURE_H264_TOP_FIELD 0x00000002
-+#define VA_PICTURE_H264_BOTTOM_FIELD 0x00000004
-+#define VA_PICTURE_H264_SHORT_TERM_REFERENCE 0x00000008
-+#define VA_PICTURE_H264_LONG_TERM_REFERENCE 0x00000010
-+
-+/** H.264 Picture Parameter Buffer */
-+/*
-+ * For each picture, and before any slice data, a single
-+ * picture parameter buffer must be send.
-+ */
-+typedef struct _VAPictureParameterBufferH264
-+{
-+ VAPictureH264 CurrPic;
-+ VAPictureH264 ReferenceFrames[16]; /* in DPB */
-+ uint16_t picture_width_in_mbs_minus1;
-+ uint16_t picture_height_in_mbs_minus1;
-+ uint8_t bit_depth_luma_minus8;
-+ uint8_t bit_depth_chroma_minus8;
-+ uint8_t num_ref_frames;
-+ union {
-+ struct {
-+ uint32_t chroma_format_idc : 2;
-+ uint32_t residual_colour_transform_flag : 1; /* Renamed to separate_colour_plane_flag in newer standard versions. */
-+ uint32_t gaps_in_frame_num_value_allowed_flag : 1;
-+ uint32_t frame_mbs_only_flag : 1;
-+ uint32_t mb_adaptive_frame_field_flag : 1;
-+ uint32_t direct_8x8_inference_flag : 1;
-+ uint32_t MinLumaBiPredSize8x8 : 1; /* see A.3.3.2 */
-+ uint32_t log2_max_frame_num_minus4 : 4;
-+ uint32_t pic_order_cnt_type : 2;
-+ uint32_t log2_max_pic_order_cnt_lsb_minus4 : 4;
-+ uint32_t delta_pic_order_always_zero_flag : 1;
-+ } bits;
-+ uint32_t value;
-+ } seq_fields;
-+ // FMO is not supported.
-+ va_deprecated uint8_t num_slice_groups_minus1;
-+ va_deprecated uint8_t slice_group_map_type;
-+ va_deprecated uint16_t slice_group_change_rate_minus1;
-+ int8_t pic_init_qp_minus26;
-+ int8_t pic_init_qs_minus26;
-+ int8_t chroma_qp_index_offset;
-+ int8_t second_chroma_qp_index_offset;
-+ union {
-+ struct {
-+ uint32_t entropy_coding_mode_flag : 1;
-+ uint32_t weighted_pred_flag : 1;
-+ uint32_t weighted_bipred_idc : 2;
-+ uint32_t transform_8x8_mode_flag : 1;
-+ uint32_t field_pic_flag : 1;
-+ uint32_t constrained_intra_pred_flag : 1;
-+ uint32_t pic_order_present_flag : 1; /* Renamed to bottom_field_pic_order_in_frame_present_flag in newer standard versions. */
-+ uint32_t deblocking_filter_control_present_flag : 1;
-+ uint32_t redundant_pic_cnt_present_flag : 1;
-+ uint32_t reference_pic_flag : 1; /* nal_ref_idc != 0 */
-+ } bits;
-+ uint32_t value;
-+ } pic_fields;
-+ uint16_t frame_num;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_MEDIUM];
-+} VAPictureParameterBufferH264;
-+
-+/** H.264 Inverse Quantization Matrix Buffer */
-+typedef struct _VAIQMatrixBufferH264
-+{
-+ /** \brief 4x4 scaling list, in raster scan order. */
-+ uint8_t ScalingList4x4[6][16];
-+ /** \brief 8x8 scaling list, in raster scan order. */
-+ uint8_t ScalingList8x8[2][64];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAIQMatrixBufferH264;
-+
-+/** H.264 Slice Parameter Buffer */
-+typedef struct _VASliceParameterBufferH264
-+{
-+ uint32_t slice_data_size;/* number of bytes in the slice data buffer for this slice */
-+ /** \brief Byte offset to the NAL Header Unit for this slice. */
-+ uint32_t slice_data_offset;
-+ uint32_t slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
-+ /**
-+ * \brief Bit offset from NAL Header Unit to the begining of slice_data().
-+ *
-+ * This bit offset is relative to and includes the NAL unit byte
-+ * and represents the number of bits parsed in the slice_header()
-+ * after the removal of any emulation prevention bytes in
-+ * there. However, the slice data buffer passed to the hardware is
-+ * the original bitstream, thus including any emulation prevention
-+ * bytes.
-+ */
-+ uint16_t slice_data_bit_offset;
-+ uint16_t first_mb_in_slice;
-+ uint8_t slice_type;
-+ uint8_t direct_spatial_mv_pred_flag;
-+ /**
-+ * H264/AVC syntax element
-+ *
-+ * if num_ref_idx_active_override_flag equals 0, host decoder should
-+ * set its value to num_ref_idx_l0_default_active_minus1.
-+ */
-+ uint8_t num_ref_idx_l0_active_minus1;
-+ /**
-+ * H264/AVC syntax element
-+ *
-+ * if num_ref_idx_active_override_flag equals 0, host decoder should
-+ * set its value to num_ref_idx_l1_default_active_minus1.
-+ */
-+ uint8_t num_ref_idx_l1_active_minus1;
-+ uint8_t cabac_init_idc;
-+ int8_t slice_qp_delta;
-+ uint8_t disable_deblocking_filter_idc;
-+ int8_t slice_alpha_c0_offset_div2;
-+ int8_t slice_beta_offset_div2;
-+ VAPictureH264 RefPicList0[32]; /* See 8.2.4.2 */
-+ VAPictureH264 RefPicList1[32]; /* See 8.2.4.2 */
-+ uint8_t luma_log2_weight_denom;
-+ uint8_t chroma_log2_weight_denom;
-+ uint8_t luma_weight_l0_flag;
-+ int16_t luma_weight_l0[32];
-+ int16_t luma_offset_l0[32];
-+ uint8_t chroma_weight_l0_flag;
-+ int16_t chroma_weight_l0[32][2];
-+ int16_t chroma_offset_l0[32][2];
-+ uint8_t luma_weight_l1_flag;
-+ int16_t luma_weight_l1[32];
-+ int16_t luma_offset_l1[32];
-+ uint8_t chroma_weight_l1_flag;
-+ int16_t chroma_weight_l1[32][2];
-+ int16_t chroma_offset_l1[32][2];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VASliceParameterBufferH264;
-+
-+/****************************
-+ * Common encode data structures
-+ ****************************/
-+typedef enum
-+{
-+ VAEncPictureTypeIntra = 0,
-+ VAEncPictureTypePredictive = 1,
-+ VAEncPictureTypeBidirectional = 2,
-+} VAEncPictureType;
-+
-+/**
-+ * \brief Encode Slice Parameter Buffer.
-+ *
-+ * @deprecated
-+ * This is a deprecated encode slice parameter buffer, All applications
-+ * \c can use VAEncSliceParameterBufferXXX (XXX = MPEG2, HEVC, H264, JPEG)
-+ */
-+typedef struct _VAEncSliceParameterBuffer
-+{
-+ uint32_t start_row_number; /* starting MB row number for this slice */
-+ uint32_t slice_height; /* slice height measured in MB */
-+ union {
-+ struct {
-+ uint32_t is_intra : 1;
-+ uint32_t disable_deblocking_filter_idc : 2;
-+ uint32_t uses_long_term_ref :1;
-+ uint32_t is_long_term_ref :1;
-+ } bits;
-+ uint32_t value;
-+ } slice_flags;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncSliceParameterBuffer;
-+
-+
-+/****************************
-+ * H.263 specific encode data structures
-+ ****************************/
-+
-+typedef struct _VAEncSequenceParameterBufferH263
-+{
-+ uint32_t intra_period;
-+ uint32_t bits_per_second;
-+ uint32_t frame_rate;
-+ uint32_t initial_qp;
-+ uint32_t min_qp;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncSequenceParameterBufferH263;
-+
-+typedef struct _VAEncPictureParameterBufferH263
-+{
-+ VASurfaceID reference_picture;
-+ VASurfaceID reconstructed_picture;
-+ VABufferID coded_buf;
-+ uint16_t picture_width;
-+ uint16_t picture_height;
-+ VAEncPictureType picture_type;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncPictureParameterBufferH263;
-+
-+/****************************
-+ * MPEG-4 specific encode data structures
-+ ****************************/
-+
-+typedef struct _VAEncSequenceParameterBufferMPEG4
-+{
-+ uint8_t profile_and_level_indication;
-+ uint32_t intra_period;
-+ uint32_t video_object_layer_width;
-+ uint32_t video_object_layer_height;
-+ uint32_t vop_time_increment_resolution;
-+ uint32_t fixed_vop_rate;
-+ uint32_t fixed_vop_time_increment;
-+ uint32_t bits_per_second;
-+ uint32_t frame_rate;
-+ uint32_t initial_qp;
-+ uint32_t min_qp;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncSequenceParameterBufferMPEG4;
-+
-+typedef struct _VAEncPictureParameterBufferMPEG4
-+{
-+ VASurfaceID reference_picture;
-+ VASurfaceID reconstructed_picture;
-+ VABufferID coded_buf;
-+ uint16_t picture_width;
-+ uint16_t picture_height;
-+ uint32_t modulo_time_base; /* number of 1s */
-+ uint32_t vop_time_increment;
-+ VAEncPictureType picture_type;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAEncPictureParameterBufferMPEG4;
-+
-+
-+
-+/** Buffer functions */
-+
-+/**
-+ * Creates a buffer for "num_elements" elements of "size" bytes and
-+ * initalize with "data".
-+ * if "data" is null, then the contents of the buffer data store
-+ * are undefined.
-+ * Basically there are two ways to get buffer data to the server side. One is
-+ * to call vaCreateBuffer() with a non-null "data", which results the data being
-+ * copied to the data store on the server side. A different method that
-+ * eliminates this copy is to pass null as "data" when calling vaCreateBuffer(),
-+ * and then use vaMapBuffer() to map the data store from the server side to the
-+ * client address space for access.
-+ * The user must call vaDestroyBuffer() to destroy a buffer.
-+ * Note: image buffers are created by the library, not the client. Please see
-+ * vaCreateImage on how image buffers are managed.
-+ */
-+VAStatus vaCreateBuffer (
-+ VADisplay dpy,
-+ VAContextID context,
-+ VABufferType type, /* in */
-+ unsigned int size, /* in */
-+ unsigned int num_elements, /* in */
-+ void *data, /* in */
-+ VABufferID *buf_id /* out */
-+);
-+
-+/**
-+ * Create a buffer for given width & height get unit_size, pitch, buf_id for 2D buffer
-+ * for permb qp buffer, it will return unit_size for one MB or LCU and the pitch for alignments
-+ * can call vaMapBuffer with this Buffer ID to get virtual address.
-+ * e.g. AVC 1080P encode, 1920x1088, the size in MB is 120x68,but inside driver,
-+ * maybe it should align with 256, and one byte present one Qp.so, call the function.
-+ * then get unit_size = 1, pitch = 256. call vaMapBuffer to get the virtual address (pBuf).
-+ * then read write the memory like 2D. the size is 256x68, application can only use 120x68
-+ * pBuf + 256 is the start of next line.
-+ * different driver implementation maybe return different unit_size and pitch
-+ */
-+VAStatus vaCreateBuffer2(
-+ VADisplay dpy,
-+ VAContextID context,
-+ VABufferType type,
-+ unsigned int width,
-+ unsigned int height,
-+ unsigned int *unit_size,
-+ unsigned int *pitch,
-+ VABufferID *buf_id
-+);
-+
-+/**
-+ * Convey to the server how many valid elements are in the buffer.
-+ * e.g. if multiple slice parameters are being held in a single buffer,
-+ * this will communicate to the server the number of slice parameters
-+ * that are valid in the buffer.
-+ */
-+VAStatus vaBufferSetNumElements (
-+ VADisplay dpy,
-+ VABufferID buf_id, /* in */
-+ unsigned int num_elements /* in */
-+);
-+
-+
-+/**
-+ * device independent data structure for codedbuffer
-+ */
-+
-+/*
-+ * FICTURE_AVE_QP(bit7-0): The average Qp value used during this frame
-+ * LARGE_SLICE(bit8):At least one slice in the current frame was large
-+ * enough for the encoder to attempt to limit its size.
-+ * SLICE_OVERFLOW(bit9): At least one slice in the current frame has
-+ * exceeded the maximum slice size specified.
-+ * BITRATE_OVERFLOW(bit10): The peak bitrate was exceeded for this frame.
-+ * BITRATE_HIGH(bit11): The frame size got within the safety margin of the maximum size (VCM only)
-+ * AIR_MB_OVER_THRESHOLD: the number of MBs adapted to Intra MB
-+ */
-+#define VA_CODED_BUF_STATUS_PICTURE_AVE_QP_MASK 0xff
-+#define VA_CODED_BUF_STATUS_LARGE_SLICE_MASK 0x100
-+#define VA_CODED_BUF_STATUS_SLICE_OVERFLOW_MASK 0x200
-+#define VA_CODED_BUF_STATUS_BITRATE_OVERFLOW 0x400
-+#define VA_CODED_BUF_STATUS_BITRATE_HIGH 0x800
-+/**
-+ * \brief The frame has exceeded the maximum requested size.
-+ *
-+ * This flag indicates that the encoded frame size exceeds the value
-+ * specified through a misc parameter buffer of type
-+ * #VAEncMiscParameterTypeMaxFrameSize.
-+ */
-+#define VA_CODED_BUF_STATUS_FRAME_SIZE_OVERFLOW 0x1000
-+/**
-+ * \brief the bitstream is bad or corrupt.
-+ */
-+#define VA_CODED_BUF_STATUS_BAD_BITSTREAM 0x8000
-+#define VA_CODED_BUF_STATUS_AIR_MB_OVER_THRESHOLD 0xff0000
-+
-+/**
-+ * \brief The coded buffer segment status contains frame encoding passes number
-+ *
-+ * This is the mask to get the number of encoding passes from the coded
-+ * buffer segment status.
-+ * NUMBER_PASS(bit24~bit27): the number for encoding passes executed for the coded frame.
-+ *
-+ */
-+#define VA_CODED_BUF_STATUS_NUMBER_PASSES_MASK 0xf000000
-+
-+/**
-+ * \brief The coded buffer segment contains a single NAL unit.
-+ *
-+ * This flag indicates that the coded buffer segment contains a
-+ * single NAL unit. This flag might be useful to the user for
-+ * processing the coded buffer.
-+ */
-+#define VA_CODED_BUF_STATUS_SINGLE_NALU 0x10000000
-+
-+/**
-+ * \brief Coded buffer segment.
-+ *
-+ * #VACodedBufferSegment is an element of a linked list describing
-+ * some information on the coded buffer. The coded buffer segment
-+ * could contain either a single NAL unit, or more than one NAL unit.
-+ * It is recommended (but not required) to return a single NAL unit
-+ * in a coded buffer segment, and the implementation should set the
-+ * VA_CODED_BUF_STATUS_SINGLE_NALU status flag if that is the case.
-+ */
-+typedef struct _VACodedBufferSegment {
-+ /**
-+ * \brief Size of the data buffer in this segment (in bytes).
-+ */
-+ uint32_t size;
-+ /** \brief Bit offset into the data buffer where the video data starts. */
-+ uint32_t bit_offset;
-+ /** \brief Status set by the driver. See \c VA_CODED_BUF_STATUS_*. */
-+ uint32_t status;
-+ /** \brief Reserved for future use. */
-+ uint32_t reserved;
-+ /** \brief Pointer to the start of the data buffer. */
-+ void *buf;
-+ /**
-+ * \brief Pointer to the next #VACodedBufferSegment element,
-+ * or \c NULL if there is none.
-+ */
-+ void *next;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VACodedBufferSegment;
-+
-+/**
-+ * Map data store of the buffer into the client's address space
-+ * vaCreateBuffer() needs to be called with "data" set to NULL before
-+ * calling vaMapBuffer()
-+ *
-+ * if buffer type is VAEncCodedBufferType, pbuf points to link-list of
-+ * VACodedBufferSegment, and the list is terminated if "next" is NULL
-+ */
-+VAStatus vaMapBuffer (
-+ VADisplay dpy,
-+ VABufferID buf_id, /* in */
-+ void **pbuf /* out */
-+);
-+
-+/**
-+ * After client making changes to a mapped data store, it needs to
-+ * "Unmap" it to let the server know that the data is ready to be
-+ * consumed by the server
-+ */
-+VAStatus vaUnmapBuffer (
-+ VADisplay dpy,
-+ VABufferID buf_id /* in */
-+);
-+
-+/**
-+ * After this call, the buffer is deleted and this buffer_id is no longer valid
-+ *
-+ * A buffer can be re-used and sent to the server by another Begin/Render/End
-+ * sequence if vaDestroyBuffer() is not called with this buffer.
-+ *
-+ * Note re-using a shared buffer (e.g. a slice data buffer) between the host and the
-+ * hardware accelerator can result in performance dropping.
-+ */
-+VAStatus vaDestroyBuffer (
-+ VADisplay dpy,
-+ VABufferID buffer_id
-+);
-+
-+/** \brief VA buffer information */
-+typedef struct {
-+ /** \brief Buffer handle */
-+ uintptr_t handle;
-+ /** \brief Buffer type (See \ref VABufferType). */
-+ uint32_t type;
-+ /**
-+ * \brief Buffer memory type (See \ref VASurfaceAttribMemoryType).
-+ *
-+ * On input to vaAcquireBufferHandle(), this field can serve as a hint
-+ * to specify the set of memory types the caller is interested in.
-+ * On successful return from vaAcquireBufferHandle(), the field is
-+ * updated with the best matching memory type.
-+ */
-+ uint32_t mem_type;
-+ /** \brief Size of the underlying buffer. */
-+ size_t mem_size;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VABufferInfo;
-+
-+/**
-+ * \brief Acquires buffer handle for external API usage
-+ *
-+ * Locks the VA buffer object \ref buf_id for external API usage like
-+ * EGL or OpenCL (OCL). This function is a synchronization point. This
-+ * means that any pending operation is guaranteed to be completed
-+ * prior to returning from the function.
-+ *
-+ * If the referenced VA buffer object is the backing store of a VA
-+ * surface, then this function acts as if vaSyncSurface() on the
-+ * parent surface was called first.
-+ *
-+ * The \ref VABufferInfo argument shall be zero'ed on input. On
-+ * successful output, the data structure is filled in with all the
-+ * necessary buffer level implementation details like handle, type,
-+ * memory type and memory size.
-+ *
-+ * Note: the external API implementation, or the application, can
-+ * express the memory types it is interested in by filling in the \ref
-+ * mem_type field accordingly. On successful output, the memory type
-+ * that fits best the request and that was used is updated in the \ref
-+ * VABufferInfo data structure. If none of the supplied memory types
-+ * is supported, then a \ref VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE
-+ * error is returned.
-+ *
-+ * The \ref VABufferInfo data is valid until vaReleaseBufferHandle()
-+ * is called. Besides, no additional operation is allowed on any of
-+ * the buffer parent object until vaReleaseBufferHandle() is called.
-+ * e.g. decoding into a VA surface backed with the supplied VA buffer
-+ * object \ref buf_id would fail with a \ref VA_STATUS_ERROR_SURFACE_BUSY
-+ * error.
-+ *
-+ * Possible errors:
-+ * - \ref VA_STATUS_ERROR_UNIMPLEMENTED: the VA driver implementation
-+ * does not support this interface
-+ * - \ref VA_STATUS_ERROR_INVALID_DISPLAY: an invalid display was supplied
-+ * - \ref VA_STATUS_ERROR_INVALID_BUFFER: an invalid buffer was supplied
-+ * - \ref VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE: the implementation
-+ * does not support exporting buffers of the specified type
-+ * - \ref VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE: none of the requested
-+ * memory types in \ref VABufferInfo.mem_type was supported
-+ *
-+ * @param[in] dpy the VA display
-+ * @param[in] buf_id the VA buffer
-+ * @param[in,out] buf_info the associated VA buffer information
-+ * @return VA_STATUS_SUCCESS if successful
-+ */
-+VAStatus
-+vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo *buf_info);
-+
-+/**
-+ * \brief Releases buffer after usage from external API
-+ *
-+ * Unlocks the VA buffer object \ref buf_id from external API usage like
-+ * EGL or OpenCL (OCL). This function is a synchronization point. This
-+ * means that any pending operation is guaranteed to be completed
-+ * prior to returning from the function.
-+ *
-+ * The \ref VABufferInfo argument shall point to the original data
-+ * structure that was obtained from vaAcquireBufferHandle(), unaltered.
-+ * This is necessary so that the VA driver implementation could
-+ * deallocate any resources that were needed.
-+ *
-+ * In any case, returning from this function invalidates any contents
-+ * in \ref VABufferInfo. i.e. the underlyng buffer handle is no longer
-+ * valid. Therefore, VA driver implementations are free to reset this
-+ * data structure to safe defaults.
-+ *
-+ * Possible errors:
-+ * - \ref VA_STATUS_ERROR_UNIMPLEMENTED: the VA driver implementation
-+ * does not support this interface
-+ * - \ref VA_STATUS_ERROR_INVALID_DISPLAY: an invalid display was supplied
-+ * - \ref VA_STATUS_ERROR_INVALID_BUFFER: an invalid buffer was supplied
-+ * - \ref VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE: the implementation
-+ * does not support exporting buffers of the specified type
-+ *
-+ * @param[in] dpy the VA display
-+ * @param[in] buf_id the VA buffer
-+ * @return VA_STATUS_SUCCESS if successful
-+ */
-+VAStatus
-+vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id);
-+
-+/** @name vaExportSurfaceHandle() flags
-+ *
-+ * @{
-+ */
-+/** Export surface to be read by external API. */
-+#define VA_EXPORT_SURFACE_READ_ONLY 0x0001
-+/** Export surface to be written by external API. */
-+#define VA_EXPORT_SURFACE_WRITE_ONLY 0x0002
-+/** Export surface to be both read and written by external API. */
-+#define VA_EXPORT_SURFACE_READ_WRITE 0x0003
-+/** Export surface with separate layers.
-+ *
-+ * For example, NV12 surfaces should be exported as two separate
-+ * planes for luma and chroma.
-+ */
-+#define VA_EXPORT_SURFACE_SEPARATE_LAYERS 0x0004
-+/** Export surface with composed layers.
-+ *
-+ * For example, NV12 surfaces should be exported as a single NV12
-+ * composed object.
-+ */
-+#define VA_EXPORT_SURFACE_COMPOSED_LAYERS 0x0008
-+
-+/** @} */
-+
-+/**
-+ * \brief Export a handle to a surface for use with an external API
-+ *
-+ * The exported handles are owned by the caller, and the caller is
-+ * responsible for freeing them when no longer needed (e.g. by closing
-+ * DRM PRIME file descriptors).
-+ *
-+ * This does not perform any synchronisation. If the contents of the
-+ * surface will be read, vaSyncSurface() must be called before doing so.
-+ * If the contents of the surface are written, then all operations must
-+ * be completed externally before using the surface again by via VA-API
-+ * functions.
-+ *
-+ * @param[in] dpy VA display.
-+ * @param[in] surface_id Surface to export.
-+ * @param[in] mem_type Memory type to export to.
-+ * @param[in] flags Combination of flags to apply
-+ * (VA_EXPORT_SURFACE_*).
-+ * @param[out] descriptor Pointer to the descriptor structure to fill
-+ * with the handle details. The type of this structure depends on
-+ * the value of mem_type.
-+ *
-+ * @return Status code:
-+ * - VA_STATUS_SUCCESS: Success.
-+ * - VA_STATUS_ERROR_INVALID_DISPLAY: The display is not valid.
-+ * - VA_STATUS_ERROR_UNIMPLEMENTED: The driver does not implement
-+ * this interface.
-+ * - VA_STATUS_ERROR_INVALID_SURFACE: The surface is not valid, or
-+ * the surface is not exportable in the specified way.
-+ * - VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE: The driver does not
-+ * support exporting surfaces to the specified memory type.
-+ */
-+VAStatus vaExportSurfaceHandle(VADisplay dpy,
-+ VASurfaceID surface_id,
-+ uint32_t mem_type, uint32_t flags,
-+ void *descriptor);
-+
-+/**
-+ * Render (Video Decode/Encode/Processing) Pictures
-+ *
-+ * A picture represents either a frame or a field.
-+ *
-+ * The Begin/Render/End sequence sends the video decode/encode/processing buffers
-+ * to the server
-+ */
-+
-+/**
-+ * Get ready for a video pipeline
-+ * - decode a picture to a target surface
-+ * - encode a picture from a target surface
-+ * - process a picture to a target surface
-+ */
-+VAStatus vaBeginPicture (
-+ VADisplay dpy,
-+ VAContextID context,
-+ VASurfaceID render_target
-+);
-+
-+/**
-+ * Send video decode, encode or processing buffers to the server.
-+ */
-+VAStatus vaRenderPicture (
-+ VADisplay dpy,
-+ VAContextID context,
-+ VABufferID *buffers,
-+ int num_buffers
-+);
-+
-+/**
-+ * Make the end of rendering for a picture.
-+ * The server should start processing all pending operations for this
-+ * surface. This call is non-blocking. The client can start another
-+ * Begin/Render/End sequence on a different render target.
-+ * if VAContextID used in this function previously successfully passed
-+ * vaMFAddContext call, real processing will be started during vaMFSubmit
-+ */
-+VAStatus vaEndPicture (
-+ VADisplay dpy,
-+ VAContextID context
-+);
-+
-+/**
-+ * Make the end of rendering for a pictures in contexts passed with submission.
-+ * The server should start processing all pending operations for contexts.
-+ * All contexts passed should be associated through vaMFAddContext
-+ * and call sequence Begin/Render/End performed.
-+ * This call is non-blocking. The client can start another
-+ * Begin/Render/End/vaMFSubmit sequence on a different render targets.
-+ * Return values:
-+ * VA_STATUS_SUCCESS - operation successful, context was removed.
-+ * VA_STATUS_ERROR_INVALID_CONTEXT - mf_context or one of contexts are invalid
-+ * due to mf_context not created or one of contexts not assotiated with mf_context
-+ * through vaAddContext.
-+ * VA_STATUS_ERROR_INVALID_PARAMETER - one of context has not submitted it's frame
-+ * through vaBeginPicture vaRenderPicture vaEndPicture call sequence.
-+ * dpy: display
-+ * mf_context: Multi-Frame context
-+ * contexts: list of contexts submitting their tasks for multi-frame operation.
-+ * num_contexts: number of passed contexts.
-+ */
-+VAStatus vaMFSubmit (
-+ VADisplay dpy,
-+ VAMFContextID mf_context,
-+ VAContextID * contexts,
-+ int num_contexts
-+);
-+
-+/*
-+
-+Synchronization
-+
-+*/
-+
-+/**
-+ * This function blocks until all pending operations on the render target
-+ * have been completed. Upon return it is safe to use the render target for a
-+ * different picture.
-+ */
-+VAStatus vaSyncSurface (
-+ VADisplay dpy,
-+ VASurfaceID render_target
-+);
-+
-+typedef enum
-+{
-+ VASurfaceRendering = 1, /* Rendering in progress */
-+ VASurfaceDisplaying = 2, /* Displaying in progress (not safe to render into it) */
-+ /* this status is useful if surface is used as the source */
-+ /* of an overlay */
-+ VASurfaceReady = 4, /* not being rendered or displayed */
-+ VASurfaceSkipped = 8 /* Indicate a skipped frame during encode */
-+} VASurfaceStatus;
-+
-+/**
-+ * Find out any pending ops on the render target
-+ */
-+VAStatus vaQuerySurfaceStatus (
-+ VADisplay dpy,
-+ VASurfaceID render_target,
-+ VASurfaceStatus *status /* out */
-+);
-+
-+typedef enum
-+{
-+ VADecodeSliceMissing = 0,
-+ VADecodeMBError = 1,
-+} VADecodeErrorType;
-+
-+/**
-+ * Client calls vaQuerySurfaceError with VA_STATUS_ERROR_DECODING_ERROR, server side returns
-+ * an array of structure VASurfaceDecodeMBErrors, and the array is terminated by setting status=-1
-+*/
-+typedef struct _VASurfaceDecodeMBErrors
-+{
-+ int32_t status; /* 1 if hardware has returned detailed info below, -1 means this record is invalid */
-+ uint32_t start_mb; /* start mb address with errors */
-+ uint32_t end_mb; /* end mb address with errors */
-+ VADecodeErrorType decode_error_type;
-+ uint32_t num_mb; /* number of mbs with errors */
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW - 1];
-+} VASurfaceDecodeMBErrors;
-+
-+/**
-+ * After the application gets VA_STATUS_ERROR_DECODING_ERROR after calling vaSyncSurface(),
-+ * it can call vaQuerySurfaceError to find out further details on the particular error.
-+ * VA_STATUS_ERROR_DECODING_ERROR should be passed in as "error_status",
-+ * upon the return, error_info will point to an array of _VASurfaceDecodeMBErrors structure,
-+ * which is allocated and filled by libVA with detailed information on the missing or error macroblocks.
-+ * The array is terminated if "status==-1" is detected.
-+ */
-+VAStatus vaQuerySurfaceError(
-+ VADisplay dpy,
-+ VASurfaceID surface,
-+ VAStatus error_status,
-+ void **error_info
-+);
-+
-+/**
-+ * Images and Subpictures
-+ * VAImage is used to either get the surface data to client memory, or
-+ * to copy image data in client memory to a surface.
-+ * Both images, subpictures and surfaces follow the same 2D coordinate system where origin
-+ * is at the upper left corner with positive X to the right and positive Y down
-+ */
-+#define VA_FOURCC(ch0, ch1, ch2, ch3) \
-+ ((unsigned long)(unsigned char) (ch0) | ((unsigned long)(unsigned char) (ch1) << 8) | \
-+ ((unsigned long)(unsigned char) (ch2) << 16) | ((unsigned long)(unsigned char) (ch3) << 24 ))
-+
-+/* Pre-defined fourcc codes. */
-+
-+/** NV12: two-plane 8-bit YUV 4:2:0.
-+ * The first plane contains Y, the second plane contains U and V in pairs of bytes.
-+ */
-+#define VA_FOURCC_NV12 0x3231564E
-+/** NV21: two-plane 8-bit YUV 4:2:0.
-+ * Same as NV12, but with U and V swapped.
-+ */
-+#define VA_FOURCC_NV21 0x3132564E
-+
-+/** AI44: packed 4-bit YA.
-+ *
-+ * The bottom half of each byte contains luma, the top half contains alpha.
-+ */
-+#define VA_FOURCC_AI44 0x34344149
-+
-+/** RGBA: packed 8-bit RGBA.
-+ *
-+ * Four bytes per pixel: red, green, blue, alpha.
-+ */
-+#define VA_FOURCC_RGBA 0x41424752
-+/** RGBX: packed 8-bit RGB.
-+ *
-+ * Four bytes per pixel: red, green, blue, unspecified.
-+ */
-+#define VA_FOURCC_RGBX 0x58424752
-+/** BGRA: packed 8-bit RGBA.
-+ *
-+ * Four bytes per pixel: blue, green, red, alpha.
-+ */
-+#define VA_FOURCC_BGRA 0x41524742
-+/** BGRX: packed 8-bit RGB.
-+ *
-+ * Four bytes per pixel: blue, green, red, unspecified.
-+ */
-+#define VA_FOURCC_BGRX 0x58524742
-+/** ARGB: packed 8-bit RGBA.
-+ *
-+ * Four bytes per pixel: alpha, red, green, blue.
-+ */
-+#define VA_FOURCC_ARGB 0x42475241
-+/** XRGB: packed 8-bit RGB.
-+ *
-+ * Four bytes per pixel: unspecified, red, green, blue.
-+ */
-+#define VA_FOURCC_XRGB 0x42475258
-+/** ABGR: packed 8-bit RGBA.
-+ *
-+ * Four bytes per pixel: alpha, blue, green, red.
-+ */
-+#define VA_FOURCC_ABGR 0x52474241
-+/** XBGR: packed 8-bit RGB.
-+ *
-+ * Four bytes per pixel: unspecified, blue, green, red.
-+ */
-+#define VA_FOURCC_XBGR 0x52474258
-+
-+/** UYUV: packed 8-bit YUV 4:2:2.
-+ *
-+ * Four bytes per pair of pixels: U, Y, U, V.
-+ */
-+#define VA_FOURCC_UYVY 0x59565955
-+/** YUY2: packed 8-bit YUV 4:2:2.
-+ *
-+ * Four bytes per pair of pixels: Y, U, Y, V.
-+ */
-+#define VA_FOURCC_YUY2 0x32595559
-+/** AYUV: packed 8-bit YUVA 4:4:4.
-+ *
-+ * Four bytes per pixel: A, Y, U, V.
-+ */
-+#define VA_FOURCC_AYUV 0x56555941
-+/** NV11: two-plane 8-bit YUV 4:1:1.
-+ *
-+ * The first plane contains Y, the second plane contains U and V in pairs of bytes.
-+ */
-+#define VA_FOURCC_NV11 0x3131564e
-+/** YV12: three-plane 8-bit YUV 4:2:0.
-+ *
-+ * The three planes contain Y, V and U respectively.
-+ */
-+#define VA_FOURCC_YV12 0x32315659
-+/** P208: two-plane 8-bit YUV 4:2:2.
-+ *
-+ * The first plane contains Y, the second plane contains U and V in pairs of bytes.
-+ */
-+#define VA_FOURCC_P208 0x38303250
-+/** I420: three-plane 8-bit YUV 4:2:0.
-+ *
-+ * The three planes contain Y, U and V respectively.
-+ */
-+#define VA_FOURCC_I420 0x30323449
-+/** YV24: three-plane 8-bit YUV 4:4:4.
-+ *
-+ * The three planes contain Y, V and U respectively.
-+ */
-+#define VA_FOURCC_YV24 0x34325659
-+/** YV32: four-plane 8-bit YUVA 4:4:4
-+ *
-+ * The four planes contain Y, V, U and A respectively.
-+ */
-+#define VA_FOURCC_YV32 0x32335659
-+/** Y800: 8-bit greyscale.
-+ */
-+#define VA_FOURCC_Y800 0x30303859
-+/** IMC3: three-plane 8-bit YUV 4:2:0.
-+ *
-+ * Equivalent to YV12, but with the additional constraint that the pitch of all three planes
-+ * must be the same.
-+ */
-+#define VA_FOURCC_IMC3 0x33434D49
-+/** 411P: three-plane 8-bit YUV 4:1:1.
-+ *
-+ * The three planes contain Y, U and V respectively.
-+ */
-+#define VA_FOURCC_411P 0x50313134
-+/** 411R: three-plane 8-bit YUV.
-+ *
-+ * The subsampling is the transpose of 4:1:1 - full chroma appears on every fourth line.
-+ * The three planes contain Y, U and V respectively.
-+ */
-+#define VA_FOURCC_411R 0x52313134
-+/** 422H: three-plane 8-bit YUV 4:2:2.
-+ *
-+ * The three planes contain Y, U and V respectively.
-+ */
-+#define VA_FOURCC_422H 0x48323234
-+/** 422V: three-plane 8-bit YUV 4:4:0.
-+ *
-+ * The three planes contain Y, U and V respectively.
-+ */
-+#define VA_FOURCC_422V 0x56323234
-+/** 444P: three-plane 8-bit YUV 4:4:4.
-+ *
-+ * The three planes contain Y, U and V respectively.
-+ */
-+#define VA_FOURCC_444P 0x50343434
-+
-+/** RGBP: three-plane 8-bit RGB.
-+ *
-+ * The three planes contain red, green and blue respectively.
-+ */
-+#define VA_FOURCC_RGBP 0x50424752
-+/** BGRP: three-plane 8-bit RGB.
-+ *
-+ * The three planes contain blue, green and red respectively.
-+ */
-+#define VA_FOURCC_BGRP 0x50524742
-+/** RG16: packed 5/6-bit RGB.
-+ *
-+ * Each pixel is a two-byte little-endian value.
-+ * Red, green and blue are found in bits 15:11, 10:5, 4:0 respectively.
-+ */
-+#define VA_FOURCC_RGB565 0x36314752
-+/** BG16: packed 5/6-bit RGB.
-+ *
-+ * Each pixel is a two-byte little-endian value.
-+ * Blue, green and red are found in bits 15:11, 10:5, 4:0 respectively.
-+ */
-+#define VA_FOURCC_BGR565 0x36314742
-+
-+/** Y210: packed 10-bit YUV 4:2:2.
-+ *
-+ * Eight bytes represent a pair of pixels. Each sample is a two-byte little-endian value,
-+ * with the bottom six bits ignored. The samples are in the order Y, U, Y, V.
-+ */
-+#define VA_FOURCC_Y210 0x30313259
-+/** Y216: packed 16-bit YUV 4:2:2.
-+ *
-+ * Eight bytes represent a pair of pixels. Each sample is a two-byte little-endian value.
-+ * The samples are in the order Y, U, Y, V.
-+ */
-+#define VA_FOURCC_Y216 0x36313259
-+/** Y410: packed 10-bit YUVA 4:4:4.
-+ *
-+ * Each pixel is a four-byte little-endian value.
-+ * A, V, Y, U are found in bits 31:30, 29:20, 19:10, 9:0 respectively.
-+ */
-+#define VA_FOURCC_Y410 0x30313459
-+/** Y416: packed 16-bit YUVA 4:4:4.
-+ *
-+ * Each pixel is a set of four samples, each of which is a two-byte little-endian value.
-+ * The samples are in the order A, V, Y, U.
-+ */
-+#define VA_FOURCC_Y416 0x36313459
-+
-+/** YV16: three-plane 8-bit YUV 4:2:2.
-+ *
-+ * The three planes contain Y, V and U respectively.
-+ */
-+#define VA_FOURCC_YV16 0x36315659
-+/** P010: two-plane 10-bit YUV 4:2:0.
-+ *
-+ * Each sample is a two-byte little-endian value with the bottom six bits ignored.
-+ * The first plane contains Y, the second plane contains U and V in pairs of samples.
-+ */
-+#define VA_FOURCC_P010 0x30313050
-+/** P016: two-plane 16-bit YUV 4:2:0.
-+ *
-+ * Each sample is a two-byte little-endian value. The first plane contains Y, the second
-+ * plane contains U and V in pairs of samples.
-+ */
-+#define VA_FOURCC_P016 0x36313050
-+
-+/** I010: three-plane 10-bit YUV 4:2:0.
-+ *
-+ * Each sample is a two-byte little-endian value with the top six bits ignored.
-+ * The three planes contain Y, V and U respectively.
-+ */
-+#define VA_FOURCC_I010 0x30313049
-+
-+/** IYUV: three-plane 8-bit YUV 4:2:0.
-+ *
-+ * @deprecated Use I420 instead.
-+ */
-+#define VA_FOURCC_IYUV 0x56555949
-+/**
-+ * 10-bit Pixel RGB formats.
-+ */
-+#define VA_FOURCC_A2R10G10B10 0x30335241 /* VA_FOURCC('A','R','3','0') */
-+/**
-+ * 10-bit Pixel BGR formats.
-+ */
-+#define VA_FOURCC_A2B10G10R10 0x30334241 /* VA_FOURCC('A','B','3','0') */
-+
-+/** Y8: 8-bit greyscale.
-+ *
-+ * Only a single sample, 8 bit Y plane for monochrome images
-+ */
-+#define VA_FOURCC_Y8 0x20203859
-+/** Y16: 16-bit greyscale.
-+ *
-+ * Only a single sample, 16 bit Y plane for monochrome images
-+ */
-+#define VA_FOURCC_Y16 0x20363159
-+/** VYUV: packed 8-bit YUV 4:2:2.
-+ *
-+ * Four bytes per pair of pixels: V, Y, U, V.
-+ */
-+#define VA_FOURCC_VYUY 0x59555956
-+/** YVYU: packed 8-bit YUV 4:2:2.
-+ *
-+ * Four bytes per pair of pixels: Y, V, Y, U.
-+ */
-+#define VA_FOURCC_YVYU 0x55595659
-+/** AGRB64: three-plane 16-bit ARGB 16:16:16:16
-+ *
-+ * The four planes contain: alpha, red, green, blue respectively.
-+ */
-+#define VA_FOURCC_ARGB64 0x34475241
-+/** ABGR64: three-plane 16-bit ABGR 16:16:16:16
-+ *
-+ * The four planes contain: alpha, blue, green, red respectively.
-+ */
-+#define VA_FOURCC_ABGR64 0x34474241
-+
-+/* byte order */
-+#define VA_LSB_FIRST 1
-+#define VA_MSB_FIRST 2
-+
-+typedef struct _VAImageFormat
-+{
-+ uint32_t fourcc;
-+ uint32_t byte_order; /* VA_LSB_FIRST, VA_MSB_FIRST */
-+ uint32_t bits_per_pixel;
-+ /* for RGB formats */
-+ uint32_t depth; /* significant bits per pixel */
-+ uint32_t red_mask;
-+ uint32_t green_mask;
-+ uint32_t blue_mask;
-+ uint32_t alpha_mask;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAImageFormat;
-+
-+typedef VAGenericID VAImageID;
-+
-+typedef struct _VAImage
-+{
-+ VAImageID image_id; /* uniquely identify this image */
-+ VAImageFormat format;
-+ VABufferID buf; /* image data buffer */
-+ /*
-+ * Image data will be stored in a buffer of type VAImageBufferType to facilitate
-+ * data store on the server side for optimal performance. The buffer will be
-+ * created by the CreateImage function, and proper storage allocated based on the image
-+ * size and format. This buffer is managed by the library implementation, and
-+ * accessed by the client through the buffer Map/Unmap functions.
-+ */
-+ uint16_t width;
-+ uint16_t height;
-+ uint32_t data_size;
-+ uint32_t num_planes; /* can not be greater than 3 */
-+ /*
-+ * An array indicating the scanline pitch in bytes for each plane.
-+ * Each plane may have a different pitch. Maximum 3 planes for planar formats
-+ */
-+ uint32_t pitches[3];
-+ /*
-+ * An array indicating the byte offset from the beginning of the image data
-+ * to the start of each plane.
-+ */
-+ uint32_t offsets[3];
-+
-+ /* The following fields are only needed for paletted formats */
-+ int32_t num_palette_entries; /* set to zero for non-palette images */
-+ /*
-+ * Each component is one byte and entry_bytes indicates the number of components in
-+ * each entry (eg. 3 for YUV palette entries). set to zero for non-palette images
-+ */
-+ int32_t entry_bytes;
-+ /*
-+ * An array of ascii characters describing the order of the components within the bytes.
-+ * Only entry_bytes characters of the string are used.
-+ */
-+ int8_t component_order[4];
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAImage;
-+
-+/** Get maximum number of image formats supported by the implementation */
-+int vaMaxNumImageFormats (
-+ VADisplay dpy
-+);
-+
-+/**
-+ * Query supported image formats
-+ * The caller must provide a "format_list" array that can hold at
-+ * least vaMaxNumImageFormats() entries. The actual number of formats
-+ * returned in "format_list" is returned in "num_formats".
-+ */
-+VAStatus vaQueryImageFormats (
-+ VADisplay dpy,
-+ VAImageFormat *format_list, /* out */
-+ int *num_formats /* out */
-+);
-+
-+/**
-+ * Create a VAImage structure
-+ * The width and height fields returned in the VAImage structure may get
-+ * enlarged for some YUV formats. Upon return from this function,
-+ * image->buf has been created and proper storage allocated by the library.
-+ * The client can access the image through the Map/Unmap calls.
-+ */
-+VAStatus vaCreateImage (
-+ VADisplay dpy,
-+ VAImageFormat *format,
-+ int width,
-+ int height,
-+ VAImage *image /* out */
-+);
-+
-+/**
-+ * Should call DestroyImage before destroying the surface it is bound to
-+ */
-+VAStatus vaDestroyImage (
-+ VADisplay dpy,
-+ VAImageID image
-+);
-+
-+VAStatus vaSetImagePalette (
-+ VADisplay dpy,
-+ VAImageID image,
-+ /*
-+ * pointer to an array holding the palette data. The size of the array is
-+ * num_palette_entries * entry_bytes in size. The order of the components
-+ * in the palette is described by the component_order in VAImage struct
-+ */
-+ unsigned char *palette
-+);
-+
-+/**
-+ * Retrive surface data into a VAImage
-+ * Image must be in a format supported by the implementation
-+ */
-+VAStatus vaGetImage (
-+ VADisplay dpy,
-+ VASurfaceID surface,
-+ int x, /* coordinates of the upper left source pixel */
-+ int y,
-+ unsigned int width, /* width and height of the region */
-+ unsigned int height,
-+ VAImageID image
-+);
-+
-+/**
-+ * Copy data from a VAImage to a surface
-+ * Image must be in a format supported by the implementation
-+ * Returns a VA_STATUS_ERROR_SURFACE_BUSY if the surface
-+ * shouldn't be rendered into when this is called
-+ */
-+VAStatus vaPutImage (
-+ VADisplay dpy,
-+ VASurfaceID surface,
-+ VAImageID image,
-+ int src_x,
-+ int src_y,
-+ unsigned int src_width,
-+ unsigned int src_height,
-+ int dest_x,
-+ int dest_y,
-+ unsigned int dest_width,
-+ unsigned int dest_height
-+);
-+
-+/**
-+ * Derive an VAImage from an existing surface.
-+ * This interface will derive a VAImage and corresponding image buffer from
-+ * an existing VA Surface. The image buffer can then be mapped/unmapped for
-+ * direct CPU access. This operation is only possible on implementations with
-+ * direct rendering capabilities and internal surface formats that can be
-+ * represented with a VAImage. When the operation is not possible this interface
-+ * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
-+ * to using vaCreateImage + vaPutImage to accomplish the same task in an
-+ * indirect manner.
-+ *
-+ * Implementations should only return success when the resulting image buffer
-+ * would be useable with vaMap/Unmap.
-+ *
-+ * When directly accessing a surface special care must be taken to insure
-+ * proper synchronization with the graphics hardware. Clients should call
-+ * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
-+ * rendering or currently being displayed by an overlay.
-+ *
-+ * Additionally nothing about the contents of a surface should be assumed
-+ * following a vaPutSurface. Implementations are free to modify the surface for
-+ * scaling or subpicture blending within a call to vaPutImage.
-+ *
-+ * Calls to vaPutImage or vaGetImage using the same surface from which the image
-+ * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
-+ * vaGetImage with other surfaces is supported.
-+ *
-+ * An image created with vaDeriveImage should be freed with vaDestroyImage. The
-+ * image and image buffer structures will be destroyed; however, the underlying
-+ * surface will remain unchanged until freed with vaDestroySurfaces.
-+ */
-+VAStatus vaDeriveImage (
-+ VADisplay dpy,
-+ VASurfaceID surface,
-+ VAImage *image /* out */
-+);
-+
-+/**
-+ * Subpictures
-+ * Subpicture is a special type of image that can be blended
-+ * with a surface during vaPutSurface(). Subpicture can be used to render
-+ * DVD sub-titles or closed captioning text etc.
-+ */
-+
-+typedef VAGenericID VASubpictureID;
-+
-+/** Get maximum number of subpicture formats supported by the implementation */
-+int vaMaxNumSubpictureFormats (
-+ VADisplay dpy
-+);
-+
-+/** flags for subpictures */
-+#define VA_SUBPICTURE_CHROMA_KEYING 0x0001
-+#define VA_SUBPICTURE_GLOBAL_ALPHA 0x0002
-+#define VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD 0x0004
-+/**
-+ * Query supported subpicture formats
-+ * The caller must provide a "format_list" array that can hold at
-+ * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
-+ * for each format to indicate additional capabilities for that format. The actual
-+ * number of formats returned in "format_list" is returned in "num_formats".
-+ * flags: returned value to indicate addtional capabilities
-+ * VA_SUBPICTURE_CHROMA_KEYING - supports chroma-keying
-+ * VA_SUBPICTURE_GLOBAL_ALPHA - supports global alpha
-+ * VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD - supports unscaled screen relative subpictures for On Screen Display
-+ */
-+
-+VAStatus vaQuerySubpictureFormats (
-+ VADisplay dpy,
-+ VAImageFormat *format_list, /* out */
-+ unsigned int *flags, /* out */
-+ unsigned int *num_formats /* out */
-+);
-+
-+/**
-+ * Subpictures are created with an image associated.
-+ */
-+VAStatus vaCreateSubpicture (
-+ VADisplay dpy,
-+ VAImageID image,
-+ VASubpictureID *subpicture /* out */
-+);
-+
-+/**
-+ * Destroy the subpicture before destroying the image it is assocated to
-+ */
-+VAStatus vaDestroySubpicture (
-+ VADisplay dpy,
-+ VASubpictureID subpicture
-+);
-+
-+/**
-+ * Bind an image to the subpicture. This image will now be associated with
-+ * the subpicture instead of the one at creation.
-+ */
-+VAStatus vaSetSubpictureImage (
-+ VADisplay dpy,
-+ VASubpictureID subpicture,
-+ VAImageID image
-+);
-+
-+/**
-+ * If chromakey is enabled, then the area where the source value falls within
-+ * the chromakey [min, max] range is transparent
-+ * The chromakey component format is the following:
-+ * For RGB: [0:7] Red [8:15] Blue [16:23] Green
-+ * For YUV: [0:7] V [8:15] U [16:23] Y
-+ * The chromakey mask can be used to mask out certain components for chromakey
-+ * comparision
-+ */
-+VAStatus vaSetSubpictureChromakey (
-+ VADisplay dpy,
-+ VASubpictureID subpicture,
-+ unsigned int chromakey_min,
-+ unsigned int chromakey_max,
-+ unsigned int chromakey_mask
-+);
-+
-+/**
-+ * Global alpha value is between 0 and 1. A value of 1 means fully opaque and
-+ * a value of 0 means fully transparent. If per-pixel alpha is also specified then
-+ * the overall alpha is per-pixel alpha multiplied by the global alpha
-+ */
-+VAStatus vaSetSubpictureGlobalAlpha (
-+ VADisplay dpy,
-+ VASubpictureID subpicture,
-+ float global_alpha
-+);
-+
-+/**
-+ * vaAssociateSubpicture associates the subpicture with target_surfaces.
-+ * It defines the region mapping between the subpicture and the target
-+ * surfaces through source and destination rectangles (with the same width and height).
-+ * Both will be displayed at the next call to vaPutSurface. Additional
-+ * associations before the call to vaPutSurface simply overrides the association.
-+ */
-+VAStatus vaAssociateSubpicture (
-+ VADisplay dpy,
-+ VASubpictureID subpicture,
-+ VASurfaceID *target_surfaces,
-+ int num_surfaces,
-+ int16_t src_x, /* upper left offset in subpicture */
-+ int16_t src_y,
-+ uint16_t src_width,
-+ uint16_t src_height,
-+ int16_t dest_x, /* upper left offset in surface */
-+ int16_t dest_y,
-+ uint16_t dest_width,
-+ uint16_t dest_height,
-+ /*
-+ * whether to enable chroma-keying, global-alpha, or screen relative mode
-+ * see VA_SUBPICTURE_XXX values
-+ */
-+ uint32_t flags
-+);
-+
-+/**
-+ * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
-+ */
-+VAStatus vaDeassociateSubpicture (
-+ VADisplay dpy,
-+ VASubpictureID subpicture,
-+ VASurfaceID *target_surfaces,
-+ int num_surfaces
-+);
-+
-+/**
-+ * Display attributes
-+ * Display attributes are used to control things such as contrast, hue, saturation,
-+ * brightness etc. in the rendering process. The application can query what
-+ * attributes are supported by the driver, and then set the appropriate attributes
-+ * before calling vaPutSurface()
-+ */
-+/* PowerVR IEP Lite attributes */
-+typedef enum
-+{
-+ VADISPLAYATTRIB_BLE_OFF = 0x00,
-+ VADISPLAYATTRIB_BLE_LOW,
-+ VADISPLAYATTRIB_BLE_MEDIUM,
-+ VADISPLAYATTRIB_BLE_HIGH,
-+ VADISPLAYATTRIB_BLE_NONE,
-+} VADisplayAttribBLEMode;
-+
-+/** attribute value for VADisplayAttribRotation */
-+#define VA_ROTATION_NONE 0x00000000
-+#define VA_ROTATION_90 0x00000001
-+#define VA_ROTATION_180 0x00000002
-+#define VA_ROTATION_270 0x00000003
-+/**@}*/
-+
-+/**
-+ * @name Mirroring directions
-+ *
-+ * Those values could be used for VADisplayAttribMirror attribute or
-+ * VAProcPipelineParameterBuffer::mirror_state.
-+
-+ */
-+/**@{*/
-+/** \brief No Mirroring. */
-+#define VA_MIRROR_NONE 0x00000000
-+/** \brief Horizontal Mirroring. */
-+#define VA_MIRROR_HORIZONTAL 0x00000001
-+/** \brief Vertical Mirroring. */
-+#define VA_MIRROR_VERTICAL 0x00000002
-+/**@}*/
-+
-+/** attribute value for VADisplayAttribOutOfLoopDeblock */
-+#define VA_OOL_DEBLOCKING_FALSE 0x00000000
-+#define VA_OOL_DEBLOCKING_TRUE 0x00000001
-+
-+/** Render mode */
-+#define VA_RENDER_MODE_UNDEFINED 0
-+#define VA_RENDER_MODE_LOCAL_OVERLAY 1
-+#define VA_RENDER_MODE_LOCAL_GPU 2
-+#define VA_RENDER_MODE_EXTERNAL_OVERLAY 4
-+#define VA_RENDER_MODE_EXTERNAL_GPU 8
-+
-+/** Render device */
-+#define VA_RENDER_DEVICE_UNDEFINED 0
-+#define VA_RENDER_DEVICE_LOCAL 1
-+#define VA_RENDER_DEVICE_EXTERNAL 2
-+
-+/** Currently defined display attribute types */
-+typedef enum
-+{
-+ VADisplayAttribBrightness = 0,
-+ VADisplayAttribContrast = 1,
-+ VADisplayAttribHue = 2,
-+ VADisplayAttribSaturation = 3,
-+ /* client can specifiy a background color for the target window
-+ * the new feature of video conference,
-+ * the uncovered area of the surface is filled by this color
-+ * also it will blend with the decoded video color
-+ */
-+ VADisplayAttribBackgroundColor = 4,
-+ /*
-+ * this is a gettable only attribute. For some implementations that use the
-+ * hardware overlay, after PutSurface is called, the surface can not be
-+ * re-used until after the subsequent PutSurface call. If this is the case
-+ * then the value for this attribute will be set to 1 so that the client
-+ * will not attempt to re-use the surface right after returning from a call
-+ * to PutSurface.
-+ *
-+ * Don't use it, use flag VASurfaceDisplaying of vaQuerySurfaceStatus since
-+ * driver may use overlay or GPU alternatively
-+ */
-+ VADisplayAttribDirectSurface = 5,
-+ VADisplayAttribRotation = 6,
-+ VADisplayAttribOutofLoopDeblock = 7,
-+
-+ /* PowerVR IEP Lite specific attributes */
-+ VADisplayAttribBLEBlackMode = 8,
-+ VADisplayAttribBLEWhiteMode = 9,
-+ VADisplayAttribBlueStretch = 10,
-+ VADisplayAttribSkinColorCorrection = 11,
-+ /*
-+ * For type VADisplayAttribCSCMatrix, "value" field is a pointer to the color
-+ * conversion matrix. Each element in the matrix is float-point
-+ */
-+ VADisplayAttribCSCMatrix = 12,
-+ /* specify the constant color used to blend with video surface
-+ * Cd = Cv*Cc*Ac + Cb *(1 - Ac) C means the constant RGB
-+ * d: the final color to overwrite into the frame buffer
-+ * v: decoded video after color conversion,
-+ * c: video color specified by VADisplayAttribBlendColor
-+ * b: background color of the drawable
-+ */
-+ VADisplayAttribBlendColor = 13,
-+ /*
-+ * Indicate driver to skip painting color key or not.
-+ * only applicable if the render is overlay
-+ */
-+ VADisplayAttribOverlayAutoPaintColorKey = 14,
-+ /*
-+ * customized overlay color key, the format is RGB888
-+ * [23:16] = Red, [15:08] = Green, [07:00] = Blue.
-+ */
-+ VADisplayAttribOverlayColorKey = 15,
-+ /*
-+ * The hint for the implementation of vaPutSurface
-+ * normally, the driver could use an overlay or GPU to render the surface on the screen
-+ * this flag provides APP the flexibity to switch the render dynamically
-+ */
-+ VADisplayAttribRenderMode = 16,
-+ /*
-+ * specify if vaPutSurface needs to render into specified monitors
-+ * one example is that one external monitor (e.g. HDMI) is enabled,
-+ * but the window manager is not aware of it, and there is no associated drawable
-+ */
-+ VADisplayAttribRenderDevice = 17,
-+ /*
-+ * specify vaPutSurface render area if there is no drawable on the monitor
-+ */
-+ VADisplayAttribRenderRect = 18,
-+} VADisplayAttribType;
-+
-+/* flags for VADisplayAttribute */
-+#define VA_DISPLAY_ATTRIB_NOT_SUPPORTED 0x0000
-+#define VA_DISPLAY_ATTRIB_GETTABLE 0x0001
-+#define VA_DISPLAY_ATTRIB_SETTABLE 0x0002
-+
-+typedef struct _VADisplayAttribute
-+{
-+ VADisplayAttribType type;
-+ int32_t min_value;
-+ int32_t max_value;
-+ int32_t value; /* used by the set/get attribute functions */
-+/* flags can be VA_DISPLAY_ATTRIB_GETTABLE or VA_DISPLAY_ATTRIB_SETTABLE or OR'd together */
-+ uint32_t flags;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VADisplayAttribute;
-+
-+/** Get maximum number of display attributs supported by the implementation */
-+int vaMaxNumDisplayAttributes (
-+ VADisplay dpy
-+);
-+
-+/**
-+ * Query display attributes
-+ * The caller must provide a "attr_list" array that can hold at
-+ * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
-+ * returned in "attr_list" is returned in "num_attributes".
-+ */
-+VAStatus vaQueryDisplayAttributes (
-+ VADisplay dpy,
-+ VADisplayAttribute *attr_list, /* out */
-+ int *num_attributes /* out */
-+);
-+
-+/**
-+ * Get display attributes
-+ * This function returns the current attribute values in "attr_list".
-+ * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
-+ * from vaQueryDisplayAttributes() can have their values retrieved.
-+ */
-+VAStatus vaGetDisplayAttributes (
-+ VADisplay dpy,
-+ VADisplayAttribute *attr_list, /* in/out */
-+ int num_attributes
-+);
-+
-+/**
-+ * Set display attributes
-+ * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
-+ * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or
-+ * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
-+ */
-+VAStatus vaSetDisplayAttributes (
-+ VADisplay dpy,
-+ VADisplayAttribute *attr_list,
-+ int num_attributes
-+);
-+
-+/****************************
-+ * HEVC data structures
-+ ****************************/
-+/**
-+ * \brief Description of picture properties of those in DPB surfaces.
-+ *
-+ * If only progressive scan is supported, each surface contains one whole
-+ * frame picture.
-+ * Otherwise, each surface contains two fields of whole picture.
-+ * In this case, two entries of ReferenceFrames[] may share same picture_id
-+ * value.
-+ */
-+typedef struct _VAPictureHEVC
-+{
-+ /** \brief reconstructed picture buffer surface index
-+ * invalid when taking value VA_INVALID_SURFACE.
-+ */
-+ VASurfaceID picture_id;
-+ /** \brief picture order count.
-+ * in HEVC, POCs for top and bottom fields of same picture should
-+ * take different values.
-+ */
-+ int32_t pic_order_cnt;
-+ /* described below */
-+ uint32_t flags;
-+
-+ /** \brief Reserved bytes for future use, must be zero */
-+ uint32_t va_reserved[VA_PADDING_LOW];
-+} VAPictureHEVC;
-+
-+/* flags in VAPictureHEVC could be OR of the following */
-+#define VA_PICTURE_HEVC_INVALID 0x00000001
-+/** \brief indication of interlace scan picture.
-+ * should take same value for all the pictures in sequence.
-+ */
-+#define VA_PICTURE_HEVC_FIELD_PIC 0x00000002
-+/** \brief polarity of the field picture.
-+ * top field takes even lines of buffer surface.
-+ * bottom field takes odd lines of buffer surface.
-+ */
-+#define VA_PICTURE_HEVC_BOTTOM_FIELD 0x00000004
-+/** \brief Long term reference picture */
-+#define VA_PICTURE_HEVC_LONG_TERM_REFERENCE 0x00000008
-+/**
-+ * VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE, VA_PICTURE_HEVC_RPS_ST_CURR_AFTER
-+ * and VA_PICTURE_HEVC_RPS_LT_CURR of any picture in ReferenceFrames[] should
-+ * be exclusive. No more than one of them can be set for any picture.
-+ * Sum of NumPocStCurrBefore, NumPocStCurrAfter and NumPocLtCurr
-+ * equals NumPocTotalCurr, which should be equal to or smaller than 8.
-+ * Application should provide valid values for both short format and long format.
-+ * The pictures in DPB with any of these three flags turned on are referred by
-+ * the current picture.
-+ */
-+/** \brief RefPicSetStCurrBefore of HEVC spec variable
-+ * Number of ReferenceFrames[] entries with this bit set equals
-+ * NumPocStCurrBefore.
-+ */
-+#define VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE 0x00000010
-+/** \brief RefPicSetStCurrAfter of HEVC spec variable
-+ * Number of ReferenceFrames[] entries with this bit set equals
-+ * NumPocStCurrAfter.
-+ */
-+#define VA_PICTURE_HEVC_RPS_ST_CURR_AFTER 0x00000020
-+/** \brief RefPicSetLtCurr of HEVC spec variable
-+ * Number of ReferenceFrames[] entries with this bit set equals
-+ * NumPocLtCurr.
-+ */
-+#define VA_PICTURE_HEVC_RPS_LT_CURR 0x00000040
-+
-+//#include <va/va_dec_hevc.h>
-+//#include <va/va_dec_jpeg.h>
-+#include "va_dec_vp8.h"
-+#include "va_dec_vp9.h"
-+//#include <va/va_enc_hevc.h>
-+//#include <va/va_fei_hevc.h>
-+//#include <va/va_enc_h264.h>
-+//#include <va/va_enc_jpeg.h>
-+//#include <va/va_enc_mpeg2.h>
-+//#include <va/va_enc_vp8.h>
-+//#include <va/va_enc_vp9.h>
-+//#include <va/va_fei.h>
-+//#include <va/va_fei_h264.h>
-+//#include <va/va_vpp.h>
-+
-+/**@}*/
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* _VA_H_ */
-diff -up firefox-84.0/media/ffvpx/va/va.patch.ffvpx firefox-84.0/media/ffvpx/va/va.patch
---- firefox-84.0/media/ffvpx/va/va.patch.ffvpx 2020-12-10 20:40:53.391541423 +0100
-+++ firefox-84.0/media/ffvpx/va/va.patch 2020-12-10 20:40:53.391541423 +0100
-@@ -0,0 +1,33 @@
-+--- va.h.old 2020-10-22 10:41:57.805112031 +0200
-++++ va.h 2020-10-22 10:37:22.597088670 +0200
-+@@ -4613,18 +4613,18 @@
-+ #define VA_PICTURE_HEVC_RPS_LT_CURR 0x00000040
-+
-+-#include <va/va_dec_hevc.h>
-+-#include <va/va_dec_jpeg.h>
-++//#include <va/va_dec_hevc.h>
-++//#include <va/va_dec_jpeg.h>
-+ #include "va_dec_vp8.h"
-+ #include "va_dec_vp9.h"
-+-#include <va/va_enc_hevc.h>
-+-#include <va/va_fei_hevc.h>
-+-#include <va/va_enc_h264.h>
-+-#include <va/va_enc_jpeg.h>
-+-#include <va/va_enc_mpeg2.h>
-+-#include <va/va_enc_vp8.h>
-+-#include <va/va_enc_vp9.h>
-+-#include <va/va_fei.h>
-+-#include <va/va_fei_h264.h>
-+-#include <va/va_vpp.h>
-++//#include <va/va_enc_hevc.h>
-++//#include <va/va_fei_hevc.h>
-++//#include <va/va_enc_h264.h>
-++//#include <va/va_enc_jpeg.h>
-++//#include <va/va_enc_mpeg2.h>
-++//#include <va/va_enc_vp8.h>
-++//#include <va/va_enc_vp9.h>
-++//#include <va/va_fei.h>
-++//#include <va/va_fei_h264.h>
-++//#include <va/va_vpp.h>
-+
-+ /**@}*/
-diff -up firefox-84.0/media/ffvpx/va/va_version.h.ffvpx firefox-84.0/media/ffvpx/va/va_version.h
---- firefox-84.0/media/ffvpx/va/va_version.h.ffvpx 2020-12-10 20:40:53.391541423 +0100
-+++ firefox-84.0/media/ffvpx/va/va_version.h 2020-12-10 20:40:53.391541423 +0100
-@@ -0,0 +1,87 @@
-+/*
-+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#ifndef VA_VERSION_H
-+#define VA_VERSION_H
-+
-+/**
-+ * VA_MAJOR_VERSION:
-+ *
-+ * The major version of VA-API (1, if %VA_VERSION is 1.2.3)
-+ */
-+#define VA_MAJOR_VERSION 1
-+
-+/**
-+ * VA_MINOR_VERSION:
-+ *
-+ * The minor version of VA-API (2, if %VA_VERSION is 1.2.3)
-+ */
-+#define VA_MINOR_VERSION 7
-+
-+/**
-+ * VA_MICRO_VERSION:
-+ *
-+ * The micro version of VA-API (3, if %VA_VERSION is 1.2.3)
-+ */
-+#define VA_MICRO_VERSION 0
-+
-+/**
-+ * VA_VERSION:
-+ *
-+ * The full version of VA-API, like 1.2.3
-+ */
-+#define VA_VERSION 1.7.0
-+
-+/**
-+ * VA_VERSION_S:
-+ *
-+ * The full version of VA-API, in string form (suited for string
-+ * concatenation)
-+ */
-+#define VA_VERSION_S "1.7.0"
-+
-+/**
-+ * VA_VERSION_HEX:
-+ *
-+ * Numerically encoded version of VA-API, like 0x010203
-+ */
-+#define VA_VERSION_HEX ((VA_MAJOR_VERSION << 24) | \
-+ (VA_MINOR_VERSION << 16) | \
-+ (VA_MICRO_VERSION << 8))
-+
-+/**
-+ * VA_CHECK_VERSION:
-+ * @major: major version, like 1 in 1.2.3
-+ * @minor: minor version, like 2 in 1.2.3
-+ * @micro: micro version, like 3 in 1.2.3
-+ *
-+ * Evaluates to %TRUE if the version of VA-API is greater than
-+ * @major, @minor and @micro
-+ */
-+#define VA_CHECK_VERSION(major,minor,micro) \
-+ (VA_MAJOR_VERSION > (major) || \
-+ (VA_MAJOR_VERSION == (major) && VA_MINOR_VERSION > (minor)) || \
-+ (VA_MAJOR_VERSION == (major) && VA_MINOR_VERSION == (minor) && VA_MICRO_VERSION >= (micro)))
-+
-+#endif /* VA_VERSION_H */
-diff -up firefox-84.0/widget/gtk/DMABufSurface.h.ffvpx firefox-84.0/widget/gtk/DMABufSurface.h
---- firefox-84.0/widget/gtk/DMABufSurface.h.ffvpx 2020-12-08 00:35:05.000000000 +0100
-+++ firefox-84.0/widget/gtk/DMABufSurface.h 2020-12-10 20:40:53.391541423 +0100
-@@ -8,10 +8,9 @@
- #define DMABufSurface_h__
-
- #include <stdint.h>
--#include "GLContext.h"
--#include "GLContextTypes.h"
- #include "mozilla/widget/nsWaylandDisplay.h"
- #include "mozilla/widget/va_drmcommon.h"
-+#include "GLTypes.h"
-
- typedef void* EGLImageKHR;
- typedef void* EGLSyncKHR;
-@@ -23,6 +22,9 @@ namespace layers {
- class SurfaceDescriptor;
- class SurfaceDescriptorDMABuf;
- } // namespace layers
-+namespace gl {
-+class GLContext;
-+}
- } // namespace mozilla
-
- typedef enum {
-diff -up firefox-84.0/widget/gtk/nsWaylandDisplay.cpp.ffvpx firefox-84.0/widget/gtk/nsWaylandDisplay.cpp
---- firefox-84.0/widget/gtk/nsWaylandDisplay.cpp.ffvpx 2020-12-08 00:35:05.000000000 +0100
-+++ firefox-84.0/widget/gtk/nsWaylandDisplay.cpp 2020-12-10 20:40:53.391541423 +0100
-@@ -6,6 +6,10 @@
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
- #include "nsWaylandDisplay.h"
-+
-+#include "base/message_loop.h" // for MessageLoop
-+#include "base/task.h" // for NewRunnableMethod, etc
-+#include "mozilla/StaticMutex.h"
- #include "mozilla/StaticPrefs_widget.h"
-
- namespace mozilla {
-diff -up firefox-84.0/widget/gtk/nsWaylandDisplay.h.ffvpx firefox-84.0/widget/gtk/nsWaylandDisplay.h
---- firefox-84.0/widget/gtk/nsWaylandDisplay.h.ffvpx 2020-12-08 00:35:05.000000000 +0100
-+++ firefox-84.0/widget/gtk/nsWaylandDisplay.h 2020-12-10 20:40:53.391541423 +0100
-@@ -10,10 +10,6 @@
-
- #include "DMABufLibWrapper.h"
-
--#include "base/message_loop.h" // for MessageLoop
--#include "base/task.h" // for NewRunnableMethod, etc
--#include "mozilla/StaticMutex.h"
--
- #include "mozilla/widget/mozwayland.h"
- #include "mozilla/widget/gbm.h"
- #include "mozilla/widget/gtk-primary-selection-client-protocol.h"
bgstack15