From 66bd1fb20d3a799d39b26d6b8f98b9f7a4f98971 Mon Sep 17 00:00:00 2001 From: Daniel Stankewitz Date: Sun, 25 Sep 2022 14:07:09 +0200 Subject: [PATCH] add mfx again --- .../actions/libmfx/include/mfx/mfxadapter.h | 40 + .../libmfx/include/mfx/mfxastructures.h | 170 ++ .../actions/libmfx/include/mfx/mfxaudio++.h | 101 + .github/actions/libmfx/include/mfx/mfxaudio.h | 60 + .github/actions/libmfx/include/mfx/mfxbrc.h | 129 + .../actions/libmfx/include/mfx/mfxcamera.h | 271 ++ .../actions/libmfx/include/mfx/mfxcommon.h | 212 ++ .github/actions/libmfx/include/mfx/mfxdefs.h | 212 ++ .../mfx/mfxdispatcherprefixedfunctions.h | 145 + .github/actions/libmfx/include/mfx/mfxenc.h | 74 + .github/actions/libmfx/include/mfx/mfxfei.h | 583 ++++ .../actions/libmfx/include/mfx/mfxfeihevc.h | 290 ++ .github/actions/libmfx/include/mfx/mfxjpeg.h | 105 + .github/actions/libmfx/include/mfx/mfxla.h | 99 + .github/actions/libmfx/include/mfx/mfxmvc.h | 106 + .github/actions/libmfx/include/mfx/mfxpak.h | 78 + .github/actions/libmfx/include/mfx/mfxpcp.h | 56 + .../actions/libmfx/include/mfx/mfxplugin++.h | 717 +++++ .../actions/libmfx/include/mfx/mfxplugin.h | 216 ++ .github/actions/libmfx/include/mfx/mfxsc.h | 54 + .github/actions/libmfx/include/mfx/mfxscd.h | 61 + .../actions/libmfx/include/mfx/mfxsession.h | 50 + .../libmfx/include/mfx/mfxstructures.h | 2509 +++++++++++++++++ .../actions/libmfx/include/mfx/mfxvideo++.h | 188 ++ .github/actions/libmfx/include/mfx/mfxvideo.h | 104 + .github/actions/libmfx/include/mfx/mfxvp8.h | 71 + .github/actions/libmfx/include/mfx/mfxvp9.h | 53 + .../libmfx/include/mfx/mfxvstructures.h | 22 + .github/actions/libmfx/lib/mfx.lib | Bin 0 -> 359450 bytes .github/actions/libmfx/lib/mfxd.lib | Bin 0 -> 361902 bytes 30 files changed, 6776 insertions(+) create mode 100644 .github/actions/libmfx/include/mfx/mfxadapter.h create mode 100644 .github/actions/libmfx/include/mfx/mfxastructures.h create mode 100644 .github/actions/libmfx/include/mfx/mfxaudio++.h create mode 100644 .github/actions/libmfx/include/mfx/mfxaudio.h create mode 100644 .github/actions/libmfx/include/mfx/mfxbrc.h create mode 100644 .github/actions/libmfx/include/mfx/mfxcamera.h create mode 100644 .github/actions/libmfx/include/mfx/mfxcommon.h create mode 100644 .github/actions/libmfx/include/mfx/mfxdefs.h create mode 100644 .github/actions/libmfx/include/mfx/mfxdispatcherprefixedfunctions.h create mode 100644 .github/actions/libmfx/include/mfx/mfxenc.h create mode 100644 .github/actions/libmfx/include/mfx/mfxfei.h create mode 100644 .github/actions/libmfx/include/mfx/mfxfeihevc.h create mode 100644 .github/actions/libmfx/include/mfx/mfxjpeg.h create mode 100644 .github/actions/libmfx/include/mfx/mfxla.h create mode 100644 .github/actions/libmfx/include/mfx/mfxmvc.h create mode 100644 .github/actions/libmfx/include/mfx/mfxpak.h create mode 100644 .github/actions/libmfx/include/mfx/mfxpcp.h create mode 100644 .github/actions/libmfx/include/mfx/mfxplugin++.h create mode 100644 .github/actions/libmfx/include/mfx/mfxplugin.h create mode 100644 .github/actions/libmfx/include/mfx/mfxsc.h create mode 100644 .github/actions/libmfx/include/mfx/mfxscd.h create mode 100644 .github/actions/libmfx/include/mfx/mfxsession.h create mode 100644 .github/actions/libmfx/include/mfx/mfxstructures.h create mode 100644 .github/actions/libmfx/include/mfx/mfxvideo++.h create mode 100644 .github/actions/libmfx/include/mfx/mfxvideo.h create mode 100644 .github/actions/libmfx/include/mfx/mfxvp8.h create mode 100644 .github/actions/libmfx/include/mfx/mfxvp9.h create mode 100644 .github/actions/libmfx/include/mfx/mfxvstructures.h create mode 100644 .github/actions/libmfx/lib/mfx.lib create mode 100644 .github/actions/libmfx/lib/mfxd.lib diff --git a/.github/actions/libmfx/include/mfx/mfxadapter.h b/.github/actions/libmfx/include/mfx/mfxadapter.h new file mode 100644 index 0000000..30c4fb3 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxadapter.h @@ -0,0 +1,40 @@ +// Copyright (c) 2019-2020 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include "mfxdefs.h" +#if (MFX_VERSION >= 1031) +#ifndef __MFXADAPTER_H__ +#define __MFXADAPTER_H__ + +#include "mfxstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif +mfxStatus MFX_CDECL MFXQueryAdapters(mfxComponentInfo* input_info, mfxAdaptersInfo* adapters); +mfxStatus MFX_CDECL MFXQueryAdaptersDecode(mfxBitstream* bitstream, mfxU32 codec_id, mfxAdaptersInfo* adapters); +mfxStatus MFX_CDECL MFXQueryAdaptersNumber(mfxU32* num_adapters); +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // __MFXADAPTER_H__ +#endif \ No newline at end of file diff --git a/.github/actions/libmfx/include/mfx/mfxastructures.h b/.github/actions/libmfx/include/mfx/mfxastructures.h new file mode 100644 index 0000000..679132f --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxastructures.h @@ -0,0 +1,170 @@ +// Copyright (c) 2017-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXASTRUCTURES_H__ +#define __MFXASTRUCTURES_H__ +#include "mfxcommon.h" + +#if !defined (__GNUC__) +#pragma warning(disable: 4201) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* CodecId */ +enum { + MFX_CODEC_AAC =MFX_MAKEFOURCC('A','A','C',' '), + MFX_CODEC_MP3 =MFX_MAKEFOURCC('M','P','3',' ') +}; + +enum { + /* AAC Profiles & Levels */ + MFX_PROFILE_AAC_LC =2, + MFX_PROFILE_AAC_LTP =4, + MFX_PROFILE_AAC_MAIN =1, + MFX_PROFILE_AAC_SSR =3, + MFX_PROFILE_AAC_HE =5, + MFX_PROFILE_AAC_ALS =0x20, + MFX_PROFILE_AAC_BSAC =22, + MFX_PROFILE_AAC_PS =29, + + /*MPEG AUDIO*/ + MFX_AUDIO_MPEG1_LAYER1 =0x00000110, + MFX_AUDIO_MPEG1_LAYER2 =0x00000120, + MFX_AUDIO_MPEG1_LAYER3 =0x00000140, + MFX_AUDIO_MPEG2_LAYER1 =0x00000210, + MFX_AUDIO_MPEG2_LAYER2 =0x00000220, + MFX_AUDIO_MPEG2_LAYER3 =0x00000240 +}; + +/*AAC HE decoder down sampling*/ +enum { + MFX_AUDIO_AAC_HE_DWNSMPL_OFF=0, + MFX_AUDIO_AAC_HE_DWNSMPL_ON= 1 +}; + +/* AAC decoder support of PS */ +enum { + MFX_AUDIO_AAC_PS_DISABLE= 0, + MFX_AUDIO_AAC_PS_PARSER= 1, + MFX_AUDIO_AAC_PS_ENABLE_BL= 111, + MFX_AUDIO_AAC_PS_ENABLE_UR= 411 +}; + +/*AAC decoder SBR support*/ +enum { + MFX_AUDIO_AAC_SBR_DISABLE = 0, + MFX_AUDIO_AAC_SBR_ENABLE= 1, + MFX_AUDIO_AAC_SBR_UNDEF= 2 +}; + +/*AAC header type*/ +enum{ + MFX_AUDIO_AAC_ADTS= 1, + MFX_AUDIO_AAC_ADIF= 2, + MFX_AUDIO_AAC_RAW= 3, +}; + +/*AAC encoder stereo mode*/ +enum +{ + MFX_AUDIO_AAC_MONO= 0, + MFX_AUDIO_AAC_LR_STEREO= 1, + MFX_AUDIO_AAC_MS_STEREO= 2, + MFX_AUDIO_AAC_JOINT_STEREO= 3 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU32 CodecId; + mfxU16 CodecProfile; + mfxU16 CodecLevel; + + mfxU32 Bitrate; + mfxU32 SampleFrequency; + mfxU16 NumChannel; + mfxU16 BitPerSample; + + mfxU16 reserved1[22]; + + union { + struct { /* AAC Decoding Options */ + mfxU16 FlagPSSupportLev; + mfxU16 Layer; + mfxU16 AACHeaderDataSize; + mfxU8 AACHeaderData[64]; + }; + struct { /* AAC Encoding Options */ + mfxU16 OutputFormat; + mfxU16 StereoMode; + mfxU16 reserved2[61]; + }; + }; +} mfxAudioInfoMFX; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxU16 AsyncDepth; + mfxU16 Protected; + mfxU16 reserved[14]; + + mfxAudioInfoMFX mfx; + mfxExtBuffer** ExtParam; + mfxU16 NumExtParam; +} mfxAudioParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU32 SuggestedInputSize; + mfxU32 SuggestedOutputSize; + mfxU32 reserved[6]; +} mfxAudioAllocRequest; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxU64 TimeStamp; /* 1/90KHz */ + mfxU16 Locked; + mfxU16 NumChannels; + mfxU32 SampleFrequency; + mfxU16 BitPerSample; + mfxU16 reserved1[7]; + + mfxU8* Data; + mfxU32 reserved2; + mfxU32 DataLength; + mfxU32 MaxLength; + + mfxU32 NumExtParam; + mfxExtBuffer **ExtParam; +} mfxAudioFrame; +MFX_PACK_END() + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + + diff --git a/.github/actions/libmfx/include/mfx/mfxaudio++.h b/.github/actions/libmfx/include/mfx/mfxaudio++.h new file mode 100644 index 0000000..1abbf11 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxaudio++.h @@ -0,0 +1,101 @@ +// Copyright (c) 2017 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXAUDIOPLUSPLUS_H +#define __MFXAUDIOPLUSPLUS_H + +#include "mfxaudio.h" + +class MFXAudioSession +{ +public: + MFXAudioSession(void) { m_session = (mfxSession) 0; } + virtual ~MFXAudioSession(void) { Close(); } + + virtual mfxStatus Init(mfxIMPL impl, mfxVersion *ver) { return MFXInit(impl, ver, &m_session); } + virtual mfxStatus Close(void) + { + mfxStatus mfxRes; + mfxRes = MFXClose(m_session); m_session = (mfxSession) 0; + return mfxRes; + } + + virtual mfxStatus QueryIMPL(mfxIMPL *impl) { return MFXQueryIMPL(m_session, impl); } + virtual mfxStatus QueryVersion(mfxVersion *version) { return MFXQueryVersion(m_session, version); } + + virtual mfxStatus JoinSession(mfxSession child_session) { return MFXJoinSession(m_session, child_session);} + virtual mfxStatus DisjoinSession( ) { return MFXDisjoinSession(m_session);} + virtual mfxStatus CloneSession( mfxSession *clone) { return MFXCloneSession(m_session, clone);} + virtual mfxStatus SetPriority( mfxPriority priority) { return MFXSetPriority(m_session, priority);} + virtual mfxStatus GetPriority( mfxPriority *priority) { return MFXGetPriority(m_session, priority);} + + virtual mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) { return MFXAudioCORE_SyncOperation(m_session, syncp, wait); } + + virtual operator mfxSession (void) { return m_session; } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + + +class MFXAudioDECODE +{ +public: + + MFXAudioDECODE(mfxSession session) { m_session = session; } + virtual ~MFXAudioDECODE(void) { Close(); } + + virtual mfxStatus Query(mfxAudioParam *in, mfxAudioParam *out) { return MFXAudioDECODE_Query(m_session, in, out); } + virtual mfxStatus DecodeHeader(mfxBitstream *bs, mfxAudioParam *par) { return MFXAudioDECODE_DecodeHeader(m_session, bs, par); } + virtual mfxStatus QueryIOSize(mfxAudioParam *par, mfxAudioAllocRequest *request) { return MFXAudioDECODE_QueryIOSize(m_session, par, request); } + virtual mfxStatus Init(mfxAudioParam *par) { return MFXAudioDECODE_Init(m_session, par); } + virtual mfxStatus Reset(mfxAudioParam *par) { return MFXAudioDECODE_Reset(m_session, par); } + virtual mfxStatus Close(void) { return MFXAudioDECODE_Close(m_session); } + virtual mfxStatus GetAudioParam(mfxAudioParam *par) { return MFXAudioDECODE_GetAudioParam(m_session, par); } + virtual mfxStatus DecodeFrameAsync(mfxBitstream *bs, mfxAudioFrame *frame, mfxSyncPoint *syncp) { return MFXAudioDECODE_DecodeFrameAsync(m_session, bs, frame, syncp); } + + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + + +class MFXAudioENCODE +{ +public: + + MFXAudioENCODE(mfxSession session) { m_session = session; } + virtual ~MFXAudioENCODE(void) { Close(); } + + virtual mfxStatus Query(mfxAudioParam *in, mfxAudioParam *out) { return MFXAudioENCODE_Query(m_session, in, out); } + virtual mfxStatus QueryIOSize(mfxAudioParam *par, mfxAudioAllocRequest *request) { return MFXAudioENCODE_QueryIOSize(m_session, par, request); } + virtual mfxStatus Init(mfxAudioParam *par) { return MFXAudioENCODE_Init(m_session, par); } + virtual mfxStatus Reset(mfxAudioParam *par) { return MFXAudioENCODE_Reset(m_session, par); } + virtual mfxStatus Close(void) { return MFXAudioENCODE_Close(m_session); } + virtual mfxStatus GetAudioParam(mfxAudioParam *par) { return MFXAudioENCODE_GetAudioParam(m_session, par); } + virtual mfxStatus EncodeFrameAsync(mfxAudioFrame *frame, mfxBitstream *buffer_out, mfxSyncPoint *syncp) { return MFXAudioENCODE_EncodeFrameAsync(m_session, frame, buffer_out, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +#endif \ No newline at end of file diff --git a/.github/actions/libmfx/include/mfx/mfxaudio.h b/.github/actions/libmfx/include/mfx/mfxaudio.h new file mode 100644 index 0000000..fd5872f --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxaudio.h @@ -0,0 +1,60 @@ +// Copyright (c) 2017 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef __MFXAUDIO_H__ +#define __MFXAUDIO_H__ +#include "mfxsession.h" +#include "mfxastructures.h" + +#define MFX_AUDIO_VERSION_MAJOR 1 +#define MFX_AUDIO_VERSION_MINOR 15 + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* AudioCORE */ +mfxStatus MFX_CDECL MFXAudioCORE_SyncOperation(mfxSession session, mfxSyncPoint syncp, mfxU32 wait); + +/* AudioENCODE */ +mfxStatus MFX_CDECL MFXAudioENCODE_Query(mfxSession session, mfxAudioParam *in, mfxAudioParam *out); +mfxStatus MFX_CDECL MFXAudioENCODE_QueryIOSize(mfxSession session, mfxAudioParam *par, mfxAudioAllocRequest *request); +mfxStatus MFX_CDECL MFXAudioENCODE_Init(mfxSession session, mfxAudioParam *par); +mfxStatus MFX_CDECL MFXAudioENCODE_Reset(mfxSession session, mfxAudioParam *par); +mfxStatus MFX_CDECL MFXAudioENCODE_Close(mfxSession session); +mfxStatus MFX_CDECL MFXAudioENCODE_GetAudioParam(mfxSession session, mfxAudioParam *par); +mfxStatus MFX_CDECL MFXAudioENCODE_EncodeFrameAsync(mfxSession session, mfxAudioFrame *frame, mfxBitstream *bs, mfxSyncPoint *syncp); + +/* AudioDECODE */ +mfxStatus MFX_CDECL MFXAudioDECODE_Query(mfxSession session, mfxAudioParam *in, mfxAudioParam *out); +mfxStatus MFX_CDECL MFXAudioDECODE_DecodeHeader(mfxSession session, mfxBitstream *bs, mfxAudioParam* par); +mfxStatus MFX_CDECL MFXAudioDECODE_Init(mfxSession session, mfxAudioParam *par); +mfxStatus MFX_CDECL MFXAudioDECODE_Reset(mfxSession session, mfxAudioParam *par); +mfxStatus MFX_CDECL MFXAudioDECODE_Close(mfxSession session); +mfxStatus MFX_CDECL MFXAudioDECODE_QueryIOSize(mfxSession session, mfxAudioParam *par, mfxAudioAllocRequest *request); +mfxStatus MFX_CDECL MFXAudioDECODE_GetAudioParam(mfxSession session, mfxAudioParam *par); +mfxStatus MFX_CDECL MFXAudioDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxAudioFrame *frame, mfxSyncPoint *syncp); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/.github/actions/libmfx/include/mfx/mfxbrc.h b/.github/actions/libmfx/include/mfx/mfxbrc.h new file mode 100644 index 0000000..80516c3 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxbrc.h @@ -0,0 +1,129 @@ +// Copyright (c) 2019-2020 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXBRC_H__ +#define __MFXBRC_H__ + +#include "mfxvstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_BRC = MFX_MAKEFOURCC('E','B','R','C') +}; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { +#if (MFX_VERSION >= 1026) + mfxU32 reserved[23]; + mfxU16 SceneChange; // Frame is Scene Chg frame + mfxU16 LongTerm; // Frame is long term refrence + mfxU32 FrameCmplx; // Frame Complexity +#else + mfxU32 reserved[25]; +#endif + mfxU32 EncodedOrder; // Frame number in a sequence of reordered frames starting from encoder Init() + mfxU32 DisplayOrder; // Frame number in a sequence of frames in display order starting from last IDR + mfxU32 CodedFrameSize; // Size of frame in bytes after encoding + mfxU16 FrameType; // See FrameType enumerator + mfxU16 PyramidLayer; // B-pyramid or P-pyramid layer, frame belongs to + mfxU16 NumRecode; // Number of recodings performed for this frame + mfxU16 NumExtParam; + mfxExtBuffer** ExtParam; +} mfxBRCFrameParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxI32 QpY; // Frame-level Luma QP +#if (MFX_VERSION >= 1029) + mfxU32 InitialCpbRemovalDelay; + mfxU32 InitialCpbRemovalOffset; + mfxU32 reserved1[7]; + mfxU32 MaxFrameSize; // Max frame size in bytes (used for rePak) + mfxU8 DeltaQP[8]; // deltaQP[i] is adding to QP value while i-rePak + mfxU16 MaxNumRepak; // Max number of rePak to provide MaxFrameSize (from 0 to 8) + mfxU16 NumExtParam; + mfxExtBuffer** ExtParam; // extension buffer list +#else + mfxU32 reserved1[13]; + mfxHDL reserved2; +#endif +} mfxBRCFrameCtrl; +MFX_PACK_END() + +/* BRCStatus */ +enum { + MFX_BRC_OK = 0, // CodedFrameSize is acceptable, no further recoding/padding/skip required + MFX_BRC_BIG_FRAME = 1, // Coded frame is too big, recoding required + MFX_BRC_SMALL_FRAME = 2, // Coded frame is too small, recoding required + MFX_BRC_PANIC_BIG_FRAME = 3, // Coded frame is too big, no further recoding possible - skip frame + MFX_BRC_PANIC_SMALL_FRAME = 4 // Coded frame is too small, no further recoding possible - required padding to MinFrameSize +}; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxU32 MinFrameSize; // Size in bytes, coded frame must be padded to when Status = MFX_BRC_PANIC_SMALL_FRAME + mfxU16 BRCStatus; // See BRCStatus enumerator + mfxU16 reserved[25]; + mfxHDL reserved1; +} mfxBRCFrameStatus; +MFX_PACK_END() + +/* Structure contains set of callbacks to perform external bit-rate control. +Can be attached to mfxVideoParam structure during encoder initialization. +Turn mfxExtCodingOption2::ExtBRC option ON to make encoder use external BRC instead of native one. */ +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + + mfxU32 reserved[14]; + mfxHDL pthis; // Pointer to user-defined BRC instance. Will be passed to each mfxExtBRC callback. + + // Initialize BRC. Will be invoked during encoder Init(). In - pthis, par. + mfxStatus (MFX_CDECL *Init) (mfxHDL pthis, mfxVideoParam* par); + + // Reset BRC. Will be invoked during encoder Reset(). In - pthis, par. + mfxStatus (MFX_CDECL *Reset) (mfxHDL pthis, mfxVideoParam* par); + + // Close BRC. Will be invoked during encoder Close(). In - pthis. + mfxStatus (MFX_CDECL *Close) (mfxHDL pthis); + + // Obtain from BRC controls required for frame encoding. + // Will be invoked BEFORE encoding of each frame. In - pthis, par; Out - ctrl. + mfxStatus (MFX_CDECL *GetFrameCtrl) (mfxHDL pthis, mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl); + + // Update BRC state and return command to continue/recode frame/do padding/skip frame. + // Will be invoked AFTER encoding of each frame. In - pthis, par, ctrl; Out - status. + mfxStatus (MFX_CDECL *Update) (mfxHDL pthis, mfxBRCFrameParam* par, mfxBRCFrameCtrl* ctrl, mfxBRCFrameStatus* status); + + mfxHDL reserved1[10]; +} mfxExtBRC; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxcamera.h b/.github/actions/libmfx/include/mfx/mfxcamera.h new file mode 100644 index 0000000..9af8021 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxcamera.h @@ -0,0 +1,271 @@ +// Copyright (c) 2018-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXCAMERA_H__ +#define __MFXCAMERA_H__ +#include "mfxcommon.h" + +#if !defined (__GNUC__) +#pragma warning(disable: 4201) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Camera Extended Buffer Ids */ +enum { + MFX_EXTBUF_CAM_GAMMA_CORRECTION = MFX_MAKEFOURCC('C','G','A','M'), + MFX_EXTBUF_CAM_WHITE_BALANCE = MFX_MAKEFOURCC('C','W','B','L'), + MFX_EXTBUF_CAM_HOT_PIXEL_REMOVAL = MFX_MAKEFOURCC('C','H','P','R'), + MFX_EXTBUF_CAM_BLACK_LEVEL_CORRECTION = MFX_MAKEFOURCC('C','B','L','C'), + MFX_EXTBUF_CAM_VIGNETTE_CORRECTION = MFX_MAKEFOURCC('C','V','G','T'), + MFX_EXTBUF_CAM_BAYER_DENOISE = MFX_MAKEFOURCC('C','D','N','S'), + MFX_EXTBUF_CAM_COLOR_CORRECTION_3X3 = MFX_MAKEFOURCC('C','C','3','3'), + MFX_EXTBUF_CAM_PADDING = MFX_MAKEFOURCC('C','P','A','D'), + MFX_EXTBUF_CAM_PIPECONTROL = MFX_MAKEFOURCC('C','P','P','C'), + MFX_EXTBUF_CAM_FORWARD_GAMMA_CORRECTION = MFX_MAKEFOURCC('C','F','G','C'), + MFX_EXTBUF_CAM_LENS_GEOM_DIST_CORRECTION = MFX_MAKEFOURCC('C','L','G','D'), + MFX_EXTBUF_CAM_3DLUT = MFX_MAKEFOURCC('C','L','U','T'), + MFX_EXTBUF_CAM_TOTAL_COLOR_CONTROL = MFX_MAKEFOURCC('C','T','C','C'), + MFX_EXTBUF_CAM_CSC_YUV_RGB = MFX_MAKEFOURCC('C','C','Y','R') +}; + +typedef enum { + MFX_CAM_GAMMA_VALUE = 0x0001, + MFX_CAM_GAMMA_LUT = 0x0002, +} mfxCamGammaParam; + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + mfxU16 Mode; + mfxU16 reserved1; + mfxF64 GammaValue; + + mfxU16 reserved2[3]; + mfxU16 NumPoints; + mfxU16 GammaPoint[1024]; + mfxU16 GammaCorrected[1024]; + mfxU32 reserved3[4]; +} mfxExtCamGammaCorrection; +MFX_PACK_END() + +typedef enum { + MFX_CAM_WHITE_BALANCE_MANUAL = 0x0001, + MFX_CAM_WHITE_BALANCE_AUTO = 0x0002 +} mfxCamWhiteBalanceMode; + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + mfxU32 Mode; + mfxF64 R; + mfxF64 G0; + mfxF64 B; + mfxF64 G1; + mfxU32 reserved[8]; +} mfxExtCamWhiteBalance; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 R; + mfxU16 G; + mfxU16 B; + mfxU16 C; + mfxU16 M; + mfxU16 Y; + mfxU16 reserved[6]; +} mfxExtCamTotalColorControl; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxF32 PreOffset[3]; + mfxF32 Matrix[3][3]; + mfxF32 PostOffset[3]; + mfxU16 reserved[30]; +} mfxExtCamCscYuvRgb; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 PixelThresholdDifference; + mfxU16 PixelCountThreshold; +} mfxExtCamHotPixelRemoval; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 R; + mfxU16 G0; + mfxU16 B; + mfxU16 G1; + mfxU32 reserved[4]; +} mfxExtCamBlackLevelCorrection; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU8 integer; + mfxU8 mantissa; +} mfxCamVignetteCorrectionElement; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxCamVignetteCorrectionElement R; + mfxCamVignetteCorrectionElement G0; + mfxCamVignetteCorrectionElement B; + mfxCamVignetteCorrectionElement G1; +} mfxCamVignetteCorrectionParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + + mfxU32 Width; + mfxU32 Height; + mfxU32 Pitch; + mfxU32 reserved[7]; + + mfxCamVignetteCorrectionParam *CorrectionMap; + +} mfxExtCamVignetteCorrection; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 Threshold; + mfxU16 reserved[27]; +} mfxExtCamBayerDenoise; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + mfxF64 CCM[3][3]; + mfxU32 reserved[4]; +} mfxExtCamColorCorrection3x3; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 Top; + mfxU16 Bottom; + mfxU16 Left; + mfxU16 Right; + mfxU32 reserved[4]; +} mfxExtCamPadding; +MFX_PACK_END() + +typedef enum { + MFX_CAM_BAYER_BGGR = 0x0000, + MFX_CAM_BAYER_RGGB = 0x0001, + MFX_CAM_BAYER_GBRG = 0x0002, + MFX_CAM_BAYER_GRBG = 0x0003 +} mfxCamBayerFormat; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 RawFormat; + mfxU16 reserved1; + mfxU32 reserved[5]; +} mfxExtCamPipeControl; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct{ + mfxU16 Pixel; + mfxU16 Red; + mfxU16 Green; + mfxU16 Blue; +} mfxCamFwdGammaSegment; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved[19]; + mfxU16 NumSegments; + union { + mfxCamFwdGammaSegment* Segment; + mfxU64 reserved1; + }; +} mfxExtCamFwdGamma; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxF32 a[3]; // [R, G, B] + mfxF32 b[3]; // [R, G, B] + mfxF32 c[3]; // [R, G, B] + mfxF32 d[3]; // [R, G, B] + mfxU16 reserved[36]; +} mfxExtCamLensGeomDistCorrection; +MFX_PACK_END() + +/* LUTSize */ +enum { + MFX_CAM_3DLUT17_SIZE = (17 * 17 * 17), + MFX_CAM_3DLUT33_SIZE = (33 * 33 * 33), + MFX_CAM_3DLUT65_SIZE = (65 * 65 * 65) +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU16 R; + mfxU16 G; + mfxU16 B; + mfxU16 Reserved; +} mfxCam3DLutEntry; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved[10]; + mfxU32 Size; + union + { + mfxCam3DLutEntry* Table; + mfxU64 reserved1; + }; +} mfxExtCam3DLut; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // __MFXCAMERA_H__ diff --git a/.github/actions/libmfx/include/mfx/mfxcommon.h b/.github/actions/libmfx/include/mfx/mfxcommon.h new file mode 100644 index 0000000..875b47f --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxcommon.h @@ -0,0 +1,212 @@ +// Copyright (c) 2018-2020 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXCOMMON_H__ +#define __MFXCOMMON_H__ +#include "mfxdefs.h" + +#if !defined (__GNUC__) +#pragma warning(disable: 4201) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#define MFX_MAKEFOURCC(A,B,C,D) ((((int)A))+(((int)B)<<8)+(((int)C)<<16)+(((int)D)<<24)) + +/* Extended Configuration Header Structure */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU32 BufferId; + mfxU32 BufferSz; +} mfxExtBuffer; +MFX_PACK_END() + +/* Library initialization and deinitialization */ +typedef mfxI32 mfxIMPL; +#define MFX_IMPL_BASETYPE(x) (0x00ff & (x)) + +enum { + MFX_IMPL_AUTO = 0x0000, /* Auto Selection/In or Not Supported/Out */ + MFX_IMPL_SOFTWARE = 0x0001, /* Pure Software Implementation */ + MFX_IMPL_HARDWARE = 0x0002, /* Hardware Accelerated Implementation (default device) */ + MFX_IMPL_AUTO_ANY = 0x0003, /* Auto selection of any hardware/software implementation */ + MFX_IMPL_HARDWARE_ANY = 0x0004, /* Auto selection of any hardware implementation */ + MFX_IMPL_HARDWARE2 = 0x0005, /* Hardware accelerated implementation (2nd device) */ + MFX_IMPL_HARDWARE3 = 0x0006, /* Hardware accelerated implementation (3rd device) */ + MFX_IMPL_HARDWARE4 = 0x0007, /* Hardware accelerated implementation (4th device) */ + MFX_IMPL_RUNTIME = 0x0008, +#if (MFX_VERSION >= MFX_VERSION_NEXT) + MFX_IMPL_SINGLE_THREAD= 0x0009, +#endif + MFX_IMPL_VIA_ANY = 0x0100, + MFX_IMPL_VIA_D3D9 = 0x0200, + MFX_IMPL_VIA_D3D11 = 0x0300, + MFX_IMPL_VIA_VAAPI = 0x0400, + + MFX_IMPL_AUDIO = 0x8000, +#if (MFX_VERSION >= MFX_VERSION_NEXT) + MFX_IMPL_EXTERNAL_THREADING = 0x10000, +#endif + + MFX_IMPL_UNSUPPORTED = 0x0000 /* One of the MFXQueryIMPL returns */ +}; + +/* Version Info */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef union { + struct { + mfxU16 Minor; + mfxU16 Major; + }; + mfxU32 Version; +} mfxVersion; +MFX_PACK_END() + +/* session priority */ +typedef enum +{ + MFX_PRIORITY_LOW = 0, + MFX_PRIORITY_NORMAL = 1, + MFX_PRIORITY_HIGH = 2 + +} mfxPriority; + +typedef struct _mfxEncryptedData mfxEncryptedData; +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + union { + struct { + mfxEncryptedData* EncryptedData; + mfxExtBuffer **ExtParam; + mfxU16 NumExtParam; + }; + mfxU32 reserved[6]; + }; + mfxI64 DecodeTimeStamp; + mfxU64 TimeStamp; + mfxU8* Data; + mfxU32 DataOffset; + mfxU32 DataLength; + mfxU32 MaxLength; + + mfxU16 PicStruct; + mfxU16 FrameType; + mfxU16 DataFlag; + mfxU16 reserved2; +} mfxBitstream; +MFX_PACK_END() + +typedef struct _mfxSyncPoint *mfxSyncPoint; + +/* GPUCopy */ +enum { + MFX_GPUCOPY_DEFAULT = 0, + MFX_GPUCOPY_ON = 1, + MFX_GPUCOPY_OFF = 2 +}; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxIMPL Implementation; + mfxVersion Version; + mfxU16 ExternalThreads; + union { + struct { + mfxExtBuffer **ExtParam; + mfxU16 NumExtParam; + }; + mfxU16 reserved2[5]; + }; + mfxU16 GPUCopy; + mfxU16 reserved[21]; +} mfxInitParam; +MFX_PACK_END() + +enum { + MFX_EXTBUFF_THREADS_PARAM = MFX_MAKEFOURCC('T','H','D','P') +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 NumThread; + mfxI32 SchedulingType; + mfxI32 Priority; + mfxU16 reserved[55]; +} mfxExtThreadsParam; +MFX_PACK_END() + +/* PlatformCodeName */ +enum { + MFX_PLATFORM_UNKNOWN = 0, + MFX_PLATFORM_SANDYBRIDGE = 1, + MFX_PLATFORM_IVYBRIDGE = 2, + MFX_PLATFORM_HASWELL = 3, + MFX_PLATFORM_BAYTRAIL = 4, + MFX_PLATFORM_BROADWELL = 5, + MFX_PLATFORM_CHERRYTRAIL = 6, + MFX_PLATFORM_SKYLAKE = 7, + MFX_PLATFORM_APOLLOLAKE = 8, + MFX_PLATFORM_KABYLAKE = 9, +#if (MFX_VERSION >= 1025) + MFX_PLATFORM_GEMINILAKE = 10, + MFX_PLATFORM_COFFEELAKE = 11, + MFX_PLATFORM_CANNONLAKE = 20, +#endif +#if (MFX_VERSION >= 1027) + MFX_PLATFORM_ICELAKE = 30, +#endif + MFX_PLATFORM_JASPERLAKE = 32, + MFX_PLATFORM_ELKHARTLAKE = 33, + MFX_PLATFORM_TIGERLAKE = 40, + MFX_PLATFORM_KEEMBAY = 50, +}; + +#if (MFX_VERSION >= 1031) +typedef enum +{ + MFX_MEDIA_UNKNOWN = 0xffff, + MFX_MEDIA_INTEGRATED = 0, + MFX_MEDIA_DISCRETE = 1 +} mfxMediaAdapterType; +#endif + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU16 CodeName; + mfxU16 DeviceId; +#if (MFX_VERSION >= 1031) + mfxU16 MediaAdapterType; + mfxU16 reserved[13]; +#else + mfxU16 reserved[14]; +#endif +} mfxPlatform; +MFX_PACK_END() + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxdefs.h b/.github/actions/libmfx/include/mfx/mfxdefs.h new file mode 100644 index 0000000..07acf55 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxdefs.h @@ -0,0 +1,212 @@ +// Copyright (c) 2019-2020 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXDEFS_H__ +#define __MFXDEFS_H__ + +#define MFX_VERSION_MAJOR 1 +#define MFX_VERSION_MINOR 34 + +// MFX_VERSION_NEXT is always +1 from last public release +// may be enforced by MFX_VERSION_USE_LATEST define +// if MFX_VERSION_USE_LATEST is defined MFX_VERSION is ignored + +#define MFX_VERSION_NEXT (MFX_VERSION_MAJOR * 1000 + MFX_VERSION_MINOR + 1) + +// MFX_VERSION - version of API that 'assumed' by build may be provided externally +// if it omitted then latest stable API derived from Major.Minor is assumed + + +#if !defined(MFX_VERSION) + #if defined(MFX_VERSION_USE_LATEST) + #define MFX_VERSION MFX_VERSION_NEXT + #else + #define MFX_VERSION (MFX_VERSION_MAJOR * 1000 + MFX_VERSION_MINOR) + #endif +#else + #undef MFX_VERSION_MINOR + #define MFX_VERSION_MINOR ((MFX_VERSION) % 1000) +#endif + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* In preprocessor syntax # symbol has stringize meaning, + so to expand some macro to preprocessor pragma we need to use + special compiler dependent construction */ + +#if defined(_MSC_VER) + #define MFX_PRAGMA_IMPL(x) __pragma(x) +#else + #define MFX_PRAGMA_IMPL(x) _Pragma(#x) +#endif + +#define MFX_PACK_BEGIN_X(x) MFX_PRAGMA_IMPL(pack(push, x)) +#define MFX_PACK_END() MFX_PRAGMA_IMPL(pack(pop)) + +/* The general rule for alignment is following: + - structures with pointers have 4/8 bytes alignment on 32/64 bit systems + - structures with fields of type mfxU64/mfxF64 (unsigned long long / double) + have alignment 8 bytes on 64 bit and 32 bit Windows, on Linux alignment is 4 bytes + - all the rest structures are 4 bytes aligned + - there are several exceptions: some structs which had 4-byte alignment were extended + with pointer / long type fields; such structs have 4-byte alignment to keep binary + compatibility with previously release API */ + +#define MFX_PACK_BEGIN_USUAL_STRUCT() MFX_PACK_BEGIN_X(4) + +/* 64-bit LP64 data model */ +#if defined(_WIN64) || defined(__LP64__) + #define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(8) + #define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(8) +/* 32-bit ILP32 data model Windows (Intel architecture) */ +#elif defined(_WIN32) || defined(_M_IX86) && !defined(__linux__) + #define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(4) + #define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(8) +/* 32-bit ILP32 data model Linux */ +#elif defined(__ILP32__) + #define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(4) + #define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(4) +#else + #error Unknown packing +#endif + + #define __INT64 long long + #define __UINT64 unsigned long long + +#ifdef _WIN32 + #define MFX_CDECL __cdecl + #define MFX_STDCALL __stdcall +#else + #define MFX_CDECL + #define MFX_STDCALL +#endif /* _WIN32 */ + +#define MFX_INFINITE 0xFFFFFFFF + +typedef unsigned char mfxU8; +typedef char mfxI8; +typedef short mfxI16; +typedef unsigned short mfxU16; +typedef unsigned int mfxU32; +typedef int mfxI32; +#if defined( _WIN32 ) || defined ( _WIN64 ) +typedef unsigned long mfxUL32; +typedef long mfxL32; +#else +typedef unsigned int mfxUL32; +typedef int mfxL32; +#endif +typedef float mfxF32; +typedef double mfxF64; +typedef __UINT64 mfxU64; +typedef __INT64 mfxI64; +typedef void* mfxHDL; +typedef mfxHDL mfxMemId; +typedef void* mfxThreadTask; +typedef char mfxChar; + +typedef struct { + mfxI16 x; + mfxI16 y; +} mfxI16Pair; + +typedef struct { + mfxHDL first; + mfxHDL second; +} mfxHDLPair; + + +/*********************************************************************************\ +Error message +\*********************************************************************************/ +typedef enum +{ + /* no error */ + MFX_ERR_NONE = 0, /* no error */ + + /* reserved for unexpected errors */ + MFX_ERR_UNKNOWN = -1, /* unknown error. */ + + /* error codes <0 */ + MFX_ERR_NULL_PTR = -2, /* null pointer */ + MFX_ERR_UNSUPPORTED = -3, /* undeveloped feature */ + MFX_ERR_MEMORY_ALLOC = -4, /* failed to allocate memory */ + MFX_ERR_NOT_ENOUGH_BUFFER = -5, /* insufficient buffer at input/output */ + MFX_ERR_INVALID_HANDLE = -6, /* invalid handle */ + MFX_ERR_LOCK_MEMORY = -7, /* failed to lock the memory block */ + MFX_ERR_NOT_INITIALIZED = -8, /* member function called before initialization */ + MFX_ERR_NOT_FOUND = -9, /* the specified object is not found */ + MFX_ERR_MORE_DATA = -10, /* expect more data at input */ + MFX_ERR_MORE_SURFACE = -11, /* expect more surface at output */ + MFX_ERR_ABORTED = -12, /* operation aborted */ + MFX_ERR_DEVICE_LOST = -13, /* lose the HW acceleration device */ + MFX_ERR_INCOMPATIBLE_VIDEO_PARAM = -14, /* incompatible video parameters */ + MFX_ERR_INVALID_VIDEO_PARAM = -15, /* invalid video parameters */ + MFX_ERR_UNDEFINED_BEHAVIOR = -16, /* undefined behavior */ + MFX_ERR_DEVICE_FAILED = -17, /* device operation failure */ + MFX_ERR_MORE_BITSTREAM = -18, /* expect more bitstream buffers at output */ + MFX_ERR_INCOMPATIBLE_AUDIO_PARAM = -19, /* incompatible audio parameters */ + MFX_ERR_INVALID_AUDIO_PARAM = -20, /* invalid audio parameters */ + MFX_ERR_GPU_HANG = -21, /* device operation failure caused by GPU hang */ + MFX_ERR_REALLOC_SURFACE = -22, /* bigger output surface required */ + + /* warnings >0 */ + MFX_WRN_IN_EXECUTION = 1, /* the previous asynchronous operation is in execution */ + MFX_WRN_DEVICE_BUSY = 2, /* the HW acceleration device is busy */ + MFX_WRN_VIDEO_PARAM_CHANGED = 3, /* the video parameters are changed during decoding */ + MFX_WRN_PARTIAL_ACCELERATION = 4, /* SW is used */ + MFX_WRN_INCOMPATIBLE_VIDEO_PARAM = 5, /* incompatible video parameters */ + MFX_WRN_VALUE_NOT_CHANGED = 6, /* the value is saturated based on its valid range */ + MFX_WRN_OUT_OF_RANGE = 7, /* the value is out of valid range */ + MFX_WRN_FILTER_SKIPPED = 10, /* one of requested filters has been skipped */ + MFX_WRN_INCOMPATIBLE_AUDIO_PARAM = 11, /* incompatible audio parameters */ + +#if MFX_VERSION >= 1031 + /* low-delay partial output */ + MFX_ERR_NONE_PARTIAL_OUTPUT = 12, /* frame is not ready, but bitstream contains partial output */ +#endif + + /* threading statuses */ + MFX_TASK_DONE = MFX_ERR_NONE, /* task has been completed */ + MFX_TASK_WORKING = 8, /* there is some more work to do */ + MFX_TASK_BUSY = 9, /* task is waiting for resources */ + + /* plug-in statuses */ + MFX_ERR_MORE_DATA_SUBMIT_TASK = -10000, /* return MFX_ERR_MORE_DATA but submit internal asynchronous task */ + +} mfxStatus; + + +// Application +#if defined(MFX_DISPATCHER_EXPOSED_PREFIX) + +#include "mfxdispatcherprefixedfunctions.h" + +#endif // MFX_DISPATCHER_EXPOSED_PREFIX + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __MFXDEFS_H__ */ diff --git a/.github/actions/libmfx/include/mfx/mfxdispatcherprefixedfunctions.h b/.github/actions/libmfx/include/mfx/mfxdispatcherprefixedfunctions.h new file mode 100644 index 0000000..f823793 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxdispatcherprefixedfunctions.h @@ -0,0 +1,145 @@ +// Copyright (c) 2017 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + + +#ifndef __MFXDISPATCHERPREFIXEDFUNCTIONS_H__ +#define __MFXDISPATCHERPREFIXEDFUNCTIONS_H__ + +// API 1.0 functions +#define MFXInit disp_MFXInit +#define MFXClose disp_MFXClose +#define MFXQueryIMPL disp_MFXQueryIMPL +#define MFXQueryVersion disp_MFXQueryVersion + +#define MFXJoinSession disp_MFXJoinSession +#define MFXDisjoinSession disp_MFXDisjoinSession +#define MFXCloneSession disp_MFXCloneSession +#define MFXSetPriority disp_MFXSetPriority +#define MFXGetPriority disp_MFXGetPriority + +#define MFXVideoCORE_SetBufferAllocator disp_MFXVideoCORE_SetBufferAllocator +#define MFXVideoCORE_SetFrameAllocator disp_MFXVideoCORE_SetFrameAllocator +#define MFXVideoCORE_SetHandle disp_MFXVideoCORE_SetHandle +#define MFXVideoCORE_GetHandle disp_MFXVideoCORE_GetHandle +#define MFXVideoCORE_SyncOperation disp_MFXVideoCORE_SyncOperation + +#define MFXVideoENCODE_Query disp_MFXVideoENCODE_Query +#define MFXVideoENCODE_QueryIOSurf disp_MFXVideoENCODE_QueryIOSurf +#define MFXVideoENCODE_Init disp_MFXVideoENCODE_Init +#define MFXVideoENCODE_Reset disp_MFXVideoENCODE_Reset +#define MFXVideoENCODE_Close disp_MFXVideoENCODE_Close +#define MFXVideoENCODE_GetVideoParam disp_MFXVideoENCODE_GetVideoParam +#define MFXVideoENCODE_GetEncodeStat disp_MFXVideoENCODE_GetEncodeStat +#define MFXVideoENCODE_EncodeFrameAsync disp_MFXVideoENCODE_EncodeFrameAsync + +#define MFXVideoDECODE_Query disp_MFXVideoDECODE_Query +#define MFXVideoDECODE_DecodeHeader disp_MFXVideoDECODE_DecodeHeader +#define MFXVideoDECODE_QueryIOSurf disp_MFXVideoDECODE_QueryIOSurf +#define MFXVideoDECODE_Init disp_MFXVideoDECODE_Init +#define MFXVideoDECODE_Reset disp_MFXVideoDECODE_Reset +#define MFXVideoDECODE_Close disp_MFXVideoDECODE_Close +#define MFXVideoDECODE_GetVideoParam disp_MFXVideoDECODE_GetVideoParam +#define MFXVideoDECODE_GetDecodeStat disp_MFXVideoDECODE_GetDecodeStat +#define MFXVideoDECODE_SetSkipMode disp_MFXVideoDECODE_SetSkipMode +#define MFXVideoDECODE_GetPayload disp_MFXVideoDECODE_GetPayload +#define MFXVideoDECODE_DecodeFrameAsync disp_MFXVideoDECODE_DecodeFrameAsync + +#define MFXVideoVPP_Query disp_MFXVideoVPP_Query +#define MFXVideoVPP_QueryIOSurf disp_MFXVideoVPP_QueryIOSurf +#define MFXVideoVPP_Init disp_MFXVideoVPP_Init +#define MFXVideoVPP_Reset disp_MFXVideoVPP_Reset +#define MFXVideoVPP_Close disp_MFXVideoVPP_Close + +#define MFXVideoVPP_GetVideoParam disp_MFXVideoVPP_GetVideoParam +#define MFXVideoVPP_GetVPPStat disp_MFXVideoVPP_GetVPPStat +#define MFXVideoVPP_RunFrameVPPAsync disp_MFXVideoVPP_RunFrameVPPAsync + +// API 1.1 functions +#define MFXVideoUSER_Register disp_MFXVideoUSER_Register +#define MFXVideoUSER_Unregister disp_MFXVideoUSER_Unregister +#define MFXVideoUSER_ProcessFrameAsync disp_MFXVideoUSER_ProcessFrameAsync + +// API 1.10 functions + +#define MFXVideoENC_Query disp_MFXVideoENC_Query +#define MFXVideoENC_QueryIOSurf disp_MFXVideoENC_QueryIOSurf +#define MFXVideoENC_Init disp_MFXVideoENC_Init +#define MFXVideoENC_Reset disp_MFXVideoENC_Reset +#define MFXVideoENC_Close disp_MFXVideoENC_Close +#define MFXVideoENC_ProcessFrameAsync disp_MFXVideoENC_ProcessFrameAsync +#define MFXVideoVPP_RunFrameVPPAsyncEx disp_MFXVideoVPP_RunFrameVPPAsyncEx +#define MFXVideoUSER_Load disp_MFXVideoUSER_Load +#define MFXVideoUSER_UnLoad disp_MFXVideoUSER_UnLoad + +// API 1.11 functions + +#define MFXVideoPAK_Query disp_MFXVideoPAK_Query +#define MFXVideoPAK_QueryIOSurf disp_MFXVideoPAK_QueryIOSurf +#define MFXVideoPAK_Init disp_MFXVideoPAK_Init +#define MFXVideoPAK_Reset disp_MFXVideoPAK_Reset +#define MFXVideoPAK_Close disp_MFXVideoPAK_Close +#define MFXVideoPAK_ProcessFrameAsync disp_MFXVideoPAK_ProcessFrameAsync + +// API 1.13 functions + +#define MFXVideoUSER_LoadByPath disp_MFXVideoUSER_LoadByPath + +// API 1.14 functions +#define MFXInitEx disp_MFXInitEx +#define MFXDoWork disp_MFXDoWork + +// Audio library functions + +// API 1.8 functions + +#define MFXAudioCORE_SyncOperation disp_MFXAudioCORE_SyncOperation +#define MFXAudioENCODE_Query disp_MFXAudioENCODE_Query +#define MFXAudioENCODE_QueryIOSize disp_MFXAudioENCODE_QueryIOSize +#define MFXAudioENCODE_Init disp_MFXAudioENCODE_Init +#define MFXAudioENCODE_Reset disp_MFXAudioENCODE_Reset +#define MFXAudioENCODE_Close disp_MFXAudioENCODE_Close +#define MFXAudioENCODE_GetAudioParam disp_MFXAudioENCODE_GetAudioParam +#define MFXAudioENCODE_EncodeFrameAsync disp_MFXAudioENCODE_EncodeFrameAsync + +#define MFXAudioDECODE_Query disp_MFXAudioDECODE_Query +#define MFXAudioDECODE_DecodeHeader disp_MFXAudioDECODE_DecodeHeader +#define MFXAudioDECODE_Init disp_MFXAudioDECODE_Init +#define MFXAudioDECODE_Reset disp_MFXAudioDECODE_Reset +#define MFXAudioDECODE_Close disp_MFXAudioDECODE_Close +#define MFXAudioDECODE_QueryIOSize disp_MFXAudioDECODE_QueryIOSize +#define MFXAudioDECODE_GetAudioParam disp_MFXAudioDECODE_GetAudioParam +#define MFXAudioDECODE_DecodeFrameAsync disp_MFXAudioDECODE_DecodeFrameAsync + +// API 1.9 functions + +#define MFXAudioUSER_Register disp_MFXAudioUSER_Register +#define MFXAudioUSER_Unregister disp_MFXAudioUSER_Unregister +#define MFXAudioUSER_ProcessFrameAsync disp_MFXAudioUSER_ProcessFrameAsync +#define MFXAudioUSER_Load disp_MFXAudioUSER_Load +#define MFXAudioUSER_UnLoad disp_MFXAudioUSER_UnLoad + +// API 1.19 functions + +#define MFXVideoENC_GetVideoParam disp_MFXVideoENC_GetVideoParam +#define MFXVideoPAK_GetVideoParam disp_MFXVideoPAK_GetVideoParam +#define MFXVideoCORE_QueryPlatform disp_MFXVideoCORE_QueryPlatform +#define MFXVideoUSER_GetPlugin disp_MFXVideoUSER_GetPlugin + +#endif \ No newline at end of file diff --git a/.github/actions/libmfx/include/mfx/mfxenc.h b/.github/actions/libmfx/include/mfx/mfxenc.h new file mode 100644 index 0000000..4a3296b --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxenc.h @@ -0,0 +1,74 @@ +// Copyright (c) 2017-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXENC_H__ +#define __MFXENC_H__ +#include "mfxdefs.h" +#include "mfxvstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct _mfxENCInput{ + mfxU32 reserved[32]; + + mfxFrameSurface1 *InSurface; + + mfxU16 NumFrameL0; + mfxFrameSurface1 **L0Surface; + mfxU16 NumFrameL1; + mfxFrameSurface1 **L1Surface; + + mfxU16 NumExtParam; + mfxExtBuffer **ExtParam; +} mfxENCInput; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct _mfxENCOutput{ + mfxU32 reserved[32]; + + mfxFrameSurface1 *OutSurface; + + mfxU16 NumExtParam; + mfxExtBuffer **ExtParam; +} mfxENCOutput; +MFX_PACK_END() + + +mfxStatus MFX_CDECL MFXVideoENC_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoENC_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoENC_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENC_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENC_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoENC_ProcessFrameAsync(mfxSession session, mfxENCInput *in, mfxENCOutput *out, mfxSyncPoint *syncp); + +mfxStatus MFX_CDECL MFXVideoENC_GetVideoParam(mfxSession session, mfxVideoParam *par); + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxfei.h b/.github/actions/libmfx/include/mfx/mfxfei.h new file mode 100644 index 0000000..55e61ca --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxfei.h @@ -0,0 +1,583 @@ +// Copyright (c) 2018-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXFEI_H__ +#define __MFXFEI_H__ +#include "mfxdefs.h" +#include "mfxvstructures.h" +#include "mfxpak.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + + mfxU16 Qp; + mfxU16 LenSP; + mfxU16 SearchPath; + mfxU16 SubMBPartMask; + mfxU16 SubPelMode; + mfxU16 InterSAD; + mfxU16 IntraSAD; + mfxU16 AdaptiveSearch; + mfxU16 MVPredictor; + mfxU16 MBQp; + mfxU16 FTEnable; + mfxU16 IntraPartMask; + mfxU16 RefWidth; + mfxU16 RefHeight; + mfxU16 SearchWindow; + mfxU16 DisableMVOutput; + mfxU16 DisableStatisticsOutput; + mfxU16 Enable8x8Stat; + mfxU16 PictureType; /* Input picture type*/ + mfxU16 DownsampleInput; + + mfxU16 RefPictureType[2]; /* reference picture type, 0 -L0, 1 - L1 */ + mfxU16 DownsampleReference[2]; + mfxFrameSurface1 *RefFrame[2]; + mfxU16 reserved[28]; +} mfxExtFeiPreEncCtrl; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[3]; + mfxU32 NumMBAlloc; /* size of allocated memory in number of macroblocks */ + mfxU16 reserved2[20]; + + struct mfxExtFeiPreEncMVPredictorsMB { + mfxI16Pair MV[2]; /* 0 for L0 and 1 for L1 */ + } *MB; +} mfxExtFeiPreEncMVPredictors; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[3]; + mfxU32 NumMBAlloc; + mfxU16 reserved2[20]; + + mfxU8 *MB; +} mfxExtFeiEncQP; +MFX_PACK_END() + +/* PreENC output */ +/* Layout is exactly the same as mfxExtFeiEncMVs, this buffer may be removed in future */ +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[3]; + mfxU32 NumMBAlloc; + mfxU16 reserved2[20]; + + struct mfxExtFeiPreEncMVMB { + mfxI16Pair MV[16][2]; + } *MB; +} mfxExtFeiPreEncMV; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[3]; + mfxU32 NumMBAlloc; + mfxU16 reserved2[20]; + + struct mfxExtFeiPreEncMBStatMB { + struct mfxExtFeiPreEncMBStatMBInter { + mfxU16 BestDistortion; + mfxU16 Mode ; + } Inter[2]; /*0 -L0, 1 - L1*/ + + mfxU16 BestIntraDistortion; + mfxU16 IntraMode ; + + mfxU16 NumOfNonZeroCoef; + mfxU16 reserved1; + mfxU32 SumOfCoef; + + mfxU32 reserved2; + + mfxU32 Variance16x16; + mfxU32 Variance8x8[4]; + mfxU32 PixelAverage16x16; + mfxU32 PixelAverage8x8[4]; + } *MB; +} mfxExtFeiPreEncMBStat; +MFX_PACK_END() + +/* 1 ENC_PAK input */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 SearchPath; + mfxU16 LenSP; + mfxU16 SubMBPartMask; + mfxU16 IntraPartMask; + mfxU16 MultiPredL0; + mfxU16 MultiPredL1; + mfxU16 SubPelMode; + mfxU16 InterSAD; + mfxU16 IntraSAD; + mfxU16 DistortionType; + mfxU16 RepartitionCheckEnable; + mfxU16 AdaptiveSearch; + mfxU16 MVPredictor; + mfxU16 NumMVPredictors[2]; + mfxU16 PerMBQp; + mfxU16 PerMBInput; + mfxU16 MBSizeCtrl; + mfxU16 RefWidth; + mfxU16 RefHeight; + mfxU16 SearchWindow; + mfxU16 ColocatedMbDistortion; + mfxU16 reserved[38]; +} mfxExtFeiEncFrameCtrl; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[3]; + mfxU32 NumMBAlloc; + mfxU16 reserved2[20]; + + struct mfxExtFeiEncMVPredictorsMB { + struct mfxExtFeiEncMVPredictorsMBRefIdx{ + mfxU8 RefL0: 4; + mfxU8 RefL1: 4; + } RefIdx[4]; /* index is predictor number */ + mfxU32 reserved; + mfxI16Pair MV[4][2]; /* first index is predictor number, second is 0 for L0 and 1 for L1 */ + } *MB; +} mfxExtFeiEncMVPredictors; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[3]; + mfxU32 NumMBAlloc; + mfxU16 reserved2[20]; + + struct mfxExtFeiEncMBCtrlMB { + mfxU32 ForceToIntra : 1; + mfxU32 ForceToSkip : 1; + mfxU32 ForceToNoneSkip : 1; +#if (MFX_VERSION >= 1025) + mfxU32 DirectBiasAdjustment : 1; + mfxU32 GlobalMotionBiasAdjustment : 1; + mfxU32 MVCostScalingFactor : 3; + + mfxU32 reserved1 : 24; +#else + mfxU32 reserved1 : 29; +#endif + mfxU32 reserved2; + mfxU32 reserved3; + + mfxU32 reserved4 : 16; + mfxU32 TargetSizeInWord : 8; + mfxU32 MaxSizeInWord : 8; + } *MB; +} mfxExtFeiEncMBCtrl; +MFX_PACK_END() + +/* 1 ENC_PAK output */ +/* Buffer holds 32 MVs per MB. MVs are located in zigzag scan order. +Number in diagram below shows location of MV in memory. +For example, MV for right top 4x4 sub block is stored in 5-th element of the array. +======================== +|| 00 | 01 || 04 | 05 || +------------------------ +|| 02 | 03 || 06 | 07 || +======================== +|| 08 | 09 || 12 | 13 || +------------------------ +|| 10 | 11 || 14 | 15 || +======================== +*/ +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[3]; + mfxU32 NumMBAlloc; + mfxU16 reserved2[20]; + + struct mfxExtFeiEncMVMB { + mfxI16Pair MV[16][2]; /* first index is block (4x4 pixels) number, second is 0 for L0 and 1 for L1 */ + } *MB; +} mfxExtFeiEncMV; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[3]; + mfxU32 NumMBAlloc; + mfxU16 reserved2[20]; + + struct mfxExtFeiEncMBStatMB { + mfxU16 InterDistortion[16]; + mfxU16 BestInterDistortion; + mfxU16 BestIntraDistortion; + mfxU16 ColocatedMbDistortion; + mfxU16 reserved; + mfxU32 reserved1[2]; + } *MB; +} mfxExtFeiEncMBStat; +MFX_PACK_END() + +enum { + MFX_PAK_OBJECT_HEADER = 0x7149000A +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + /* dword 0-2 */ + mfxU32 Header; /* MFX_PAK_OBJECT_HEADER */ + mfxU32 MVDataLength; + mfxU32 MVDataOffset; + + /* dword 3 */ + mfxU32 InterMbMode : 2; + mfxU32 MBSkipFlag : 1; + mfxU32 Reserved00 : 1; + mfxU32 IntraMbMode : 2; + mfxU32 Reserved01 : 1; + mfxU32 FieldMbPolarityFlag : 1; + mfxU32 MbType : 5; + mfxU32 IntraMbFlag : 1; + mfxU32 FieldMbFlag : 1; + mfxU32 Transform8x8Flag : 1; + mfxU32 Reserved02 : 1; + mfxU32 DcBlockCodedCrFlag : 1; + mfxU32 DcBlockCodedCbFlag : 1; + mfxU32 DcBlockCodedYFlag : 1; + mfxU32 MVFormat : 3; /* layout and number of MVs, 0 - no MVs, 6 - 32 MVs, the rest are reserved */ + mfxU32 Reserved03 : 8; + mfxU32 ExtendedFormat : 1; /* should be 1, specifies that LumaIntraPredModes and RefIdx are replicated for 8x8 and 4x4 block/subblock */ + + /* dword 4 */ + mfxU8 HorzOrigin; + mfxU8 VertOrigin; + mfxU16 CbpY; + + /* dword 5 */ + mfxU16 CbpCb; + mfxU16 CbpCr; + + /* dword 6 */ + mfxU32 QpPrimeY : 8; + mfxU32 Reserved30 :17; + mfxU32 MbSkipConvDisable : 1; + mfxU32 IsLastMB : 1; + mfxU32 EnableCoefficientClamp : 1; + mfxU32 Direct8x8Pattern : 4; + + union { + struct {/* Intra MBs */ + /* dword 7-8 */ + mfxU16 LumaIntraPredModes[4]; + + /* dword 9 */ + mfxU32 ChromaIntraPredMode : 2; + mfxU32 IntraPredAvailFlags : 6; + mfxU32 Reserved60 : 24; + } IntraMB; + struct {/* Inter MBs */ + /*dword 7 */ + mfxU8 SubMbShapes; + mfxU8 SubMbPredModes; + mfxU16 Reserved40; + + /* dword 8-9 */ + mfxU8 RefIdx[2][4]; /* first index is 0 for L0 and 1 for L1 */ + } InterMB; + }; + + /* dword 10 */ + mfxU16 Reserved70; + mfxU8 TargetSizeInWord; + mfxU8 MaxSizeInWord; + + mfxU32 reserved2[5]; +}mfxFeiPakMBCtrl; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[3]; + mfxU32 NumMBAlloc; + mfxU16 reserved2[20]; + + mfxFeiPakMBCtrl *MB; +} mfxExtFeiPakMBCtrl; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU32 MaxFrameSize; /* in bytes */ + mfxU32 NumPasses; /* up to 8 */ + mfxU16 reserved[8]; + mfxU8 DeltaQP[8]; /* list of delta QPs, only positive values */ +} mfxExtFeiRepackCtrl; +MFX_PACK_END() + +#if (MFX_VERSION >= 1025) +/* FEI repack status */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU32 NumPasses; + mfxU16 reserved[58]; +} mfxExtFeiRepackStat; +MFX_PACK_END() +#endif + +/* 1 decode stream out */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + /* dword 0 */ + mfxU32 InterMbMode : 2; + mfxU32 MBSkipFlag : 1; + mfxU32 Reserved00 : 1; + mfxU32 IntraMbMode : 2; + mfxU32 Reserved01 : 1; + mfxU32 FieldMbPolarityFlag : 1; + mfxU32 MbType : 5; + mfxU32 IntraMbFlag : 1; + mfxU32 FieldMbFlag : 1; + mfxU32 Transform8x8Flag : 1; + mfxU32 Reserved02 : 1; + mfxU32 DcBlockCodedCrFlag : 1; + mfxU32 DcBlockCodedCbFlag : 1; + mfxU32 DcBlockCodedYFlag : 1; + mfxU32 Reserved03 :12; + + /* dword 1 */ + mfxU16 HorzOrigin; + mfxU16 VertOrigin; + + /* dword 2 */ + mfxU32 CbpY :16; + mfxU32 CbpCb : 4; + mfxU32 CbpCr : 4; + mfxU32 Reserved20 : 6; + mfxU32 IsLastMB : 1; + mfxU32 ConcealMB : 1; + + /* dword 3 */ + mfxU32 QpPrimeY : 7; + mfxU32 Reserved30 : 1; + mfxU32 Reserved31 : 8; + mfxU32 NzCoeffCount : 9; + mfxU32 Reserved32 : 3; + mfxU32 Direct8x8Pattern : 4; + + /* dword 4-6 */ + union { + struct {/* Intra MBs */ + /* dword 4-5 */ + mfxU16 LumaIntraPredModes[4]; + + /* dword 6 */ + mfxU32 ChromaIntraPredMode : 2; + mfxU32 IntraPredAvailFlags : 6; + mfxU32 Reserved60 : 24; + } IntraMB; + + struct {/* Inter MBs */ + /* dword 4 */ + mfxU8 SubMbShapes; + mfxU8 SubMbPredModes; + mfxU16 Reserved40; + + /* dword 5-6 */ + mfxU8 RefIdx[2][4]; /* first index is 0 for L0 and 1 for L1 */ + } InterMB; + }; + + /* dword 7 */ + mfxU32 Reserved70; + + /* dword 8-15 */ + mfxI16Pair MV[4][2]; /* L0 - 0, L1 - 1 */ +}mfxFeiDecStreamOutMBCtrl; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[3]; + mfxU32 NumMBAlloc; + mfxU16 RemapRefIdx; /* tri-state option, default is OFF */ + mfxU16 PicStruct; + mfxU16 reserved2[18]; + + mfxFeiDecStreamOutMBCtrl *MB; +} mfxExtFeiDecStreamOut; +MFX_PACK_END() + +/* SPS, PPS, Slice Header */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 SPSId; + + mfxU16 PicOrderCntType; + mfxU16 Log2MaxPicOrderCntLsb; + mfxU16 reserved[121]; +} mfxExtFeiSPS; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 SPSId; + mfxU16 PPSId; + + mfxU16 PictureType; + mfxU16 FrameType; + mfxU16 PicInitQP; + mfxU16 NumRefIdxL0Active; + mfxU16 NumRefIdxL1Active; + mfxI16 ChromaQPIndexOffset; + mfxI16 SecondChromaQPIndexOffset; + mfxU16 Transform8x8ModeFlag; + mfxU16 reserved[114]; + + struct mfxExtFeiPpsDPB { + mfxU16 Index; /* index in mfxPAKInput::L0Surface array */ + mfxU16 PicType; + mfxI32 FrameNumWrap; + mfxU16 LongTermFrameIdx; + mfxU16 reserved[3]; + } DpbBefore[16], DpbAfter[16]; +} mfxExtFeiPPS; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + + mfxU16 NumSlice; /* actual number of slices in the picture */ + mfxU16 reserved[11]; + + struct mfxSlice{ + mfxU16 MBAddress; + mfxU16 NumMBs; + mfxU16 SliceType; + mfxU16 PPSId; + mfxU16 IdrPicId; + + mfxU16 CabacInitIdc; + + mfxU16 NumRefIdxL0Active; + mfxU16 NumRefIdxL1Active; + + mfxI16 SliceQPDelta; + mfxU16 DisableDeblockingFilterIdc; + mfxI16 SliceAlphaC0OffsetDiv2; + mfxI16 SliceBetaOffsetDiv2; + mfxU16 reserved[20]; + + struct mfxSliceRef{ + mfxU16 PictureType; + mfxU16 Index; + mfxU16 reserved[2]; + } RefL0[32], RefL1[32]; /* index in mfxPAKInput::L0Surface array */ + + } *Slice; +}mfxExtFeiSliceHeader; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 DisableHME; /* 0 - enable, any other value means disable */ + mfxU16 DisableSuperHME; + mfxU16 DisableUltraHME; + + mfxU16 reserved[57]; +} mfxExtFeiCodingOption; +MFX_PACK_END() + +/* 1 functions */ +typedef enum { + MFX_FEI_FUNCTION_PREENC =1, + MFX_FEI_FUNCTION_ENCODE =2, + MFX_FEI_FUNCTION_ENC =3, + MFX_FEI_FUNCTION_PAK =4, + MFX_FEI_FUNCTION_DEC =5, +} mfxFeiFunction; + +enum { + MFX_EXTBUFF_FEI_PARAM = MFX_MAKEFOURCC('F','E','P','R'), + MFX_EXTBUFF_FEI_PREENC_CTRL = MFX_MAKEFOURCC('F','P','C','T'), + MFX_EXTBUFF_FEI_PREENC_MV_PRED = MFX_MAKEFOURCC('F','P','M','P'), + MFX_EXTBUFF_FEI_PREENC_MV = MFX_MAKEFOURCC('F','P','M','V'), + MFX_EXTBUFF_FEI_PREENC_MB = MFX_MAKEFOURCC('F','P','M','B'), + MFX_EXTBUFF_FEI_ENC_CTRL = MFX_MAKEFOURCC('F','E','C','T'), + MFX_EXTBUFF_FEI_ENC_MV_PRED = MFX_MAKEFOURCC('F','E','M','P'), + MFX_EXTBUFF_FEI_ENC_QP = MFX_MAKEFOURCC('F','E','Q','P'), + MFX_EXTBUFF_FEI_ENC_MV = MFX_MAKEFOURCC('F','E','M','V'), + MFX_EXTBUFF_FEI_ENC_MB = MFX_MAKEFOURCC('F','E','M','B'), + MFX_EXTBUFF_FEI_ENC_MB_STAT = MFX_MAKEFOURCC('F','E','S','T'), + MFX_EXTBUFF_FEI_PAK_CTRL = MFX_MAKEFOURCC('F','K','C','T'), + MFX_EXTBUFF_FEI_SPS = MFX_MAKEFOURCC('F','S','P','S'), + MFX_EXTBUFF_FEI_PPS = MFX_MAKEFOURCC('F','P','P','S'), + MFX_EXTBUFF_FEI_SLICE = MFX_MAKEFOURCC('F','S','L','C'), + MFX_EXTBUFF_FEI_CODING_OPTION = MFX_MAKEFOURCC('F','C','D','O'), + MFX_EXTBUFF_FEI_DEC_STREAM_OUT = MFX_MAKEFOURCC('F','D','S','O'), + MFX_EXTBUFF_FEI_REPACK_CTRL = MFX_MAKEFOURCC('F','E','R','P'), +#if (MFX_VERSION >= 1025) + MFX_EXTBUFF_FEI_REPACK_STAT = MFX_MAKEFOURCC('F','E','R','S') +#endif +}; + +/* should be attached to mfxVideoParam during initialization to indicate FEI function */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxFeiFunction Func; + mfxU16 SingleFieldProcessing; + mfxU16 reserved[57]; +} mfxExtFeiParam; +MFX_PACK_END() + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + + +#endif diff --git a/.github/actions/libmfx/include/mfx/mfxfeihevc.h b/.github/actions/libmfx/include/mfx/mfxfeihevc.h new file mode 100644 index 0000000..8827892 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxfeihevc.h @@ -0,0 +1,290 @@ +// Copyright (c) 2018-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXFEIHEVC_H__ +#define __MFXFEIHEVC_H__ +#include "mfxcommon.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if (MFX_VERSION >= 1027) + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 SearchPath; + mfxU16 LenSP; + mfxU16 RefWidth; + mfxU16 RefHeight; + mfxU16 SearchWindow; + + mfxU16 NumMvPredictors[2]; /* 0 for L0 and 1 for L1 */ + mfxU16 MultiPred[2]; /* 0 for L0 and 1 for L1 */ + + mfxU16 SubPelMode; + mfxU16 AdaptiveSearch; + mfxU16 MVPredictor; + + mfxU16 PerCuQp; + mfxU16 PerCtuInput; + mfxU16 ForceCtuSplit; + mfxU16 NumFramePartitions; + mfxU16 FastIntraMode; + + mfxU16 reserved0[107]; +} mfxExtFeiHevcEncFrameCtrl; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + struct { + mfxU8 RefL0 : 4; + mfxU8 RefL1 : 4; + } RefIdx[4]; /* index is predictor number */ + + mfxU32 BlockSize : 2; + mfxU32 reserved0 : 30; + + mfxI16Pair MV[4][2]; /* first index is predictor number, second is 0 for L0 and 1 for L1 */ +} mfxFeiHevcEncMVPredictors; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 VaBufferID; + mfxU32 Pitch; + mfxU32 Height; + mfxU16 reserved0[54]; + + mfxFeiHevcEncMVPredictors *Data; +} mfxExtFeiHevcEncMVPredictors; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 VaBufferID; + mfxU32 Pitch; + mfxU32 Height; + mfxU16 reserved[6]; + + mfxU8 *Data; +} mfxExtFeiHevcEncQP; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU32 ForceToIntra : 1; + mfxU32 ForceToInter : 1; + mfxU32 reserved0 : 30; + + mfxU32 reserved1[3]; +} mfxFeiHevcEncCtuCtrl; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 VaBufferID; + mfxU32 Pitch; + mfxU32 Height; + mfxU16 reserved0[54]; + + mfxFeiHevcEncCtuCtrl *Data; +} mfxExtFeiHevcEncCtuCtrl; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU32 MaxFrameSize; /* in bytes */ + mfxU32 NumPasses; /* up to 8 */ + mfxU16 reserved[8]; + mfxU8 DeltaQP[8]; /* list of delta QPs, only positive values */ +} mfxExtFeiHevcRepackCtrl; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU32 NumPasses; + mfxU16 reserved[58]; +} mfxExtFeiHevcRepackStat; +MFX_PACK_END() + +#if MFX_VERSION >= MFX_VERSION_NEXT +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + /* DWORD 0 */ + mfxU32 reserved0; + + /* DWORD 1 */ + mfxU32 SplitLevel2Part0 : 4; + mfxU32 SplitLevel2Part1 : 4; + mfxU32 SplitLevel2Part2 : 4; + mfxU32 SplitLevel2Part3 : 4; + mfxU32 SplitLevel1 : 4; + mfxU32 SplitLevel0 : 1; + mfxU32 reserved10 : 3; + mfxU32 CuCountMinus1 : 6; + mfxU32 LastCtuOfTileFlag : 1; + mfxU32 LastCtuOfSliceFlag : 1; + + + /* DWORD 2 */ + mfxU32 CtuAddrX : 16; + mfxU32 CtuAddrY : 16; + + /* DWORD 3 */ + mfxU32 reserved3; +} mfxFeiHevcPakCtuRecordV0; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 VaBufferID; + mfxU32 Pitch; + mfxU32 Height; + mfxU16 reserved0[54]; + + mfxFeiHevcPakCtuRecordV0 *Data; +} mfxExtFeiHevcPakCtuRecordV0; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + /* DWORD 0 */ + mfxU32 CuSize : 2; + mfxU32 PredMode : 1; + mfxU32 TransquantBypass : 1; + mfxU32 PartMode : 3; + mfxU32 IpcmEnable : 1; + mfxU32 IntraChromaMode : 3; + mfxU32 ZeroOutCoeffs : 1; + mfxU32 reserved00 : 4; + mfxU32 Qp : 7; + mfxU32 QpSign : 1; + mfxU32 InterpredIdc : 8; + + + /* DWORD 1 */ + mfxU32 IntraMode0 : 6; + mfxU32 reserved10 : 2; + mfxU32 IntraMode1 : 6; + mfxU32 reserved11 : 2; + mfxU32 IntraMode2 : 6; + mfxU32 reserved12 : 2; + mfxU32 IntraMode3 : 6; + mfxU32 reserved13 : 2; + + + /* DWORD 2-9 */ + struct { + mfxI16 x[4]; + mfxI16 y[4]; + } MVs[2]; /* 0-L0, 1-L1 */ + + + /* DWORD 10 */ + struct{ + mfxU16 Ref0 : 4; + mfxU16 Ref1 : 4; + mfxU16 Ref2 : 4; + mfxU16 Ref3 : 4; + } RefIdx[2]; /* 0-L0, 1-L1 */ + + + /* DWORD 11 */ + mfxU32 TuSize; + + + /* DWORD 12 */ + mfxU32 TransformSkipY : 16; + mfxU32 reserved120 : 12; + mfxU32 TuCountM1 : 4; + + + /* DWORD 13 */ + mfxU32 TransformSkipU : 16; + mfxU32 TransformSkipV : 16; +} mfxFeiHevcPakCuRecordV0; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 VaBufferID; + mfxU32 Pitch; + mfxU32 Height; + mfxU16 reserved0[54]; + + mfxFeiHevcPakCuRecordV0 *Data; +} mfxExtFeiHevcPakCuRecordV0; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU32 BestDistortion; + mfxU32 ColocatedCtuDistortion; +} mfxFeiHevcDistortionCtu; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 VaBufferID; + mfxU32 Pitch; + mfxU32 Height; + mfxU16 reserved[6]; + + mfxFeiHevcDistortionCtu *Data; +} mfxExtFeiHevcDistortion; +MFX_PACK_END() +#endif + + +enum { + MFX_EXTBUFF_HEVCFEI_ENC_CTRL = MFX_MAKEFOURCC('F','H','C','T'), + MFX_EXTBUFF_HEVCFEI_ENC_MV_PRED = MFX_MAKEFOURCC('F','H','P','D'), + MFX_EXTBUFF_HEVCFEI_ENC_QP = MFX_MAKEFOURCC('F','H','Q','P'), + MFX_EXTBUFF_HEVCFEI_ENC_CTU_CTRL = MFX_MAKEFOURCC('F','H','E','C'), + MFX_EXTBUFF_HEVCFEI_REPACK_CTRL = MFX_MAKEFOURCC('F','H','R','P'), + MFX_EXTBUFF_HEVCFEI_REPACK_STAT = MFX_MAKEFOURCC('F','H','R','S'), + +#if MFX_VERSION >= MFX_VERSION_NEXT + MFX_EXTBUFF_HEVCFEI_PAK_CTU_REC = MFX_MAKEFOURCC('F','H','T','B'), + MFX_EXTBUFF_HEVCFEI_PAK_CU_REC = MFX_MAKEFOURCC('F','H','C','U'), + MFX_EXTBUFF_HEVCFEI_ENC_DIST = MFX_MAKEFOURCC('F','H','D','S') +#endif +}; + +#endif // MFX_VERSION + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + + +#endif // __MFXFEIHEVC_H__ diff --git a/.github/actions/libmfx/include/mfx/mfxjpeg.h b/.github/actions/libmfx/include/mfx/mfxjpeg.h new file mode 100644 index 0000000..7f00b67 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxjpeg.h @@ -0,0 +1,105 @@ +// Copyright (c) 2017-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFX_JPEG_H__ +#define __MFX_JPEG_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* CodecId */ +enum { + MFX_CODEC_JPEG = MFX_MAKEFOURCC('J','P','E','G') +}; + +/* CodecProfile, CodecLevel */ +enum +{ + MFX_PROFILE_JPEG_BASELINE = 1 +}; + +enum +{ + MFX_ROTATION_0 = 0, + MFX_ROTATION_90 = 1, + MFX_ROTATION_180 = 2, + MFX_ROTATION_270 = 3 +}; + +enum { + MFX_EXTBUFF_JPEG_QT = MFX_MAKEFOURCC('J','P','G','Q'), + MFX_EXTBUFF_JPEG_HUFFMAN = MFX_MAKEFOURCC('J','P','G','H') +}; + +enum { + MFX_JPEG_COLORFORMAT_UNKNOWN = 0, + MFX_JPEG_COLORFORMAT_YCbCr = 1, + MFX_JPEG_COLORFORMAT_RGB = 2 +}; + +enum { + MFX_SCANTYPE_UNKNOWN = 0, + MFX_SCANTYPE_INTERLEAVED = 1, + MFX_SCANTYPE_NONINTERLEAVED = 2 +}; + +enum { + MFX_CHROMAFORMAT_JPEG_SAMPLING = 6 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved[7]; + mfxU16 NumTable; + + mfxU16 Qm[4][64]; +} mfxExtJPEGQuantTables; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved[2]; + mfxU16 NumDCTable; + mfxU16 NumACTable; + + struct { + mfxU8 Bits[16]; + mfxU8 Values[12]; + } DCTables[4]; + + struct { + mfxU8 Bits[16]; + mfxU8 Values[162]; + } ACTables[4]; +} mfxExtJPEGHuffmanTables; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif // __MFX_JPEG_H__ diff --git a/.github/actions/libmfx/include/mfx/mfxla.h b/.github/actions/libmfx/include/mfx/mfxla.h new file mode 100644 index 0000000..d90f460 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxla.h @@ -0,0 +1,99 @@ +// Copyright (c) 2017-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXLA_H__ +#define __MFXLA_H__ +#include "mfxdefs.h" +#include "mfxvstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +enum +{ + MFX_EXTBUFF_LOOKAHEAD_CTRL = MFX_MAKEFOURCC('L','A','C','T'), + MFX_EXTBUFF_LOOKAHEAD_STAT = MFX_MAKEFOURCC('L','A','S','T'), +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct +{ + mfxExtBuffer Header; + mfxU16 LookAheadDepth; + mfxU16 DependencyDepth; + mfxU16 DownScaleFactor; + mfxU16 BPyramid; + + mfxU16 reserved1[23]; + + mfxU16 NumOutStream; + struct mfxStream{ + mfxU16 Width; + mfxU16 Height; + mfxU16 reserved2[14]; + } OutStream[16]; +}mfxExtLAControl; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct +{ + mfxU16 Width; + mfxU16 Height; + + mfxU32 FrameType; + mfxU32 FrameDisplayOrder; + mfxU32 FrameEncodeOrder; + + mfxU32 IntraCost; + mfxU32 InterCost; + mfxU32 DependencyCost; //aggregated cost, how this frame influences subsequent frames + mfxU16 Layer; + mfxU16 reserved[23]; + + mfxU64 EstimatedRate[52]; +}mfxLAFrameInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved[20]; + + mfxU16 NumAlloc; //number of allocated mfxLAFrameInfo structures + mfxU16 NumStream; //number of resolutions + mfxU16 NumFrame; //number of frames for each resolution + mfxLAFrameInfo *FrameStat; //frame statistics + + mfxFrameSurface1 *OutSurface; //reordered surface + +} mfxExtLAFrameStatistics; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxmvc.h b/.github/actions/libmfx/include/mfx/mfxmvc.h new file mode 100644 index 0000000..4ec71dc --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxmvc.h @@ -0,0 +1,106 @@ +// Copyright (c) 2017-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXMVC_H__ +#define __MFXMVC_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* CodecProfile, CodecLevel */ +enum { + /* MVC profiles */ + MFX_PROFILE_AVC_MULTIVIEW_HIGH =118, + MFX_PROFILE_AVC_STEREO_HIGH =128 +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_MVC_SEQ_DESC = MFX_MAKEFOURCC('M','V','C','D'), + MFX_EXTBUFF_MVC_TARGET_VIEWS = MFX_MAKEFOURCC('M','V','C','T') +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU16 ViewId; + + mfxU16 NumAnchorRefsL0; + mfxU16 NumAnchorRefsL1; + mfxU16 AnchorRefL0[16]; + mfxU16 AnchorRefL1[16]; + + mfxU16 NumNonAnchorRefsL0; + mfxU16 NumNonAnchorRefsL1; + mfxU16 NonAnchorRefL0[16]; + mfxU16 NonAnchorRefL1[16]; +} mfxMVCViewDependency; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxU16 TemporalId; + mfxU16 LevelIdc; + + mfxU16 NumViews; + mfxU16 NumTargetViews; + mfxU16 *TargetViewId; +} mfxMVCOperationPoint; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + + mfxU32 NumView; + mfxU32 NumViewAlloc; + mfxMVCViewDependency *View; + + mfxU32 NumViewId; + mfxU32 NumViewIdAlloc; + mfxU16 *ViewId; + + mfxU32 NumOP; + mfxU32 NumOPAlloc; + mfxMVCOperationPoint *OP; + + mfxU16 NumRefsTotal; + mfxU32 Reserved[16]; + +} mfxExtMVCSeqDesc; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 TemporalId; + mfxU32 NumView; + mfxU16 ViewId[1024]; +} mfxExtMVCTargetViews ; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxpak.h b/.github/actions/libmfx/include/mfx/mfxpak.h new file mode 100644 index 0000000..b0d7db5 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxpak.h @@ -0,0 +1,78 @@ +// Copyright (c) 2017-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXPAK_H__ +#define __MFXPAK_H__ +#include "mfxdefs.h" +#include "mfxvstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxU16 reserved[32]; + + mfxFrameSurface1 *InSurface; + + mfxU16 NumFrameL0; + mfxFrameSurface1 **L0Surface; + mfxU16 NumFrameL1; + mfxFrameSurface1 **L1Surface; + + mfxU16 NumExtParam; + mfxExtBuffer **ExtParam; + + mfxU16 NumPayload; + mfxPayload **Payload; +} mfxPAKInput; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxU16 reserved[32]; + + mfxBitstream *Bs; + + mfxFrameSurface1 *OutSurface; + + mfxU16 NumExtParam; + mfxExtBuffer **ExtParam; +} mfxPAKOutput; +MFX_PACK_END() + +typedef struct _mfxSession *mfxSession; +mfxStatus MFX_CDECL MFXVideoPAK_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoPAK_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest request[2]); +mfxStatus MFX_CDECL MFXVideoPAK_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoPAK_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoPAK_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoPAK_ProcessFrameAsync(mfxSession session, mfxPAKInput *in, mfxPAKOutput *out, mfxSyncPoint *syncp); + +mfxStatus MFX_CDECL MFXVideoPAK_GetVideoParam(mfxSession session, mfxVideoParam *par); + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + + +#endif diff --git a/.github/actions/libmfx/include/mfx/mfxpcp.h b/.github/actions/libmfx/include/mfx/mfxpcp.h new file mode 100644 index 0000000..d3a10b7 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxpcp.h @@ -0,0 +1,56 @@ +// Copyright (c) 2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXPCP_H__ +#define __MFXPCP_H__ +#include "mfxstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#if MFX_VERSION >= 1030 +/* Protected in mfxVideoParam */ +enum { + MFX_PROTECTION_CENC_WV_CLASSIC = 0x0004, + MFX_PROTECTION_CENC_WV_GOOGLE_DASH = 0x0005, +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_CENC_PARAM = MFX_MAKEFOURCC('C','E','N','P') +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct _mfxExtCencParam{ + mfxExtBuffer Header; + + mfxU32 StatusReportIndex; + mfxU32 reserved[15]; +} mfxExtCencParam; +MFX_PACK_END() +#endif + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxplugin++.h b/.github/actions/libmfx/include/mfx/mfxplugin++.h new file mode 100644 index 0000000..9fe7ce5 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxplugin++.h @@ -0,0 +1,717 @@ +// Copyright (c) 2017-2020 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef __MFXPLUGINPLUSPLUS_H +#define __MFXPLUGINPLUSPLUS_H + +#include "mfxplugin.h" + +// base class for MFXVideoUSER/MFXAudioUSER API + +class MFXBaseUSER { +public: + explicit MFXBaseUSER(mfxSession session = NULL) + : m_session(session){} + + virtual ~MFXBaseUSER() {} + + virtual mfxStatus Register(mfxU32 type, const mfxPlugin *par) = 0; + virtual mfxStatus Unregister(mfxU32 type) = 0; + virtual mfxStatus ProcessFrameAsync(const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxSyncPoint *syncp) = 0; + +protected: + mfxSession m_session; +}; + +//c++ wrapper over only 3 exposed functions from MFXVideoUSER module +class MFXVideoUSER: public MFXBaseUSER { +public: + explicit MFXVideoUSER(mfxSession session = NULL) + : MFXBaseUSER(session){} + + virtual mfxStatus Register(mfxU32 type, const mfxPlugin *par) { + return MFXVideoUSER_Register(m_session, type, par); + } + virtual mfxStatus Unregister(mfxU32 type) { + return MFXVideoUSER_Unregister(m_session, type); + } + virtual mfxStatus ProcessFrameAsync(const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxSyncPoint *syncp) { + return MFXVideoUSER_ProcessFrameAsync(m_session, in, in_num, out, out_num, syncp); + } +}; + +//c++ wrapper over only 3 exposed functions from MFXAudioUSER module +class MFXAudioUSER: public MFXBaseUSER { +public: + explicit MFXAudioUSER(mfxSession session = NULL) + : MFXBaseUSER(session){} + + virtual mfxStatus Register(mfxU32 type, const mfxPlugin *par) { + return MFXAudioUSER_Register(m_session, type, par); + } + virtual mfxStatus Unregister(mfxU32 type) { + return MFXAudioUSER_Unregister(m_session, type); + } + virtual mfxStatus ProcessFrameAsync(const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxSyncPoint *syncp) { + return MFXAudioUSER_ProcessFrameAsync(m_session, in, in_num, out, out_num, syncp); + } +}; + + +//initialize mfxPlugin struct +class MFXPluginParam { + mfxPluginParam m_param; + +public: + MFXPluginParam(mfxU32 CodecId, mfxU32 Type, mfxPluginUID uid, mfxThreadPolicy ThreadPolicy = MFX_THREADPOLICY_SERIAL, mfxU32 MaxThreadNum = 1) + : m_param() { + m_param.PluginUID = uid; + m_param.Type = Type; + m_param.CodecId = CodecId; + m_param.MaxThreadNum = MaxThreadNum; + m_param.ThreadPolicy = ThreadPolicy; + } + operator const mfxPluginParam& () const { + return m_param; + } + operator mfxPluginParam& () { + return m_param; + } +}; + +//common interface part for every plugin: decoder/encoder and generic +struct MFXPlugin +{ + virtual ~MFXPlugin() {}; + //init function always required for any transform or codec plugins, for codec plugins it maps to callback from MediaSDK + //for generic plugin application should call it + //MediaSDK mfxPlugin API mapping + virtual mfxStatus PluginInit(mfxCoreInterface *core) = 0; + //release CoreInterface, and destroy plugin state, not destroy plugin instance + virtual mfxStatus PluginClose() = 0; + virtual mfxStatus GetPluginParam(mfxPluginParam *par) = 0; + virtual mfxStatus Execute(mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a) = 0; + virtual mfxStatus FreeResources(mfxThreadTask task, mfxStatus sts) = 0; + //destroy plugin due to shared module distribution model plugin wont support virtual destructor + virtual void Release() = 0; + //release resources associated with current instance of plugin, but do not release CoreInterface related resource set in pluginInit + virtual mfxStatus Close() = 0; + //communication protocol between particular version of plugin and application + virtual mfxStatus SetAuxParams(void* auxParam, int auxParamSize) = 0; +}; + +//common extension interface that codec plugins should expose additionally to MFXPlugin +struct MFXCodecPlugin : MFXPlugin +{ + virtual mfxStatus Init(mfxVideoParam *par) = 0; + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *in, mfxFrameAllocRequest *out) = 0; + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) =0; + virtual mfxStatus Reset(mfxVideoParam *par) = 0; + virtual mfxStatus GetVideoParam(mfxVideoParam *par) = 0; +}; + +//common extension interface that audio codec plugins should expose additionally to MFXPlugin +struct MFXAudioCodecPlugin : MFXPlugin +{ + virtual mfxStatus Init(mfxAudioParam *par) = 0; + virtual mfxStatus Query(mfxAudioParam *in, mfxAudioParam *out) =0; + virtual mfxStatus QueryIOSize(mfxAudioParam *par, mfxAudioAllocRequest *request) = 0; + virtual mfxStatus Reset(mfxAudioParam *par) = 0; + virtual mfxStatus GetAudioParam(mfxAudioParam *par) = 0; +}; + +//general purpose transform plugin interface, not a codec plugin +struct MFXGenericPlugin : MFXPlugin +{ + virtual mfxStatus Init(mfxVideoParam *par) = 0; + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *in, mfxFrameAllocRequest *out) = 0; + virtual mfxStatus Submit(const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task) = 0; +}; + +//decoder plugins may only support this interface +struct MFXDecoderPlugin : MFXCodecPlugin +{ + virtual mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) = 0; + virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) = 0; + virtual mfxStatus DecodeFrameSubmit(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxThreadTask *task) = 0; +}; + +//audio decoder plugins may only support this interface +struct MFXAudioDecoderPlugin : MFXAudioCodecPlugin +{ + virtual mfxStatus DecodeHeader(mfxBitstream *bs, mfxAudioParam *par) = 0; +// virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) = 0; + virtual mfxStatus DecodeFrameSubmit(mfxBitstream *in, mfxAudioFrame *out, mfxThreadTask *task) = 0; +}; + +//encoder plugins may only support this interface +struct MFXEncoderPlugin : MFXCodecPlugin +{ + virtual mfxStatus EncodeFrameSubmit(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxThreadTask *task) = 0; +}; + +//audio encoder plugins may only support this interface +struct MFXAudioEncoderPlugin : MFXAudioCodecPlugin +{ + virtual mfxStatus EncodeFrameSubmit(mfxAudioFrame *aFrame, mfxBitstream *out, mfxThreadTask *task) = 0; +}; + +//vpp plugins may only support this interface +struct MFXVPPPlugin : MFXCodecPlugin +{ + virtual mfxStatus VPPFrameSubmit(mfxFrameSurface1 *surface_in, mfxFrameSurface1 *surface_out, mfxExtVppAuxData *aux, mfxThreadTask *task) = 0; + virtual mfxStatus VPPFrameSubmitEx(mfxFrameSurface1 *in, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxThreadTask *task) = 0; +}; + +struct MFXEncPlugin : MFXCodecPlugin +{ + virtual mfxStatus EncFrameSubmit(mfxENCInput *in, mfxENCOutput *out, mfxThreadTask *task) = 0; +}; + + + + +class MFXCoreInterface +{ +protected: + mfxCoreInterface m_core; +public: + + MFXCoreInterface() + : m_core() { + } + MFXCoreInterface(const mfxCoreInterface & pCore) + : m_core(pCore) { + } + + MFXCoreInterface(const MFXCoreInterface & that) + : m_core(that.m_core) { + } + MFXCoreInterface &operator = (const MFXCoreInterface & that) + { + m_core = that.m_core; + return *this; + } + bool IsCoreSet() { + return m_core.pthis != 0; + } + mfxStatus GetCoreParam(mfxCoreParam *par) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.GetCoreParam(m_core.pthis, par); + } + mfxStatus GetHandle (mfxHandleType type, mfxHDL *handle) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.GetHandle(m_core.pthis, type, handle); + } + mfxStatus IncreaseReference (mfxFrameData *fd) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.IncreaseReference(m_core.pthis, fd); + } + mfxStatus DecreaseReference (mfxFrameData *fd) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.DecreaseReference(m_core.pthis, fd); + } + mfxStatus CopyFrame (mfxFrameSurface1 *dst, mfxFrameSurface1 *src) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.CopyFrame(m_core.pthis, dst, src); + } + mfxStatus CopyBuffer(mfxU8 *dst, mfxU32 size, mfxFrameSurface1 *src) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.CopyBuffer(m_core.pthis, dst, size, src); + } + mfxStatus MapOpaqueSurface(mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.MapOpaqueSurface(m_core.pthis, num, type, op_surf); + } + mfxStatus UnmapOpaqueSurface(mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.UnmapOpaqueSurface(m_core.pthis, num, type, op_surf); + } + mfxStatus GetRealSurface(mfxFrameSurface1 *op_surf, mfxFrameSurface1 **surf) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.GetRealSurface(m_core.pthis, op_surf, surf); + } + mfxStatus GetOpaqueSurface(mfxFrameSurface1 *surf, mfxFrameSurface1 **op_surf) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.GetOpaqueSurface(m_core.pthis, surf, op_surf); + } + mfxStatus CreateAccelerationDevice(mfxHandleType type, mfxHDL *handle) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.CreateAccelerationDevice(m_core.pthis, type, handle); + } + mfxFrameAllocator & FrameAllocator() { + return m_core.FrameAllocator; + } + mfxStatus GetFrameHandle(mfxFrameData *fd, mfxHDL *handle) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.GetFrameHandle(m_core.pthis, fd, handle); + } + mfxStatus QueryPlatform(mfxPlatform *platform) { + if (!IsCoreSet()) { + return MFX_ERR_NULL_PTR; + } + return m_core.QueryPlatform(m_core.pthis, platform); + } +} ; + +/* Class adapter between "C" structure mfxPlugin and C++ interface MFXPlugin */ + +namespace detail +{ + template + class MFXPluginAdapterBase + { + protected: + mfxPlugin m_mfxAPI; + public: + MFXPluginAdapterBase( T *plugin, mfxVideoCodecPlugin *pCodec = NULL) + : m_mfxAPI() + { + SetupCallbacks(plugin, pCodec); + } + + MFXPluginAdapterBase( T *plugin, mfxAudioCodecPlugin *pCodec) + : m_mfxAPI() + { + SetupCallbacks(plugin, pCodec); + } + + operator mfxPlugin () const { + return m_mfxAPI; + } + void SetupCallbacks(T *plugin) { + m_mfxAPI.pthis = plugin; + m_mfxAPI.PluginInit = _PluginInit; + m_mfxAPI.PluginClose = _PluginClose; + m_mfxAPI.GetPluginParam = _GetPluginParam; + m_mfxAPI.Submit = 0; + m_mfxAPI.Execute = _Execute; + m_mfxAPI.FreeResources = _FreeResources; + } + + void SetupCallbacks( T *plugin, mfxVideoCodecPlugin *pCodec) { + SetupCallbacks(plugin); + m_mfxAPI.Video = pCodec; + } + + void SetupCallbacks( T *plugin, mfxAudioCodecPlugin *pCodec) { + SetupCallbacks(plugin); + m_mfxAPI.Audio = pCodec; + } + private: + + static mfxStatus _PluginInit(mfxHDL pthis, mfxCoreInterface *core) { + return reinterpret_cast(pthis)->PluginInit(core); + } + static mfxStatus _PluginClose(mfxHDL pthis) { + return reinterpret_cast(pthis)->PluginClose(); + } + static mfxStatus _GetPluginParam(mfxHDL pthis, mfxPluginParam *par) { + return reinterpret_cast(pthis)->GetPluginParam(par); + } + static mfxStatus _Execute(mfxHDL pthis, mfxThreadTask task, mfxU32 thread_id, mfxU32 call_count) { + return reinterpret_cast(pthis)->Execute(task, thread_id, call_count); + } + static mfxStatus _FreeResources(mfxHDL pthis, mfxThreadTask task, mfxStatus sts) { + return reinterpret_cast(pthis)->FreeResources(task, sts); + } + }; + + template + class MFXCodecPluginAdapterBase : public MFXPluginAdapterBase + { + protected: + //stub to feed mediasdk plugin API + mfxVideoCodecPlugin m_codecPlg; + public: + MFXCodecPluginAdapterBase(T * pCodecPlg) + : MFXPluginAdapterBase(pCodecPlg, &m_codecPlg) + , m_codecPlg() + { + m_codecPlg.Query = _Query; + m_codecPlg.QueryIOSurf = _QueryIOSurf ; + m_codecPlg.Init = _Init; + m_codecPlg.Reset = _Reset; + m_codecPlg.Close = _Close; + m_codecPlg.GetVideoParam = _GetVideoParam; + } + MFXCodecPluginAdapterBase(const MFXCodecPluginAdapterBase & that) + : MFXPluginAdapterBase(reinterpret_cast(that.m_mfxAPI.pthis), &m_codecPlg) + , m_codecPlg() { + SetupCallbacks(); + } + MFXCodecPluginAdapterBase& operator = (const MFXCodecPluginAdapterBase & that) { + MFXPluginAdapterBase :: SetupCallbacks(reinterpret_cast(that.m_mfxAPI.pthis), &m_codecPlg); + SetupCallbacks(); + return *this; + } + + private: + void SetupCallbacks() { + m_codecPlg.Query = _Query; + m_codecPlg.QueryIOSurf = _QueryIOSurf ; + m_codecPlg.Init = _Init; + m_codecPlg.Reset = _Reset; + m_codecPlg.Close = _Close; + m_codecPlg.GetVideoParam = _GetVideoParam; + } + static mfxStatus _Query(mfxHDL pthis, mfxVideoParam *in, mfxVideoParam *out) { + return reinterpret_cast(pthis)->Query(in, out); + } + static mfxStatus _QueryIOSurf(mfxHDL pthis, mfxVideoParam *par, mfxFrameAllocRequest *in, mfxFrameAllocRequest *out){ + return reinterpret_cast(pthis)->QueryIOSurf(par, in, out); + } + static mfxStatus _Init(mfxHDL pthis, mfxVideoParam *par){ + return reinterpret_cast(pthis)->Init(par); + } + static mfxStatus _Reset(mfxHDL pthis, mfxVideoParam *par){ + return reinterpret_cast(pthis)->Reset(par); + } + static mfxStatus _Close(mfxHDL pthis) { + return reinterpret_cast(pthis)->Close(); + } + static mfxStatus _GetVideoParam(mfxHDL pthis, mfxVideoParam *par) { + return reinterpret_cast(pthis)->GetVideoParam(par); + } + }; + + template + class MFXAudioCodecPluginAdapterBase : public MFXPluginAdapterBase + { + protected: + //stub to feed mediasdk plugin API + mfxAudioCodecPlugin m_codecPlg; + public: + MFXAudioCodecPluginAdapterBase(T * pCodecPlg) + : MFXPluginAdapterBase(pCodecPlg, &m_codecPlg) + , m_codecPlg() + { + m_codecPlg.Query = _Query; + m_codecPlg.QueryIOSize = _QueryIOSize ; + m_codecPlg.Init = _Init; + m_codecPlg.Reset = _Reset; + m_codecPlg.Close = _Close; + m_codecPlg.GetAudioParam = _GetAudioParam; + } + MFXAudioCodecPluginAdapterBase(const MFXCodecPluginAdapterBase & that) + : MFXPluginAdapterBase(reinterpret_cast(that.m_mfxAPI.pthis), &m_codecPlg) + , m_codecPlg() { + SetupCallbacks(); + } + MFXAudioCodecPluginAdapterBase& operator = (const MFXAudioCodecPluginAdapterBase & that) { + MFXPluginAdapterBase :: SetupCallbacks(reinterpret_cast(that.m_mfxAPI.pthis), &m_codecPlg); + SetupCallbacks(); + return *this; + } + + private: + void SetupCallbacks() { + m_codecPlg.Query = _Query; + m_codecPlg.QueryIOSize = _QueryIOSize; + m_codecPlg.Init = _Init; + m_codecPlg.Reset = _Reset; + m_codecPlg.Close = _Close; + m_codecPlg.GetAudioParam = _GetAudioParam; + } + static mfxStatus _Query(mfxHDL pthis, mfxAudioParam *in, mfxAudioParam *out) { + return reinterpret_cast(pthis)->Query(in, out); + } + static mfxStatus _QueryIOSize(mfxHDL pthis, mfxAudioParam *par, mfxAudioAllocRequest *request){ + return reinterpret_cast(pthis)->QueryIOSize(par, request); + } + static mfxStatus _Init(mfxHDL pthis, mfxAudioParam *par){ + return reinterpret_cast(pthis)->Init(par); + } + static mfxStatus _Reset(mfxHDL pthis, mfxAudioParam *par){ + return reinterpret_cast(pthis)->Reset(par); + } + static mfxStatus _Close(mfxHDL pthis) { + return reinterpret_cast(pthis)->Close(); + } + static mfxStatus _GetAudioParam(mfxHDL pthis, mfxAudioParam *par) { + return reinterpret_cast(pthis)->GetAudioParam(par); + } + }; + + template + struct MFXPluginAdapterInternal{}; + template<> + class MFXPluginAdapterInternal : public MFXPluginAdapterBase + { + public: + MFXPluginAdapterInternal(MFXGenericPlugin *pPlugin) + : MFXPluginAdapterBase(pPlugin) + { + m_mfxAPI.Submit = _Submit; + } + MFXPluginAdapterInternal(const MFXPluginAdapterInternal & that ) + : MFXPluginAdapterBase(that) { + m_mfxAPI.Submit = that._Submit; + } + MFXPluginAdapterInternal& operator = (const MFXPluginAdapterInternal & that) { + MFXPluginAdapterBase::operator=(that); + m_mfxAPI.Submit = that._Submit; + return *this; + } + + private: + static mfxStatus _Submit(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task) { + return reinterpret_cast(pthis)->Submit(in, in_num, out, out_num, task); + } + }; + + template<> + class MFXPluginAdapterInternal : public MFXCodecPluginAdapterBase + { + public: + MFXPluginAdapterInternal(MFXDecoderPlugin *pPlugin) + : MFXCodecPluginAdapterBase(pPlugin) + { + SetupCallbacks(); + } + + MFXPluginAdapterInternal(const MFXPluginAdapterInternal & that) + : MFXCodecPluginAdapterBase(that) { + SetupCallbacks(); + } + + MFXPluginAdapterInternal& operator = (const MFXPluginAdapterInternal & that) { + MFXCodecPluginAdapterBase::operator=(that); + SetupCallbacks(); + return *this; + } + + private: + void SetupCallbacks() { + m_codecPlg.DecodeHeader = _DecodeHeader; + m_codecPlg.GetPayload = _GetPayload; + m_codecPlg.DecodeFrameSubmit = _DecodeFrameSubmit; + } + static mfxStatus _DecodeHeader(mfxHDL pthis, mfxBitstream *bs, mfxVideoParam *par) { + return reinterpret_cast(pthis)->DecodeHeader(bs, par); + } + static mfxStatus _GetPayload(mfxHDL pthis, mfxU64 *ts, mfxPayload *payload) { + return reinterpret_cast(pthis)->GetPayload(ts, payload); + } + static mfxStatus _DecodeFrameSubmit(mfxHDL pthis, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxThreadTask *task) { + return reinterpret_cast(pthis)->DecodeFrameSubmit(bs, surface_work, surface_out, task); + } + }; + + template<> + class MFXPluginAdapterInternal : public MFXAudioCodecPluginAdapterBase + { + public: + MFXPluginAdapterInternal(MFXAudioDecoderPlugin *pPlugin) + : MFXAudioCodecPluginAdapterBase(pPlugin) + { + SetupCallbacks(); + } + + MFXPluginAdapterInternal(const MFXPluginAdapterInternal & that) + : MFXAudioCodecPluginAdapterBase(that) { + SetupCallbacks(); + } + + MFXPluginAdapterInternal& operator = (const MFXPluginAdapterInternal & that) { + MFXAudioCodecPluginAdapterBase::operator=(that); + SetupCallbacks(); + return *this; + } + + private: + void SetupCallbacks() { + m_codecPlg.DecodeHeader = _DecodeHeader; + m_codecPlg.DecodeFrameSubmit = _DecodeFrameSubmit; + } + static mfxStatus _DecodeHeader(mfxHDL pthis, mfxBitstream *bs, mfxAudioParam *par) { + return reinterpret_cast(pthis)->DecodeHeader(bs, par); + } + static mfxStatus _DecodeFrameSubmit(mfxHDL pthis, mfxBitstream *in, mfxAudioFrame *out, mfxThreadTask *task) { + return reinterpret_cast(pthis)->DecodeFrameSubmit(in, out, task); + } + }; + + template<> + class MFXPluginAdapterInternal : public MFXCodecPluginAdapterBase + { + public: + MFXPluginAdapterInternal(MFXEncoderPlugin *pPlugin) + : MFXCodecPluginAdapterBase(pPlugin) + { + m_codecPlg.EncodeFrameSubmit = _EncodeFrameSubmit; + } + MFXPluginAdapterInternal(const MFXPluginAdapterInternal & that) + : MFXCodecPluginAdapterBase(that) { + m_codecPlg.EncodeFrameSubmit = _EncodeFrameSubmit; + } + + MFXPluginAdapterInternal& operator = (const MFXPluginAdapterInternal & that) { + MFXCodecPluginAdapterBase::operator = (that); + m_codecPlg.EncodeFrameSubmit = _EncodeFrameSubmit; + return *this; + } + + private: + static mfxStatus _EncodeFrameSubmit(mfxHDL pthis, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxThreadTask *task) { + return reinterpret_cast(pthis)->EncodeFrameSubmit(ctrl, surface, bs, task); + } + }; + + template<> + class MFXPluginAdapterInternal : public MFXAudioCodecPluginAdapterBase + { + public: + MFXPluginAdapterInternal(MFXAudioEncoderPlugin *pPlugin) + : MFXAudioCodecPluginAdapterBase(pPlugin) + { + SetupCallbacks(); + } + + MFXPluginAdapterInternal(const MFXPluginAdapterInternal & that) + : MFXAudioCodecPluginAdapterBase(that) { + SetupCallbacks(); + } + + MFXPluginAdapterInternal& operator = (const MFXPluginAdapterInternal & that) { + MFXAudioCodecPluginAdapterBase::operator=(that); + SetupCallbacks(); + return *this; + } + + private: + void SetupCallbacks() { + m_codecPlg.EncodeFrameSubmit = _EncodeFrameSubmit; + } + static mfxStatus _EncodeFrameSubmit(mfxHDL pthis, mfxAudioFrame *aFrame, mfxBitstream *out, mfxThreadTask *task) { + return reinterpret_cast(pthis)->EncodeFrameSubmit(aFrame, out, task); + } + }; + + template<> + class MFXPluginAdapterInternal : public MFXCodecPluginAdapterBase + { + public: + MFXPluginAdapterInternal(MFXEncPlugin *pPlugin) + : MFXCodecPluginAdapterBase(pPlugin) + { + m_codecPlg.ENCFrameSubmit = _ENCFrameSubmit; + } + MFXPluginAdapterInternal(const MFXPluginAdapterInternal & that) + : MFXCodecPluginAdapterBase(that) { + m_codecPlg.ENCFrameSubmit = _ENCFrameSubmit; + } + + MFXPluginAdapterInternal& operator = (const MFXPluginAdapterInternal & that) { + MFXCodecPluginAdapterBase::operator = (that); + m_codecPlg.ENCFrameSubmit = _ENCFrameSubmit; + return *this; + } + + private: + static mfxStatus _ENCFrameSubmit(mfxHDL pthis,mfxENCInput *in, mfxENCOutput *out, mfxThreadTask *task) { + return reinterpret_cast(pthis)->EncFrameSubmit(in, out, task); + } + }; + + + template<> + class MFXPluginAdapterInternal : public MFXCodecPluginAdapterBase + { + public: + MFXPluginAdapterInternal(MFXVPPPlugin *pPlugin) + : MFXCodecPluginAdapterBase(pPlugin) + { + SetupCallbacks(); + } + MFXPluginAdapterInternal(const MFXPluginAdapterInternal & that) + : MFXCodecPluginAdapterBase(that) { + SetupCallbacks(); + } + + MFXPluginAdapterInternal& operator = (const MFXPluginAdapterInternal & that) { + MFXCodecPluginAdapterBase::operator = (that); + SetupCallbacks(); + return *this; + } + + private: + void SetupCallbacks() { + m_codecPlg.VPPFrameSubmit = _VPPFrameSubmit; + m_codecPlg.VPPFrameSubmitEx = _VPPFrameSubmitEx; + } + static mfxStatus _VPPFrameSubmit(mfxHDL pthis, mfxFrameSurface1 *surface_in, mfxFrameSurface1 *surface_out, mfxExtVppAuxData *aux, mfxThreadTask *task) { + return reinterpret_cast(pthis)->VPPFrameSubmit(surface_in, surface_out, aux, task); + } + static mfxStatus _VPPFrameSubmitEx(mfxHDL pthis, mfxFrameSurface1 *surface_in, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxThreadTask *task) { + return reinterpret_cast(pthis)->VPPFrameSubmitEx(surface_in, surface_work, surface_out, task); + } + }; +} + +/* adapter for particular plugin type*/ +template +class MFXPluginAdapter +{ +public: + detail::MFXPluginAdapterInternal m_Adapter; + + operator mfxPlugin () const { + return m_Adapter.operator mfxPlugin(); + } + + MFXPluginAdapter(T* pPlugin = NULL) + : m_Adapter(pPlugin) + { + } +}; + +template +inline MFXPluginAdapter make_mfx_plugin_adapter(T* pPlugin) { + + MFXPluginAdapter adapt(pPlugin); + return adapt; +} + +#endif // __MFXPLUGINPLUSPLUS_H diff --git a/.github/actions/libmfx/include/mfx/mfxplugin.h b/.github/actions/libmfx/include/mfx/mfxplugin.h new file mode 100644 index 0000000..58ddd6f --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxplugin.h @@ -0,0 +1,216 @@ +// Copyright (c) 2018-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXPLUGIN_H__ +#define __MFXPLUGIN_H__ +#include "mfxvideo.h" +#include "mfxaudio.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU8 Data[16]; +} mfxPluginUID; +MFX_PACK_END() + +static const mfxPluginUID MFX_PLUGINID_HEVCD_SW = {{0x15, 0xdd, 0x93, 0x68, 0x25, 0xad, 0x47, 0x5e, 0xa3, 0x4e, 0x35, 0xf3, 0xf5, 0x42, 0x17, 0xa6}}; +static const mfxPluginUID MFX_PLUGINID_HEVCD_HW = {{0x33, 0xa6, 0x1c, 0x0b, 0x4c, 0x27, 0x45, 0x4c, 0xa8, 0xd8, 0x5d, 0xde, 0x75, 0x7c, 0x6f, 0x8e}}; +static const mfxPluginUID MFX_PLUGINID_HEVCE_SW = {{0x2f, 0xca, 0x99, 0x74, 0x9f, 0xdb, 0x49, 0xae, 0xb1, 0x21, 0xa5, 0xb6, 0x3e, 0xf5, 0x68, 0xf7}}; +static const mfxPluginUID MFX_PLUGINID_HEVCE_GACC = {{0xe5, 0x40, 0x0a, 0x06, 0xc7, 0x4d, 0x41, 0xf5, 0xb1, 0x2d, 0x43, 0x0b, 0xba, 0xa2, 0x3d, 0x0b}}; +static const mfxPluginUID MFX_PLUGINID_HEVCE_DP_GACC = {{0x2b, 0xad, 0x6f, 0x9d, 0x77, 0x54, 0x41, 0x2d, 0xbf, 0x63, 0x03, 0xed, 0x4b, 0xb5, 0x09, 0x68}}; +static const mfxPluginUID MFX_PLUGINID_HEVCE_HW = {{0x6f, 0xad, 0xc7, 0x91, 0xa0, 0xc2, 0xeb, 0x47, 0x9a, 0xb6, 0xdc, 0xd5, 0xea, 0x9d, 0xa3, 0x47}}; +static const mfxPluginUID MFX_PLUGINID_VP8D_HW = {{0xf6, 0x22, 0x39, 0x4d, 0x8d, 0x87, 0x45, 0x2f, 0x87, 0x8c, 0x51, 0xf2, 0xfc, 0x9b, 0x41, 0x31}}; +static const mfxPluginUID MFX_PLUGINID_VP8E_HW = {{0xbf, 0xfc, 0x51, 0x8c, 0xde, 0x13, 0x4d, 0xf9, 0x8a, 0x96, 0xf4, 0xcf, 0x81, 0x6c, 0x0f, 0xac}}; +static const mfxPluginUID MFX_PLUGINID_VP9E_HW = {{0xce, 0x44, 0xef, 0x6f, 0x1a, 0x6d, 0x22, 0x46, 0xb4, 0x12, 0xbb, 0x38, 0xd6, 0xe4, 0x51, 0x82}}; +static const mfxPluginUID MFX_PLUGINID_VP9D_HW = {{0xa9, 0x22, 0x39, 0x4d, 0x8d, 0x87, 0x45, 0x2f, 0x87, 0x8c, 0x51, 0xf2, 0xfc, 0x9b, 0x41, 0x31}}; +static const mfxPluginUID MFX_PLUGINID_CAMERA_HW = {{0x54, 0x54, 0x26, 0x16, 0x24, 0x33, 0x41, 0xe6, 0x93, 0xae, 0x89, 0x99, 0x42, 0xce, 0x73, 0x55}}; +static const mfxPluginUID MFX_PLUGINID_CAPTURE_HW = {{0x22, 0xd6, 0x2c, 0x07, 0xe6, 0x72, 0x40, 0x8f, 0xbb, 0x4c, 0xc2, 0x0e, 0xd7, 0xa0, 0x53, 0xe4}}; +static const mfxPluginUID MFX_PLUGINID_ITELECINE_HW = {{0xe7, 0x44, 0x75, 0x3a, 0xcd, 0x74, 0x40, 0x2e, 0x89, 0xa2, 0xee, 0x06, 0x35, 0x49, 0x61, 0x79}}; +static const mfxPluginUID MFX_PLUGINID_H264LA_HW = {{0x58, 0x8f, 0x11, 0x85, 0xd4, 0x7b, 0x42, 0x96, 0x8d, 0xea, 0x37, 0x7b, 0xb5, 0xd0, 0xdc, 0xb4}}; +static const mfxPluginUID MFX_PLUGINID_AACD = {{0xe9, 0x34, 0x67, 0x25, 0xac, 0x2f, 0x4c, 0x93, 0xaa, 0x58, 0x5c, 0x11, 0xc7, 0x08, 0x7c, 0xf4}}; +static const mfxPluginUID MFX_PLUGINID_AACE = {{0xb2, 0xa2, 0xa0, 0x5a, 0x4e, 0xac, 0x46, 0xbf, 0xa9, 0xde, 0x7e, 0x80, 0xc9, 0x8d, 0x2e, 0x18}}; +static const mfxPluginUID MFX_PLUGINID_HEVCE_FEI_HW = {{0x87, 0xe0, 0xe8, 0x02, 0x07, 0x37, 0x52, 0x40, 0x85, 0x25, 0x15, 0xcf, 0x4a, 0x5e, 0xdd, 0xe6}}; +#if (MFX_VERSION >= 1027) +static const mfxPluginUID MFX_PLUGINID_HEVC_FEI_ENCODE = {{0x54, 0x18, 0xa7, 0x06, 0x66, 0xf9, 0x4d, 0x5c, 0xb4, 0xf7, 0xb1, 0xca, 0xee, 0x86, 0x33, 0x9b}}; +#endif + + +typedef enum { + MFX_PLUGINTYPE_VIDEO_GENERAL = 0, + MFX_PLUGINTYPE_VIDEO_DECODE = 1, + MFX_PLUGINTYPE_VIDEO_ENCODE = 2, + MFX_PLUGINTYPE_VIDEO_VPP = 3, + MFX_PLUGINTYPE_VIDEO_ENC = 4, + MFX_PLUGINTYPE_AUDIO_DECODE = 5, + MFX_PLUGINTYPE_AUDIO_ENCODE = 6 +} mfxPluginType; + +typedef enum { + MFX_THREADPOLICY_SERIAL = 0, + MFX_THREADPOLICY_PARALLEL = 1 +} mfxThreadPolicy; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct mfxPluginParam { + mfxU32 reserved[6]; + mfxU16 reserved1; + mfxU16 PluginVersion; + mfxVersion APIVersion; + mfxPluginUID PluginUID; + mfxU32 Type; + mfxU32 CodecId; + mfxThreadPolicy ThreadPolicy; + mfxU32 MaxThreadNum; +} mfxPluginParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct mfxCoreParam{ + mfxU32 reserved[13]; + mfxIMPL Impl; + mfxVersion Version; + mfxU32 NumWorkingThread; +} mfxCoreParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct mfxCoreInterface { + mfxHDL pthis; + + mfxHDL reserved1[2]; + mfxFrameAllocator FrameAllocator; + mfxBufferAllocator reserved3; + + mfxStatus (MFX_CDECL *GetCoreParam)(mfxHDL pthis, mfxCoreParam *par); + mfxStatus (MFX_CDECL *GetHandle) (mfxHDL pthis, mfxHandleType type, mfxHDL *handle); + mfxStatus (MFX_CDECL *IncreaseReference) (mfxHDL pthis, mfxFrameData *fd); + mfxStatus (MFX_CDECL *DecreaseReference) (mfxHDL pthis, mfxFrameData *fd); + mfxStatus (MFX_CDECL *CopyFrame) (mfxHDL pthis, mfxFrameSurface1 *dst, mfxFrameSurface1 *src); + mfxStatus (MFX_CDECL *CopyBuffer)(mfxHDL pthis, mfxU8 *dst, mfxU32 size, mfxFrameSurface1 *src); + + mfxStatus (MFX_CDECL *MapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); + mfxStatus (MFX_CDECL *UnmapOpaqueSurface)(mfxHDL pthis, mfxU32 num, mfxU32 type, mfxFrameSurface1 **op_surf); + + mfxStatus (MFX_CDECL *GetRealSurface)(mfxHDL pthis, mfxFrameSurface1 *op_surf, mfxFrameSurface1 **surf); + mfxStatus (MFX_CDECL *GetOpaqueSurface)(mfxHDL pthis, mfxFrameSurface1 *surf, mfxFrameSurface1 **op_surf); + + mfxStatus (MFX_CDECL *CreateAccelerationDevice)(mfxHDL pthis, mfxHandleType type, mfxHDL *handle); + mfxStatus (MFX_CDECL *GetFrameHandle) (mfxHDL pthis, mfxFrameData *fd, mfxHDL *handle); + mfxStatus (MFX_CDECL *QueryPlatform) (mfxHDL pthis, mfxPlatform *platform); + + mfxHDL reserved4[1]; +} mfxCoreInterface; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +/* video codec plugin extension */ +typedef struct _mfxENCInput mfxENCInput; +typedef struct _mfxENCOutput mfxENCOutput; +typedef struct mfxVideoCodecPlugin{ + mfxStatus (MFX_CDECL *Query)(mfxHDL pthis, mfxVideoParam *in, mfxVideoParam *out); + mfxStatus (MFX_CDECL *QueryIOSurf)(mfxHDL pthis, mfxVideoParam *par, mfxFrameAllocRequest *in, mfxFrameAllocRequest *out); + mfxStatus (MFX_CDECL *Init)(mfxHDL pthis, mfxVideoParam *par); + mfxStatus (MFX_CDECL *Reset)(mfxHDL pthis, mfxVideoParam *par); + mfxStatus (MFX_CDECL *Close)(mfxHDL pthis); + mfxStatus (MFX_CDECL *GetVideoParam)(mfxHDL pthis, mfxVideoParam *par); + + mfxStatus (MFX_CDECL *EncodeFrameSubmit)(mfxHDL pthis, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxThreadTask *task); + + mfxStatus (MFX_CDECL *DecodeHeader)(mfxHDL pthis, mfxBitstream *bs, mfxVideoParam *par); + mfxStatus (MFX_CDECL *GetPayload)(mfxHDL pthis, mfxU64 *ts, mfxPayload *payload); + mfxStatus (MFX_CDECL *DecodeFrameSubmit)(mfxHDL pthis, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxThreadTask *task); + + mfxStatus (MFX_CDECL *VPPFrameSubmit)(mfxHDL pthis, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxThreadTask *task); + mfxStatus (MFX_CDECL *VPPFrameSubmitEx)(mfxHDL pthis, mfxFrameSurface1 *in, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxThreadTask *task); + + mfxStatus (MFX_CDECL *ENCFrameSubmit)(mfxHDL pthis, mfxENCInput *in, mfxENCOutput *out, mfxThreadTask *task); + + mfxHDL reserved1[3]; + mfxU32 reserved2[8]; +} mfxVideoCodecPlugin; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct mfxAudioCodecPlugin{ + mfxStatus (MFX_CDECL *Query)(mfxHDL pthis, mfxAudioParam *in, mfxAudioParam *out); + mfxStatus (MFX_CDECL *QueryIOSize)(mfxHDL pthis, mfxAudioParam *par, mfxAudioAllocRequest *request); + mfxStatus (MFX_CDECL *Init)(mfxHDL pthis, mfxAudioParam *par); + mfxStatus (MFX_CDECL *Reset)(mfxHDL pthis, mfxAudioParam *par); + mfxStatus (MFX_CDECL *Close)(mfxHDL pthis); + mfxStatus (MFX_CDECL *GetAudioParam)(mfxHDL pthis, mfxAudioParam *par); + + mfxStatus (MFX_CDECL *EncodeFrameSubmit)(mfxHDL pthis, mfxAudioFrame *aFrame, mfxBitstream *out, mfxThreadTask *task); + + mfxStatus (MFX_CDECL *DecodeHeader)(mfxHDL pthis, mfxBitstream *bs, mfxAudioParam *par); +// mfxStatus (MFX_CDECL *GetPayload)(mfxHDL pthis, mfxU64 *ts, mfxPayload *payload); + mfxStatus (MFX_CDECL *DecodeFrameSubmit)(mfxHDL pthis, mfxBitstream *in, mfxAudioFrame *out, mfxThreadTask *task); + + mfxHDL reserved1[6]; + mfxU32 reserved2[8]; +} mfxAudioCodecPlugin; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct mfxPlugin{ + mfxHDL pthis; + + mfxStatus (MFX_CDECL *PluginInit) (mfxHDL pthis, mfxCoreInterface *core); + mfxStatus (MFX_CDECL *PluginClose) (mfxHDL pthis); + + mfxStatus (MFX_CDECL *GetPluginParam)(mfxHDL pthis, mfxPluginParam *par); + + mfxStatus (MFX_CDECL *Submit)(mfxHDL pthis, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxThreadTask *task); + mfxStatus (MFX_CDECL *Execute)(mfxHDL pthis, mfxThreadTask task, mfxU32 uid_p, mfxU32 uid_a); + mfxStatus (MFX_CDECL *FreeResources)(mfxHDL pthis, mfxThreadTask task, mfxStatus sts); + + union { + mfxVideoCodecPlugin *Video; + mfxAudioCodecPlugin *Audio; + }; + + mfxHDL reserved[8]; +} mfxPlugin; +MFX_PACK_END() + + +mfxStatus MFX_CDECL MFXVideoUSER_Register(mfxSession session, mfxU32 type, const mfxPlugin *par); +mfxStatus MFX_CDECL MFXVideoUSER_Unregister(mfxSession session, mfxU32 type); +mfxStatus MFX_CDECL MFXVideoUSER_GetPlugin(mfxSession session, mfxU32 type, mfxPlugin *par); +mfxStatus MFX_CDECL MFXVideoUSER_ProcessFrameAsync(mfxSession session, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxSyncPoint *syncp); + +mfxStatus MFX_CDECL MFXVideoUSER_Load(mfxSession session, const mfxPluginUID *uid, mfxU32 version); +mfxStatus MFX_CDECL MFXVideoUSER_LoadByPath(mfxSession session, const mfxPluginUID *uid, mfxU32 version, const mfxChar *path, mfxU32 len); +mfxStatus MFX_CDECL MFXVideoUSER_UnLoad(mfxSession session, const mfxPluginUID *uid); + +mfxStatus MFX_CDECL MFXAudioUSER_Register(mfxSession session, mfxU32 type, const mfxPlugin *par); +mfxStatus MFX_CDECL MFXAudioUSER_Unregister(mfxSession session, mfxU32 type); +mfxStatus MFX_CDECL MFXAudioUSER_ProcessFrameAsync(mfxSession session, const mfxHDL *in, mfxU32 in_num, const mfxHDL *out, mfxU32 out_num, mfxSyncPoint *syncp); + +mfxStatus MFX_CDECL MFXAudioUSER_Load(mfxSession session, const mfxPluginUID *uid, mfxU32 version); +mfxStatus MFX_CDECL MFXAudioUSER_UnLoad(mfxSession session, const mfxPluginUID *uid); + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + +#endif /* __MFXPLUGIN_H__ */ diff --git a/.github/actions/libmfx/include/mfx/mfxsc.h b/.github/actions/libmfx/include/mfx/mfxsc.h new file mode 100644 index 0000000..d6bc063 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxsc.h @@ -0,0 +1,54 @@ +// Copyright (c) 2018-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXSC_H__ +#define __MFXSC_H__ +#include "mfxdefs.h" +#include "mfxvstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* Extended Buffer Ids */ +enum +{ + MFX_EXTBUFF_SCREEN_CAPTURE_PARAM = MFX_MAKEFOURCC('S','C','P','A') +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct +{ + mfxExtBuffer Header; + + mfxU32 DisplayIndex; + mfxU16 EnableDirtyRect; + mfxU16 EnableCursorCapture; + mfxU16 reserved[24]; +} mfxExtScreenCaptureParam; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif /* __cplusplus */ + + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxscd.h b/.github/actions/libmfx/include/mfx/mfxscd.h new file mode 100644 index 0000000..117ddd6 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxscd.h @@ -0,0 +1,61 @@ +// Copyright (c) 2018-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXSCD_H__ +#define __MFXSCD_H__ + +#include "mfxenc.h" +#include "mfxplugin.h" + +#define MFX_ENC_SCD_PLUGIN_VERSION 1 + +#ifdef __cplusplus +extern "C" { +#endif + +static const mfxPluginUID MFX_PLUGINID_ENC_SCD = {{ 0xdf, 0xc2, 0x15, 0xb3, 0xe3, 0xd3, 0x90, 0x4d, 0x7f, 0xa5, 0x04, 0x12, 0x7e, 0xf5, 0x64, 0xd5 }}; + +/* SCD Extended Buffer Ids */ +enum { + MFX_EXTBUFF_SCD = MFX_MAKEFOURCC('S','C','D',' ') +}; + +/* SceneType */ +enum { + MFX_SCD_SCENE_SAME = 0x00, + MFX_SCD_SCENE_NEW_FIELD_1 = 0x01, + MFX_SCD_SCENE_NEW_FIELD_2 = 0x02, + MFX_SCD_SCENE_NEW_PICTURE = MFX_SCD_SCENE_NEW_FIELD_1 | MFX_SCD_SCENE_NEW_FIELD_2 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 SceneType; + mfxU16 reserved[27]; +} mfxExtSCD; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxsession.h b/.github/actions/libmfx/include/mfx/mfxsession.h new file mode 100644 index 0000000..60cc6d6 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxsession.h @@ -0,0 +1,50 @@ +// Copyright (c) 2017 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXSESSION_H__ +#define __MFXSESSION_H__ +#include "mfxcommon.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* Global Functions */ +typedef struct _mfxSession *mfxSession; +mfxStatus MFX_CDECL MFXInit(mfxIMPL impl, mfxVersion *ver, mfxSession *session); +mfxStatus MFX_CDECL MFXInitEx(mfxInitParam par, mfxSession *session); +mfxStatus MFX_CDECL MFXClose(mfxSession session); + +mfxStatus MFX_CDECL MFXQueryIMPL(mfxSession session, mfxIMPL *impl); +mfxStatus MFX_CDECL MFXQueryVersion(mfxSession session, mfxVersion *version); + +mfxStatus MFX_CDECL MFXJoinSession(mfxSession session, mfxSession child); +mfxStatus MFX_CDECL MFXDisjoinSession(mfxSession session); +mfxStatus MFX_CDECL MFXCloneSession(mfxSession session, mfxSession *clone); +mfxStatus MFX_CDECL MFXSetPriority(mfxSession session, mfxPriority priority); +mfxStatus MFX_CDECL MFXGetPriority(mfxSession session, mfxPriority *priority); +mfxStatus MFX_CDECL MFXDoWork(mfxSession session); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxstructures.h b/.github/actions/libmfx/include/mfx/mfxstructures.h new file mode 100644 index 0000000..65e7de9 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxstructures.h @@ -0,0 +1,2509 @@ +// Copyright (c) 2018-2020 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXSTRUCTURES_H__ +#define __MFXSTRUCTURES_H__ +#include "mfxcommon.h" + +#if !defined (__GNUC__) +#pragma warning(disable: 4201) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Frame ID for SVC and MVC */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU16 TemporalId; + mfxU16 PriorityId; + union { + struct { + mfxU16 DependencyId; + mfxU16 QualityId; + }; + struct { + mfxU16 ViewId; + }; + }; +} mfxFrameId; +MFX_PACK_END() + +/* This struct has 4-byte alignment for binary compatibility with previously released versions of API */ +MFX_PACK_BEGIN_USUAL_STRUCT() +/* Frame Info */ +typedef struct { + mfxU32 reserved[4]; + mfxU16 reserved4; + mfxU16 BitDepthLuma; + mfxU16 BitDepthChroma; + mfxU16 Shift; + + mfxFrameId FrameId; + + mfxU32 FourCC; + union { + struct { /* Frame parameters */ + mfxU16 Width; + mfxU16 Height; + + mfxU16 CropX; + mfxU16 CropY; + mfxU16 CropW; + mfxU16 CropH; + }; + struct { /* Buffer parameters (for plain formats like P8) */ + mfxU64 BufferSize; + mfxU32 reserved5; + }; + }; + + mfxU32 FrameRateExtN; + mfxU32 FrameRateExtD; + mfxU16 reserved3; + + mfxU16 AspectRatioW; + mfxU16 AspectRatioH; + + mfxU16 PicStruct; + mfxU16 ChromaFormat; + mfxU16 reserved2; +} mfxFrameInfo; +MFX_PACK_END() + +/* FourCC */ +enum { + MFX_FOURCC_NV12 = MFX_MAKEFOURCC('N','V','1','2'), /* Native Format */ + MFX_FOURCC_YV12 = MFX_MAKEFOURCC('Y','V','1','2'), + MFX_FOURCC_NV16 = MFX_MAKEFOURCC('N','V','1','6'), + MFX_FOURCC_YUY2 = MFX_MAKEFOURCC('Y','U','Y','2'), +#if (MFX_VERSION >= 1028) + MFX_FOURCC_RGB565 = MFX_MAKEFOURCC('R','G','B','2'), /* 2 bytes per pixel, uint16 in little-endian format, where 0-4 bits are blue, bits 5-10 are green and bits 11-15 are red */ + MFX_FOURCC_RGBP = MFX_MAKEFOURCC('R','G','B','P'), +#endif + MFX_FOURCC_RGB3 = MFX_MAKEFOURCC('R','G','B','3'), /* deprecated */ + MFX_FOURCC_RGB4 = MFX_MAKEFOURCC('R','G','B','4'), /* ARGB in that order, A channel is 8 MSBs */ + MFX_FOURCC_P8 = 41, /* D3DFMT_P8 */ + MFX_FOURCC_P8_TEXTURE = MFX_MAKEFOURCC('P','8','M','B'), + MFX_FOURCC_P010 = MFX_MAKEFOURCC('P','0','1','0'), +#if (MFX_VERSION >= 1031) + MFX_FOURCC_P016 = MFX_MAKEFOURCC('P','0','1','6'), +#endif + MFX_FOURCC_P210 = MFX_MAKEFOURCC('P','2','1','0'), + MFX_FOURCC_BGR4 = MFX_MAKEFOURCC('B','G','R','4'), /* ABGR in that order, A channel is 8 MSBs */ + MFX_FOURCC_A2RGB10 = MFX_MAKEFOURCC('R','G','1','0'), /* ARGB in that order, A channel is two MSBs */ + MFX_FOURCC_ARGB16 = MFX_MAKEFOURCC('R','G','1','6'), /* ARGB in that order, 64 bits, A channel is 16 MSBs */ + MFX_FOURCC_ABGR16 = MFX_MAKEFOURCC('B','G','1','6'), /* ABGR in that order, 64 bits, A channel is 16 MSBs */ + MFX_FOURCC_R16 = MFX_MAKEFOURCC('R','1','6','U'), + MFX_FOURCC_AYUV = MFX_MAKEFOURCC('A','Y','U','V'), /* YUV 4:4:4, AYUV in that order, A channel is 8 MSBs */ + MFX_FOURCC_AYUV_RGB4 = MFX_MAKEFOURCC('A','V','U','Y'), /* ARGB in that order, A channel is 8 MSBs stored in AYUV surface*/ + MFX_FOURCC_UYVY = MFX_MAKEFOURCC('U','Y','V','Y'), +#if (MFX_VERSION >= 1027) + MFX_FOURCC_Y210 = MFX_MAKEFOURCC('Y','2','1','0'), + MFX_FOURCC_Y410 = MFX_MAKEFOURCC('Y','4','1','0'), +#endif +#if (MFX_VERSION >= 1031) + MFX_FOURCC_Y216 = MFX_MAKEFOURCC('Y','2','1','6'), + MFX_FOURCC_Y416 = MFX_MAKEFOURCC('Y','4','1','6'), +#endif + MFX_FOURCC_NV21 = MFX_MAKEFOURCC('N', 'V', '2', '1'), /* Same as NV12 but with weaved V and U values. */ + MFX_FOURCC_IYUV = MFX_MAKEFOURCC('I', 'Y', 'U', 'V'), /* Same as YV12 except that the U and V plane order is reversed. */ + MFX_FOURCC_I010 = MFX_MAKEFOURCC('I', '0', '1', '0'), /* 10-bit YUV 4:2:0, each component has its own plane. */ +}; + +/* PicStruct */ +enum { + MFX_PICSTRUCT_UNKNOWN =0x00, + MFX_PICSTRUCT_PROGRESSIVE =0x01, + MFX_PICSTRUCT_FIELD_TFF =0x02, + MFX_PICSTRUCT_FIELD_BFF =0x04, + + MFX_PICSTRUCT_FIELD_REPEATED=0x10, /* first field repeated, pic_struct=5 or 6 in H.264 */ + MFX_PICSTRUCT_FRAME_DOUBLING=0x20, /* pic_struct=7 in H.264 */ + MFX_PICSTRUCT_FRAME_TRIPLING=0x40, /* pic_struct=8 in H.264 */ + + MFX_PICSTRUCT_FIELD_SINGLE =0x100, + MFX_PICSTRUCT_FIELD_TOP =MFX_PICSTRUCT_FIELD_SINGLE | MFX_PICSTRUCT_FIELD_TFF, + MFX_PICSTRUCT_FIELD_BOTTOM =MFX_PICSTRUCT_FIELD_SINGLE | MFX_PICSTRUCT_FIELD_BFF, + MFX_PICSTRUCT_FIELD_PAIRED_PREV =0x200, + MFX_PICSTRUCT_FIELD_PAIRED_NEXT =0x400, +}; + +/* ColorFormat */ +enum { + MFX_CHROMAFORMAT_MONOCHROME =0, + MFX_CHROMAFORMAT_YUV420 =1, + MFX_CHROMAFORMAT_YUV422 =2, + MFX_CHROMAFORMAT_YUV444 =3, + MFX_CHROMAFORMAT_YUV400 = MFX_CHROMAFORMAT_MONOCHROME, + MFX_CHROMAFORMAT_YUV411 = 4, + MFX_CHROMAFORMAT_YUV422H = MFX_CHROMAFORMAT_YUV422, + MFX_CHROMAFORMAT_YUV422V = 5, + MFX_CHROMAFORMAT_RESERVED1 = 6 +}; + +enum { + MFX_TIMESTAMP_UNKNOWN = -1 +}; + +enum { + MFX_FRAMEORDER_UNKNOWN = -1 +}; + +/* DataFlag in mfxFrameData */ +enum { + MFX_FRAMEDATA_ORIGINAL_TIMESTAMP = 0x0001 +}; + +/* Corrupted in mfxFrameData */ +enum { + MFX_CORRUPTION_MINOR = 0x0001, + MFX_CORRUPTION_MAJOR = 0x0002, + MFX_CORRUPTION_ABSENT_TOP_FIELD = 0x0004, + MFX_CORRUPTION_ABSENT_BOTTOM_FIELD = 0x0008, + MFX_CORRUPTION_REFERENCE_FRAME = 0x0010, + MFX_CORRUPTION_REFERENCE_LIST = 0x0020 +}; + +#if (MFX_VERSION >= 1027) +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct +{ + mfxU32 U : 10; + mfxU32 Y : 10; + mfxU32 V : 10; + mfxU32 A : 2; +} mfxY410; +MFX_PACK_END() +#endif + +#if (MFX_VERSION >= 1025) +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct +{ + mfxU32 B : 10; + mfxU32 G : 10; + mfxU32 R : 10; + mfxU32 A : 2; +} mfxA2RGB10; +MFX_PACK_END() +#endif + +/* Frame Data Info */ +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + union { + mfxExtBuffer **ExtParam; + mfxU64 reserved2; + }; + mfxU16 NumExtParam; + + mfxU16 reserved[9]; + mfxU16 MemType; + mfxU16 PitchHigh; + + mfxU64 TimeStamp; + mfxU32 FrameOrder; + mfxU16 Locked; + union{ + mfxU16 Pitch; + mfxU16 PitchLow; + }; + + /* color planes */ + union { + mfxU8 *Y; + mfxU16 *Y16; + mfxU8 *R; + }; + union { + mfxU8 *UV; /* for UV merged formats */ + mfxU8 *VU; /* for VU merged formats */ + mfxU8 *CbCr; /* for CbCr merged formats */ + mfxU8 *CrCb; /* for CrCb merged formats */ + mfxU8 *Cb; + mfxU8 *U; + mfxU16 *U16; + mfxU8 *G; +#if (MFX_VERSION >= 1027) + mfxY410 *Y410; /* for Y410 format (merged AVYU) */ +#endif + }; + union { + mfxU8 *Cr; + mfxU8 *V; + mfxU16 *V16; + mfxU8 *B; +#if (MFX_VERSION >= 1025) + mfxA2RGB10 *A2RGB10; /* for A2RGB10 format (merged ARGB) */ +#endif + }; + mfxU8 *A; + mfxMemId MemId; + + /* Additional Flags */ + mfxU16 Corrupted; + mfxU16 DataFlag; +} mfxFrameData; +MFX_PACK_END() + +/* Frame Surface */ +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxU32 reserved[4]; + mfxFrameInfo Info; + mfxFrameData Data; +} mfxFrameSurface1; +MFX_PACK_END() + +enum { + MFX_TIMESTAMPCALC_UNKNOWN = 0, + MFX_TIMESTAMPCALC_TELECINE = 1, +}; + +/* Transcoding Info */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU32 reserved[7]; + + mfxU16 LowPower; + mfxU16 BRCParamMultiplier; + + mfxFrameInfo FrameInfo; + mfxU32 CodecId; + mfxU16 CodecProfile; + mfxU16 CodecLevel; + mfxU16 NumThread; + + union { + struct { /* Encoding Options */ + mfxU16 TargetUsage; + + mfxU16 GopPicSize; + mfxU16 GopRefDist; + mfxU16 GopOptFlag; + mfxU16 IdrInterval; + + mfxU16 RateControlMethod; + union { + mfxU16 InitialDelayInKB; + mfxU16 QPI; + mfxU16 Accuracy; + }; + mfxU16 BufferSizeInKB; + union { + mfxU16 TargetKbps; + mfxU16 QPP; + mfxU16 ICQQuality; + }; + union { + mfxU16 MaxKbps; + mfxU16 QPB; + mfxU16 Convergence; + }; + + mfxU16 NumSlice; + mfxU16 NumRefFrame; + mfxU16 EncodedOrder; + }; + struct { /* Decoding Options */ + mfxU16 DecodedOrder; + mfxU16 ExtendedPicStruct; + mfxU16 TimeStampCalc; + mfxU16 SliceGroupsPresent; + mfxU16 MaxDecFrameBuffering; + mfxU16 EnableReallocRequest; +#if (MFX_VERSION >= 1034) + mfxU16 FilmGrain; + mfxU16 IgnoreLevelConstrain; + mfxU16 reserved2[5]; +#else + mfxU16 reserved2[7]; +#endif + }; + struct { /* JPEG Decoding Options */ + mfxU16 JPEGChromaFormat; + mfxU16 Rotation; + mfxU16 JPEGColorFormat; + mfxU16 InterleavedDec; + mfxU8 SamplingFactorH[4]; + mfxU8 SamplingFactorV[4]; + mfxU16 reserved3[5]; + }; + struct { /* JPEG Encoding Options */ + mfxU16 Interleaved; + mfxU16 Quality; + mfxU16 RestartInterval; + mfxU16 reserved5[10]; + }; + }; +} mfxInfoMFX; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU32 reserved[8]; + mfxFrameInfo In; + mfxFrameInfo Out; +} mfxInfoVPP; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxU32 AllocId; + mfxU32 reserved[2]; + mfxU16 reserved3; + mfxU16 AsyncDepth; + + union { + mfxInfoMFX mfx; + mfxInfoVPP vpp; + }; + mfxU16 Protected; + mfxU16 IOPattern; + mfxExtBuffer** ExtParam; + mfxU16 NumExtParam; + mfxU16 reserved2; +} mfxVideoParam; +MFX_PACK_END() + +/* IOPattern */ +enum { + MFX_IOPATTERN_IN_VIDEO_MEMORY = 0x01, + MFX_IOPATTERN_IN_SYSTEM_MEMORY = 0x02, + MFX_IOPATTERN_IN_OPAQUE_MEMORY = 0x04, + MFX_IOPATTERN_OUT_VIDEO_MEMORY = 0x10, + MFX_IOPATTERN_OUT_SYSTEM_MEMORY = 0x20, + MFX_IOPATTERN_OUT_OPAQUE_MEMORY = 0x40 +}; + +/* CodecId */ +enum { + MFX_CODEC_AVC =MFX_MAKEFOURCC('A','V','C',' '), + MFX_CODEC_HEVC =MFX_MAKEFOURCC('H','E','V','C'), + MFX_CODEC_MPEG2 =MFX_MAKEFOURCC('M','P','G','2'), + MFX_CODEC_VC1 =MFX_MAKEFOURCC('V','C','1',' '), + MFX_CODEC_CAPTURE =MFX_MAKEFOURCC('C','A','P','T'), + MFX_CODEC_VP9 =MFX_MAKEFOURCC('V','P','9',' '), + MFX_CODEC_AV1 =MFX_MAKEFOURCC('A','V','1',' ') +}; + +/* CodecProfile, CodecLevel */ +enum { + MFX_PROFILE_UNKNOWN =0, + MFX_LEVEL_UNKNOWN =0, + + /* AVC Profiles & Levels */ + MFX_PROFILE_AVC_CONSTRAINT_SET0 = (0x100 << 0), + MFX_PROFILE_AVC_CONSTRAINT_SET1 = (0x100 << 1), + MFX_PROFILE_AVC_CONSTRAINT_SET2 = (0x100 << 2), + MFX_PROFILE_AVC_CONSTRAINT_SET3 = (0x100 << 3), + MFX_PROFILE_AVC_CONSTRAINT_SET4 = (0x100 << 4), + MFX_PROFILE_AVC_CONSTRAINT_SET5 = (0x100 << 5), + + MFX_PROFILE_AVC_BASELINE =66, + MFX_PROFILE_AVC_MAIN =77, + MFX_PROFILE_AVC_EXTENDED =88, + MFX_PROFILE_AVC_HIGH =100, + MFX_PROFILE_AVC_HIGH10 =110, + MFX_PROFILE_AVC_HIGH_422 =122, + MFX_PROFILE_AVC_CONSTRAINED_BASELINE =MFX_PROFILE_AVC_BASELINE + MFX_PROFILE_AVC_CONSTRAINT_SET1, + MFX_PROFILE_AVC_CONSTRAINED_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4 + + MFX_PROFILE_AVC_CONSTRAINT_SET5, + MFX_PROFILE_AVC_PROGRESSIVE_HIGH =MFX_PROFILE_AVC_HIGH + MFX_PROFILE_AVC_CONSTRAINT_SET4, + + MFX_LEVEL_AVC_1 =10, + MFX_LEVEL_AVC_1b =9, + MFX_LEVEL_AVC_11 =11, + MFX_LEVEL_AVC_12 =12, + MFX_LEVEL_AVC_13 =13, + MFX_LEVEL_AVC_2 =20, + MFX_LEVEL_AVC_21 =21, + MFX_LEVEL_AVC_22 =22, + MFX_LEVEL_AVC_3 =30, + MFX_LEVEL_AVC_31 =31, + MFX_LEVEL_AVC_32 =32, + MFX_LEVEL_AVC_4 =40, + MFX_LEVEL_AVC_41 =41, + MFX_LEVEL_AVC_42 =42, + MFX_LEVEL_AVC_5 =50, + MFX_LEVEL_AVC_51 =51, + MFX_LEVEL_AVC_52 =52, +#if (MFX_VERSION >= MFX_VERSION_NEXT) + MFX_LEVEL_AVC_6 =60, + MFX_LEVEL_AVC_61 =61, + MFX_LEVEL_AVC_62 =62, +#endif + + /* MPEG-2 Profiles & Levels */ + MFX_PROFILE_MPEG2_SIMPLE =0x50, + MFX_PROFILE_MPEG2_MAIN =0x40, + MFX_PROFILE_MPEG2_HIGH =0x10, + + MFX_LEVEL_MPEG2_LOW =0xA, + MFX_LEVEL_MPEG2_MAIN =0x8, + MFX_LEVEL_MPEG2_HIGH =0x4, + MFX_LEVEL_MPEG2_HIGH1440 =0x6, + + /* VC1 Profiles & Levels */ + MFX_PROFILE_VC1_SIMPLE =(0+1), + MFX_PROFILE_VC1_MAIN =(4+1), + MFX_PROFILE_VC1_ADVANCED =(12+1), + + /* VC1 levels for simple & main profiles */ + MFX_LEVEL_VC1_LOW =(0+1), + MFX_LEVEL_VC1_MEDIAN =(2+1), + MFX_LEVEL_VC1_HIGH =(4+1), + + /* VC1 levels for the advanced profile */ + MFX_LEVEL_VC1_0 =(0x00+1), + MFX_LEVEL_VC1_1 =(0x01+1), + MFX_LEVEL_VC1_2 =(0x02+1), + MFX_LEVEL_VC1_3 =(0x03+1), + MFX_LEVEL_VC1_4 =(0x04+1), + + /* HEVC Profiles & Levels & Tiers */ + MFX_PROFILE_HEVC_MAIN =1, + MFX_PROFILE_HEVC_MAIN10 =2, + MFX_PROFILE_HEVC_MAINSP =3, + MFX_PROFILE_HEVC_REXT =4, +#if (MFX_VERSION >= 1032) + MFX_PROFILE_HEVC_SCC =9, +#endif + + MFX_LEVEL_HEVC_1 = 10, + MFX_LEVEL_HEVC_2 = 20, + MFX_LEVEL_HEVC_21 = 21, + MFX_LEVEL_HEVC_3 = 30, + MFX_LEVEL_HEVC_31 = 31, + MFX_LEVEL_HEVC_4 = 40, + MFX_LEVEL_HEVC_41 = 41, + MFX_LEVEL_HEVC_5 = 50, + MFX_LEVEL_HEVC_51 = 51, + MFX_LEVEL_HEVC_52 = 52, + MFX_LEVEL_HEVC_6 = 60, + MFX_LEVEL_HEVC_61 = 61, + MFX_LEVEL_HEVC_62 = 62, + + MFX_TIER_HEVC_MAIN = 0, + MFX_TIER_HEVC_HIGH = 0x100, + + /* VP9 Profiles */ + MFX_PROFILE_VP9_0 = 1, + MFX_PROFILE_VP9_1 = 2, + MFX_PROFILE_VP9_2 = 3, + MFX_PROFILE_VP9_3 = 4, + +#if (MFX_VERSION >= 1034) + /* AV1 Profiles */ + MFX_PROFILE_AV1_MAIN = 1, + MFX_PROFILE_AV1_HIGH = 2, + MFX_PROFILE_AV1_PRO = 3, + + MFX_LEVEL_AV1_2 = 20, + MFX_LEVEL_AV1_21 = 21, + MFX_LEVEL_AV1_22 = 22, + MFX_LEVEL_AV1_23 = 23, + MFX_LEVEL_AV1_3 = 30, + MFX_LEVEL_AV1_31 = 31, + MFX_LEVEL_AV1_32 = 32, + MFX_LEVEL_AV1_33 = 33, + MFX_LEVEL_AV1_4 = 40, + MFX_LEVEL_AV1_41 = 41, + MFX_LEVEL_AV1_42 = 42, + MFX_LEVEL_AV1_43 = 43, + MFX_LEVEL_AV1_5 = 50, + MFX_LEVEL_AV1_51 = 51, + MFX_LEVEL_AV1_52 = 52, + MFX_LEVEL_AV1_53 = 53, + MFX_LEVEL_AV1_6 = 60, + MFX_LEVEL_AV1_61 = 61, + MFX_LEVEL_AV1_62 = 62, + MFX_LEVEL_AV1_63 = 63, +#endif +}; + +/* GopOptFlag */ +enum { + MFX_GOP_CLOSED =1, + MFX_GOP_STRICT =2 +}; + +/* TargetUsages: from 1 to 7 inclusive */ +enum { + MFX_TARGETUSAGE_1 =1, + MFX_TARGETUSAGE_2 =2, + MFX_TARGETUSAGE_3 =3, + MFX_TARGETUSAGE_4 =4, + MFX_TARGETUSAGE_5 =5, + MFX_TARGETUSAGE_6 =6, + MFX_TARGETUSAGE_7 =7, + + MFX_TARGETUSAGE_UNKNOWN =0, + MFX_TARGETUSAGE_BEST_QUALITY =MFX_TARGETUSAGE_1, + MFX_TARGETUSAGE_BALANCED =MFX_TARGETUSAGE_4, + MFX_TARGETUSAGE_BEST_SPEED =MFX_TARGETUSAGE_7 +}; + +/* RateControlMethod */ +enum { + MFX_RATECONTROL_CBR =1, + MFX_RATECONTROL_VBR =2, + MFX_RATECONTROL_CQP =3, + MFX_RATECONTROL_AVBR =4, + MFX_RATECONTROL_RESERVED1 =5, + MFX_RATECONTROL_RESERVED2 =6, + MFX_RATECONTROL_RESERVED3 =100, + MFX_RATECONTROL_RESERVED4 =7, + MFX_RATECONTROL_LA =8, + MFX_RATECONTROL_ICQ =9, + MFX_RATECONTROL_VCM =10, + MFX_RATECONTROL_LA_ICQ =11, + MFX_RATECONTROL_LA_EXT =12, + MFX_RATECONTROL_LA_HRD =13, + MFX_RATECONTROL_QVBR =14, +}; + +/* Trellis control*/ +enum { + MFX_TRELLIS_UNKNOWN =0, + MFX_TRELLIS_OFF =0x01, + MFX_TRELLIS_I =0x02, + MFX_TRELLIS_P =0x04, + MFX_TRELLIS_B =0x08 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved1; + mfxU16 RateDistortionOpt; /* tri-state option */ + mfxU16 MECostType; + mfxU16 MESearchType; + mfxI16Pair MVSearchWindow; + mfxU16 EndOfSequence; /* tri-state option */ + mfxU16 FramePicture; /* tri-state option */ + + mfxU16 CAVLC; /* tri-state option */ + mfxU16 reserved2[2]; + mfxU16 RecoveryPointSEI; /* tri-state option */ + mfxU16 ViewOutput; /* tri-state option */ + mfxU16 NalHrdConformance; /* tri-state option */ + mfxU16 SingleSeiNalUnit; /* tri-state option */ + mfxU16 VuiVclHrdParameters; /* tri-state option */ + + mfxU16 RefPicListReordering; /* tri-state option */ + mfxU16 ResetRefList; /* tri-state option */ + mfxU16 RefPicMarkRep; /* tri-state option */ + mfxU16 FieldOutput; /* tri-state option */ + + mfxU16 IntraPredBlockSize; + mfxU16 InterPredBlockSize; + mfxU16 MVPrecision; + mfxU16 MaxDecFrameBuffering; + + mfxU16 AUDelimiter; /* tri-state option */ + mfxU16 EndOfStream; /* tri-state option */ + mfxU16 PicTimingSEI; /* tri-state option */ + mfxU16 VuiNalHrdParameters; /* tri-state option */ +} mfxExtCodingOption; +MFX_PACK_END() + +enum { + MFX_B_REF_UNKNOWN = 0, + MFX_B_REF_OFF = 1, + MFX_B_REF_PYRAMID = 2 +}; + +enum { + MFX_LOOKAHEAD_DS_UNKNOWN = 0, + MFX_LOOKAHEAD_DS_OFF = 1, + MFX_LOOKAHEAD_DS_2x = 2, + MFX_LOOKAHEAD_DS_4x = 3 +}; + +enum { + MFX_BPSEI_DEFAULT = 0x00, + MFX_BPSEI_IFRAME = 0x01 +}; + +enum { + MFX_SKIPFRAME_NO_SKIP = 0, + MFX_SKIPFRAME_INSERT_DUMMY = 1, + MFX_SKIPFRAME_INSERT_NOTHING = 2, + MFX_SKIPFRAME_BRC_ONLY = 3, +}; + +/* Intra refresh types */ +enum { + MFX_REFRESH_NO = 0, + MFX_REFRESH_VERTICAL = 1, + MFX_REFRESH_HORIZONTAL = 2, + MFX_REFRESH_SLICE = 3 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 IntRefType; + mfxU16 IntRefCycleSize; + mfxI16 IntRefQPDelta; + + mfxU32 MaxFrameSize; + mfxU32 MaxSliceSize; + + mfxU16 BitrateLimit; /* tri-state option */ + mfxU16 MBBRC; /* tri-state option */ + mfxU16 ExtBRC; /* tri-state option */ + mfxU16 LookAheadDepth; + mfxU16 Trellis; + mfxU16 RepeatPPS; /* tri-state option */ + mfxU16 BRefType; + mfxU16 AdaptiveI; /* tri-state option */ + mfxU16 AdaptiveB; /* tri-state option */ + mfxU16 LookAheadDS; + mfxU16 NumMbPerSlice; + mfxU16 SkipFrame; + mfxU8 MinQPI; /* 1..51, 0 = default */ + mfxU8 MaxQPI; /* 1..51, 0 = default */ + mfxU8 MinQPP; /* 1..51, 0 = default */ + mfxU8 MaxQPP; /* 1..51, 0 = default */ + mfxU8 MinQPB; /* 1..51, 0 = default */ + mfxU8 MaxQPB; /* 1..51, 0 = default */ + mfxU16 FixedFrameRate; /* tri-state option */ + mfxU16 DisableDeblockingIdc; + mfxU16 DisableVUI; + mfxU16 BufferingPeriodSEI; + mfxU16 EnableMAD; /* tri-state option */ + mfxU16 UseRawRef; /* tri-state option */ +} mfxExtCodingOption2; +MFX_PACK_END() + +/* WeightedPred */ +enum { + MFX_WEIGHTED_PRED_UNKNOWN = 0, + MFX_WEIGHTED_PRED_DEFAULT = 1, + MFX_WEIGHTED_PRED_EXPLICIT = 2, + MFX_WEIGHTED_PRED_IMPLICIT = 3 +}; + +/* ScenarioInfo */ +enum { + MFX_SCENARIO_UNKNOWN = 0, + MFX_SCENARIO_DISPLAY_REMOTING = 1, + MFX_SCENARIO_VIDEO_CONFERENCE = 2, + MFX_SCENARIO_ARCHIVE = 3, + MFX_SCENARIO_LIVE_STREAMING = 4, + MFX_SCENARIO_CAMERA_CAPTURE = 5, + MFX_SCENARIO_VIDEO_SURVEILLANCE = 6, + MFX_SCENARIO_GAME_STREAMING = 7, + MFX_SCENARIO_REMOTE_GAMING = 8 +}; + +/* ContentInfo */ +enum { + MFX_CONTENT_UNKNOWN = 0, + MFX_CONTENT_FULL_SCREEN_VIDEO = 1, + MFX_CONTENT_NON_VIDEO_SCREEN = 2 +}; + +/* PRefType */ +enum { + MFX_P_REF_DEFAULT = 0, + MFX_P_REF_SIMPLE = 1, + MFX_P_REF_PYRAMID = 2 +}; + +#if (MFX_VERSION >= MFX_VERSION_NEXT) + +/* QuantScaleType */ +enum { + MFX_MPEG2_QUANT_SCALE_TYPE_DEFAULT = 0, + MFX_MPEG2_QUANT_SCALE_TYPE_LINEAR = 1, /* q_scale_type = 0 */ + MFX_MPEG2_QUANT_SCALE_TYPE_NONLINEAR = 2 /* q_scale_type = 1 */ +}; + +/* IntraVLCFormat */ +enum { + MFX_MPEG2_INTRA_VLC_FORMAT_DEFAULT = 0, + MFX_MPEG2_INTRA_VLC_FORMAT_B14 = 1, /* use table B.14 */ + MFX_MPEG2_INTRA_VLC_FORMAT_B15 = 2 /* use table B.15 */ +}; + +/* ScanType */ +enum { + MFX_MPEG2_SCAN_TYPE_DEFAULT = 0, + MFX_MPEG2_SCAN_TYPE_ZIGZAG = 1, /* alternate_scan = 0 */ + MFX_MPEG2_SCAN_TYPE_ALTERNATE = 2 /* alternate_scan = 1 */ +}; + +#endif + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 NumSliceI; + mfxU16 NumSliceP; + mfxU16 NumSliceB; + + mfxU16 WinBRCMaxAvgKbps; + mfxU16 WinBRCSize; + + mfxU16 QVBRQuality; + mfxU16 EnableMBQP; + mfxU16 IntRefCycleDist; + mfxU16 DirectBiasAdjustment; /* tri-state option */ + mfxU16 GlobalMotionBiasAdjustment; /* tri-state option */ + mfxU16 MVCostScalingFactor; + mfxU16 MBDisableSkipMap; /* tri-state option */ + + mfxU16 WeightedPred; + mfxU16 WeightedBiPred; + + mfxU16 AspectRatioInfoPresent; /* tri-state option */ + mfxU16 OverscanInfoPresent; /* tri-state option */ + mfxU16 OverscanAppropriate; /* tri-state option */ + mfxU16 TimingInfoPresent; /* tri-state option */ + mfxU16 BitstreamRestriction; /* tri-state option */ + mfxU16 LowDelayHrd; /* tri-state option */ + mfxU16 MotionVectorsOverPicBoundaries; /* tri-state option */ +#if (MFX_VERSION >= MFX_VERSION_NEXT) + mfxU16 Log2MaxMvLengthHorizontal; /* 0..16 */ + mfxU16 Log2MaxMvLengthVertical; /* 0..16 */ +#else + mfxU16 reserved1[2]; +#endif + + mfxU16 ScenarioInfo; + mfxU16 ContentInfo; + + mfxU16 PRefType; + mfxU16 FadeDetection; /* tri-state option */ +#if (MFX_VERSION >= MFX_VERSION_NEXT) + mfxI16 DeblockingAlphaTcOffset; /* -12..12 (slice_alpha_c0_offset_div2 << 1) */ + mfxI16 DeblockingBetaOffset; /* -12..12 (slice_beta_offset_div2 << 1) */ +#else + mfxU16 reserved2[2]; +#endif + mfxU16 GPB; /* tri-state option */ + + mfxU32 MaxFrameSizeI; + mfxU32 MaxFrameSizeP; + mfxU32 reserved3[3]; + + mfxU16 EnableQPOffset; /* tri-state option */ + mfxI16 QPOffset[8]; /* FrameQP = QPX + QPOffset[pyramid_layer]; QPX = QPB for B-pyramid, QPP for P-pyramid */ + + mfxU16 NumRefActiveP[8]; + mfxU16 NumRefActiveBL0[8]; + mfxU16 NumRefActiveBL1[8]; + +#if (MFX_VERSION >= MFX_VERSION_NEXT) + mfxU16 ConstrainedIntraPredFlag; /* tri-state option */ +#else + mfxU16 reserved6; +#endif +#if (MFX_VERSION >= 1026) + mfxU16 TransformSkip; /* tri-state option; HEVC transform_skip_enabled_flag */ +#else + mfxU16 reserved7; +#endif +#if (MFX_VERSION >= 1027) + mfxU16 TargetChromaFormatPlus1; /* Minus 1 specifies target encoding chroma format (see ColorFormat enum). May differ from input one. */ + mfxU16 TargetBitDepthLuma; /* Target encoding bit depth for luma samples. May differ from input one. */ + mfxU16 TargetBitDepthChroma; /* Target encoding bit depth for chroma samples. May differ from input one. */ +#else + mfxU16 reserved4[3]; +#endif + mfxU16 BRCPanicMode; /* tri-state option */ + + mfxU16 LowDelayBRC; /* tri-state option */ + mfxU16 EnableMBForceIntra; /* tri-state option */ + mfxU16 AdaptiveMaxFrameSize; /* tri-state option */ + + mfxU16 RepartitionCheckEnable; /* tri-state option */ +#if (MFX_VERSION >= MFX_VERSION_NEXT) + mfxU16 QuantScaleType; /* For MPEG2 specifies mapping between quantiser_scale_code and quantiser_scale (see QuantScaleType enum) */ + mfxU16 IntraVLCFormat; /* For MPEG2 specifies which table shall be used for coding of DCT coefficients of intra macroblocks (see IntraVLCFormat enum) */ + mfxU16 ScanType; /* For MPEG2 specifies transform coefficients scan pattern (see ScanType enum) */ +#else + mfxU16 reserved5[3]; +#endif +#if (MFX_VERSION >= 1025) + mfxU16 EncodedUnitsInfo; /* tri-state option */ + mfxU16 EnableNalUnitType; /* tri-state option */ +#else + mfxU16 reserved8[2]; +#endif +#if (MFX_VERSION >= 1026) + mfxU16 ExtBrcAdaptiveLTR; /* tri-state option for ExtBRC */ +#else + mfxU16 reserved9; +#endif + mfxU16 reserved[163]; +} mfxExtCodingOption3; +MFX_PACK_END() + +/* IntraPredBlockSize/InterPredBlockSize */ +enum { + MFX_BLOCKSIZE_UNKNOWN = 0, + MFX_BLOCKSIZE_MIN_16X16 = 1, /* 16x16 */ + MFX_BLOCKSIZE_MIN_8X8 = 2, /* 16x16, 8x8 */ + MFX_BLOCKSIZE_MIN_4X4 = 3 /* 16x16, 8x8, 4x4 */ +}; + +/* MVPrecision */ +enum { + MFX_MVPRECISION_UNKNOWN = 0, + MFX_MVPRECISION_INTEGER = (1 << 0), + MFX_MVPRECISION_HALFPEL = (1 << 1), + MFX_MVPRECISION_QUARTERPEL = (1 << 2) +}; + +enum { + MFX_CODINGOPTION_UNKNOWN =0, + MFX_CODINGOPTION_ON =0x10, + MFX_CODINGOPTION_OFF =0x20, + MFX_CODINGOPTION_ADAPTIVE =0x30 +}; + +/* Data Flag for mfxBitstream*/ +enum { + MFX_BITSTREAM_COMPLETE_FRAME = 0x0001, /* the bitstream contains a complete frame or field pair of data */ + MFX_BITSTREAM_EOS = 0x0002 +}; +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_CODING_OPTION = MFX_MAKEFOURCC('C','D','O','P'), + MFX_EXTBUFF_CODING_OPTION_SPSPPS = MFX_MAKEFOURCC('C','O','S','P'), + MFX_EXTBUFF_VPP_DONOTUSE = MFX_MAKEFOURCC('N','U','S','E'), + MFX_EXTBUFF_VPP_AUXDATA = MFX_MAKEFOURCC('A','U','X','D'), + MFX_EXTBUFF_VPP_DENOISE = MFX_MAKEFOURCC('D','N','I','S'), + MFX_EXTBUFF_VPP_SCENE_ANALYSIS = MFX_MAKEFOURCC('S','C','L','Y'), + MFX_EXTBUFF_VPP_SCENE_CHANGE = MFX_EXTBUFF_VPP_SCENE_ANALYSIS, + MFX_EXTBUFF_VPP_PROCAMP = MFX_MAKEFOURCC('P','A','M','P'), + MFX_EXTBUFF_VPP_DETAIL = MFX_MAKEFOURCC('D','E','T',' '), + MFX_EXTBUFF_VIDEO_SIGNAL_INFO = MFX_MAKEFOURCC('V','S','I','N'), + MFX_EXTBUFF_VPP_DOUSE = MFX_MAKEFOURCC('D','U','S','E'), + MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION = MFX_MAKEFOURCC('O','P','Q','S'), + MFX_EXTBUFF_AVC_REFLIST_CTRL = MFX_MAKEFOURCC('R','L','S','T'), + MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION = MFX_MAKEFOURCC('F','R','C',' '), + MFX_EXTBUFF_PICTURE_TIMING_SEI = MFX_MAKEFOURCC('P','T','S','E'), + MFX_EXTBUFF_AVC_TEMPORAL_LAYERS = MFX_MAKEFOURCC('A','T','M','L'), + MFX_EXTBUFF_CODING_OPTION2 = MFX_MAKEFOURCC('C','D','O','2'), + MFX_EXTBUFF_VPP_IMAGE_STABILIZATION = MFX_MAKEFOURCC('I','S','T','B'), + MFX_EXTBUFF_VPP_PICSTRUCT_DETECTION = MFX_MAKEFOURCC('I','D','E','T'), + MFX_EXTBUFF_ENCODER_CAPABILITY = MFX_MAKEFOURCC('E','N','C','P'), + MFX_EXTBUFF_ENCODER_RESET_OPTION = MFX_MAKEFOURCC('E','N','R','O'), + MFX_EXTBUFF_ENCODED_FRAME_INFO = MFX_MAKEFOURCC('E','N','F','I'), + MFX_EXTBUFF_VPP_COMPOSITE = MFX_MAKEFOURCC('V','C','M','P'), + MFX_EXTBUFF_VPP_VIDEO_SIGNAL_INFO = MFX_MAKEFOURCC('V','V','S','I'), + MFX_EXTBUFF_ENCODER_ROI = MFX_MAKEFOURCC('E','R','O','I'), + MFX_EXTBUFF_VPP_DEINTERLACING = MFX_MAKEFOURCC('V','P','D','I'), + MFX_EXTBUFF_AVC_REFLISTS = MFX_MAKEFOURCC('R','L','T','S'), + MFX_EXTBUFF_DEC_VIDEO_PROCESSING = MFX_MAKEFOURCC('D','E','C','V'), + MFX_EXTBUFF_VPP_FIELD_PROCESSING = MFX_MAKEFOURCC('F','P','R','O'), + MFX_EXTBUFF_CODING_OPTION3 = MFX_MAKEFOURCC('C','D','O','3'), + MFX_EXTBUFF_CHROMA_LOC_INFO = MFX_MAKEFOURCC('C','L','I','N'), + MFX_EXTBUFF_MBQP = MFX_MAKEFOURCC('M','B','Q','P'), + MFX_EXTBUFF_MB_FORCE_INTRA = MFX_MAKEFOURCC('M','B','F','I'), + MFX_EXTBUFF_HEVC_TILES = MFX_MAKEFOURCC('2','6','5','T'), + MFX_EXTBUFF_MB_DISABLE_SKIP_MAP = MFX_MAKEFOURCC('M','D','S','M'), + MFX_EXTBUFF_HEVC_PARAM = MFX_MAKEFOURCC('2','6','5','P'), + MFX_EXTBUFF_DECODED_FRAME_INFO = MFX_MAKEFOURCC('D','E','F','I'), + MFX_EXTBUFF_TIME_CODE = MFX_MAKEFOURCC('T','M','C','D'), + MFX_EXTBUFF_HEVC_REGION = MFX_MAKEFOURCC('2','6','5','R'), + MFX_EXTBUFF_PRED_WEIGHT_TABLE = MFX_MAKEFOURCC('E','P','W','T'), + MFX_EXTBUFF_DIRTY_RECTANGLES = MFX_MAKEFOURCC('D','R','O','I'), + MFX_EXTBUFF_MOVING_RECTANGLES = MFX_MAKEFOURCC('M','R','O','I'), + MFX_EXTBUFF_CODING_OPTION_VPS = MFX_MAKEFOURCC('C','O','V','P'), + MFX_EXTBUFF_VPP_ROTATION = MFX_MAKEFOURCC('R','O','T',' '), + MFX_EXTBUFF_ENCODED_SLICES_INFO = MFX_MAKEFOURCC('E','N','S','I'), + MFX_EXTBUFF_VPP_SCALING = MFX_MAKEFOURCC('V','S','C','L'), + MFX_EXTBUFF_HEVC_REFLIST_CTRL = MFX_EXTBUFF_AVC_REFLIST_CTRL, + MFX_EXTBUFF_HEVC_REFLISTS = MFX_EXTBUFF_AVC_REFLISTS, + MFX_EXTBUFF_HEVC_TEMPORAL_LAYERS = MFX_EXTBUFF_AVC_TEMPORAL_LAYERS, + MFX_EXTBUFF_VPP_MIRRORING = MFX_MAKEFOURCC('M','I','R','R'), + MFX_EXTBUFF_MV_OVER_PIC_BOUNDARIES = MFX_MAKEFOURCC('M','V','P','B'), + MFX_EXTBUFF_VPP_COLORFILL = MFX_MAKEFOURCC('V','C','L','F'), +#if (MFX_VERSION >= 1025) + MFX_EXTBUFF_DECODE_ERROR_REPORT = MFX_MAKEFOURCC('D', 'E', 'R', 'R'), + MFX_EXTBUFF_VPP_COLOR_CONVERSION = MFX_MAKEFOURCC('V', 'C', 'S', 'C'), + MFX_EXTBUFF_CONTENT_LIGHT_LEVEL_INFO = MFX_MAKEFOURCC('L', 'L', 'I', 'S'), + MFX_EXTBUFF_MASTERING_DISPLAY_COLOUR_VOLUME = MFX_MAKEFOURCC('D', 'C', 'V', 'S'), + MFX_EXTBUFF_MULTI_FRAME_PARAM = MFX_MAKEFOURCC('M', 'F', 'R', 'P'), + MFX_EXTBUFF_MULTI_FRAME_CONTROL = MFX_MAKEFOURCC('M', 'F', 'R', 'C'), + MFX_EXTBUFF_ENCODED_UNITS_INFO = MFX_MAKEFOURCC('E', 'N', 'U', 'I'), +#endif +#if (MFX_VERSION >= 1026) + MFX_EXTBUFF_VPP_MCTF = MFX_MAKEFOURCC('M', 'C', 'T', 'F'), + MFX_EXTBUFF_VP9_SEGMENTATION = MFX_MAKEFOURCC('9', 'S', 'E', 'G'), + MFX_EXTBUFF_VP9_TEMPORAL_LAYERS = MFX_MAKEFOURCC('9', 'T', 'M', 'L'), + MFX_EXTBUFF_VP9_PARAM = MFX_MAKEFOURCC('9', 'P', 'A', 'R'), +#endif +#if (MFX_VERSION >= 1027) + MFX_EXTBUFF_AVC_ROUNDING_OFFSET = MFX_MAKEFOURCC('R','N','D','O'), +#endif +#if (MFX_VERSION >= MFX_VERSION_NEXT) + MFX_EXTBUFF_DPB = MFX_MAKEFOURCC('E','D','P','B'), + MFX_EXTBUFF_TEMPORAL_LAYERS = MFX_MAKEFOURCC('T','M','P','L'), + MFX_EXTBUFF_AVC_SCALING_MATRIX = MFX_MAKEFOURCC('A','V','S','M'), + MFX_EXTBUFF_MPEG2_QUANT_MATRIX = MFX_MAKEFOURCC('M','2','Q','M'), + MFX_EXTBUFF_TASK_DEPENDENCY = MFX_MAKEFOURCC('S','Y','N','C'), +#endif +#if (MFX_VERSION >= 1031) + MFX_EXTBUFF_PARTIAL_BITSTREAM_PARAM = MFX_MAKEFOURCC('P','B','O','P'), +#endif + MFX_EXTBUFF_ENCODER_IPCM_AREA = MFX_MAKEFOURCC('P', 'C', 'M', 'R'), + MFX_EXTBUFF_INSERT_HEADERS = MFX_MAKEFOURCC('S', 'P', 'R', 'E'), +#if (MFX_VERSION >= 1034) + MFX_EXTBUFF_AV1_FILM_GRAIN_PARAM = MFX_MAKEFOURCC('A','1','F','G'), + MFX_EXTBUFF_AV1_LST_PARAM = MFX_MAKEFOURCC('A', '1', 'L', 'S'), + MFX_EXTBUFF_AV1_SEGMENTATION = MFX_MAKEFOURCC('1', 'S', 'E', 'G'), + MFX_EXTBUFF_AV1_PARAM = MFX_MAKEFOURCC('1', 'P', 'A', 'R'), + MFX_EXTBUFF_AV1_AUXDATA = MFX_MAKEFOURCC('1', 'A', 'U', 'X'), + MFX_EXTBUFF_AV1_TEMPORAL_LAYERS = MFX_MAKEFOURCC('1', 'T', 'M', 'L') +#endif +}; + +/* VPP Conf: Do not use certain algorithms */ +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 NumAlg; + mfxU32* AlgList; +} mfxExtVPPDoNotUse; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 DenoiseFactor; +} mfxExtVPPDenoise; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 DetailFactor; +} mfxExtVPPDetail; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + mfxF64 Brightness; + mfxF64 Contrast; + mfxF64 Hue; + mfxF64 Saturation; +} mfxExtVPPProcAmp; +MFX_PACK_END() + +/* statistics collected for decode, encode and vpp */ +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU64 NumBit; + mfxU32 NumCachedFrame; +} mfxEncodeStat; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU32 NumSkippedFrame; + mfxU32 NumError; + mfxU32 NumCachedFrame; +} mfxDecodeStat; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU32 reserved[16]; + mfxU32 NumFrame; + mfxU32 NumCachedFrame; +} mfxVPPStat; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + union{ + struct{ + mfxU32 SpatialComplexity; + mfxU32 TemporalComplexity; + }; + struct{ + mfxU16 PicStruct; + mfxU16 reserved[3]; + }; + }; + mfxU16 SceneChangeRate; + mfxU16 RepeatedFrame; +} mfxExtVppAuxData; +MFX_PACK_END() + +/* CtrlFlags */ +enum { + MFX_PAYLOAD_CTRL_SUFFIX = 0x00000001 /* HEVC suffix SEI */ +}; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxU32 CtrlFlags; + mfxU32 reserved[3]; + mfxU8 *Data; /* buffer pointer */ + mfxU32 NumBit; /* number of bits */ + mfxU16 Type; /* SEI message type in H.264 or user data start_code in MPEG-2 */ + mfxU16 BufSize; /* payload buffer size in bytes */ +} mfxPayload; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; +#if (MFX_VERSION >= 1025) + mfxU32 reserved[4]; + mfxU16 reserved1; + mfxU16 MfxNalUnitType; +#else + mfxU32 reserved[5]; +#endif + mfxU16 SkipFrame; + + mfxU16 QP; /* per frame QP */ + + mfxU16 FrameType; + mfxU16 NumExtParam; + mfxU16 NumPayload; /* MPEG-2 user data or H.264 SEI message(s) */ + mfxU16 reserved2; + + mfxExtBuffer **ExtParam; + mfxPayload **Payload; /* for field pair, first field uses even payloads and second field uses odd payloads */ +} mfxEncodeCtrl; +MFX_PACK_END() + +/* Buffer Memory Types */ +enum { + /* Buffer types */ + MFX_MEMTYPE_PERSISTENT_MEMORY =0x0002 +}; + +/* Frame Memory Types */ +#define MFX_MEMTYPE_BASE(x) (0x90ff & (x)) + +enum { + MFX_MEMTYPE_DXVA2_DECODER_TARGET =0x0010, + MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET =0x0020, + MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET = MFX_MEMTYPE_DXVA2_DECODER_TARGET, + MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET = MFX_MEMTYPE_DXVA2_PROCESSOR_TARGET, + MFX_MEMTYPE_SYSTEM_MEMORY =0x0040, + MFX_MEMTYPE_RESERVED1 =0x0080, + + MFX_MEMTYPE_FROM_ENCODE = 0x0100, + MFX_MEMTYPE_FROM_DECODE = 0x0200, + MFX_MEMTYPE_FROM_VPPIN = 0x0400, + MFX_MEMTYPE_FROM_VPPOUT = 0x0800, + MFX_MEMTYPE_FROM_ENC = 0x2000, + MFX_MEMTYPE_FROM_PAK = 0x4000, //reserved + + MFX_MEMTYPE_INTERNAL_FRAME = 0x0001, + MFX_MEMTYPE_EXTERNAL_FRAME = 0x0002, + MFX_MEMTYPE_OPAQUE_FRAME = 0x0004, + MFX_MEMTYPE_EXPORT_FRAME = 0x0008, + MFX_MEMTYPE_SHARED_RESOURCE = MFX_MEMTYPE_EXPORT_FRAME, +#if (MFX_VERSION >= 1025) + MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET = 0x1000 +#else + MFX_MEMTYPE_RESERVED2 = 0x1000 +#endif +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + union { + mfxU32 AllocId; + mfxU32 reserved[1]; + }; + mfxU32 reserved3[3]; + mfxFrameInfo Info; + mfxU16 Type; /* decoder or processor render targets */ + mfxU16 NumFrameMin; + mfxU16 NumFrameSuggested; + mfxU16 reserved2; +} mfxFrameAllocRequest; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxU32 AllocId; + mfxU32 reserved[3]; + mfxMemId *mids; /* the array allocated by application */ + mfxU16 NumFrameActual; +#if (MFX_VERSION >= MFX_VERSION_NEXT) + mfxU16 MemType; +#else + mfxU16 reserved2; +#endif +} mfxFrameAllocResponse; +MFX_PACK_END() + +/* FrameType */ +enum { + MFX_FRAMETYPE_UNKNOWN =0x0000, + + MFX_FRAMETYPE_I =0x0001, + MFX_FRAMETYPE_P =0x0002, + MFX_FRAMETYPE_B =0x0004, + MFX_FRAMETYPE_S =0x0008, + + MFX_FRAMETYPE_REF =0x0040, + MFX_FRAMETYPE_IDR =0x0080, + + MFX_FRAMETYPE_xI =0x0100, + MFX_FRAMETYPE_xP =0x0200, + MFX_FRAMETYPE_xB =0x0400, + MFX_FRAMETYPE_xS =0x0800, + + MFX_FRAMETYPE_xREF =0x4000, + MFX_FRAMETYPE_xIDR =0x8000 +}; + +#if (MFX_VERSION >= 1025) +enum { + MFX_HEVC_NALU_TYPE_UNKNOWN = 0, + MFX_HEVC_NALU_TYPE_TRAIL_N = ( 0+1), + MFX_HEVC_NALU_TYPE_TRAIL_R = ( 1+1), + MFX_HEVC_NALU_TYPE_RADL_N = ( 6+1), + MFX_HEVC_NALU_TYPE_RADL_R = ( 7+1), + MFX_HEVC_NALU_TYPE_RASL_N = ( 8+1), + MFX_HEVC_NALU_TYPE_RASL_R = ( 9+1), + MFX_HEVC_NALU_TYPE_IDR_W_RADL = (19+1), + MFX_HEVC_NALU_TYPE_IDR_N_LP = (20+1), + MFX_HEVC_NALU_TYPE_CRA_NUT = (21+1) +}; +#endif + +typedef enum { + MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9 =1, /* IDirect3DDeviceManager9 */ + MFX_HANDLE_D3D9_DEVICE_MANAGER = MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9, + MFX_HANDLE_RESERVED1 = 2, + MFX_HANDLE_D3D11_DEVICE = 3, + MFX_HANDLE_VA_DISPLAY = 4, + MFX_HANDLE_RESERVED3 = 5, +#if (MFX_VERSION >= 1030) + MFX_HANDLE_VA_CONFIG_ID = 6, + MFX_HANDLE_VA_CONTEXT_ID = 7, +#endif +#if (MFX_VERSION >= MFX_VERSION_NEXT) + MFX_HANDLE_CM_DEVICE = 8 +#endif +} mfxHandleType; + +typedef enum { + MFX_SKIPMODE_NOSKIP=0, + MFX_SKIPMODE_MORE=1, + MFX_SKIPMODE_LESS=2 +} mfxSkipMode; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU8 *SPSBuffer; + mfxU8 *PPSBuffer; + mfxU16 SPSBufSize; + mfxU16 PPSBufSize; + mfxU16 SPSId; + mfxU16 PPSId; +} mfxExtCodingOptionSPSPPS; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + + union { + mfxU8 *VPSBuffer; + mfxU64 reserved1; + }; + mfxU16 VPSBufSize; + mfxU16 VPSId; + + mfxU16 reserved[6]; +} mfxExtCodingOptionVPS; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 VideoFormat; + mfxU16 VideoFullRange; + mfxU16 ColourDescriptionPresent; + mfxU16 ColourPrimaries; + mfxU16 TransferCharacteristics; + mfxU16 MatrixCoefficients; +} mfxExtVideoSignalInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 NumAlg; + mfxU32 *AlgList; +} mfxExtVPPDoUse; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[2]; + struct { + mfxFrameSurface1 **Surfaces; + mfxU32 reserved2[5]; + mfxU16 Type; + mfxU16 NumSurface; + } In, Out; +} mfxExtOpaqueSurfaceAlloc; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 NumRefIdxL0Active; + mfxU16 NumRefIdxL1Active; + + struct { + mfxU32 FrameOrder; + mfxU16 PicStruct; + mfxU16 ViewId; + mfxU16 LongTermIdx; + mfxU16 reserved[3]; + } PreferredRefList[32], RejectedRefList[16], LongTermRefList[16]; + + mfxU16 ApplyLongTermIdx; + mfxU16 reserved[15]; +} mfxExtAVCRefListCtrl; +MFX_PACK_END() + +enum { + MFX_FRCALGM_PRESERVE_TIMESTAMP = 0x0001, + MFX_FRCALGM_DISTRIBUTED_TIMESTAMP = 0x0002, + MFX_FRCALGM_FRAME_INTERPOLATION = 0x0004 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 Algorithm; + mfxU16 reserved; + mfxU32 reserved2[15]; +} mfxExtVPPFrameRateConversion; +MFX_PACK_END() + +enum { + MFX_IMAGESTAB_MODE_UPSCALE = 0x0001, + MFX_IMAGESTAB_MODE_BOXING = 0x0002 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 Mode; + mfxU16 reserved[11]; +} mfxExtVPPImageStab; +MFX_PACK_END() + +#if (MFX_VERSION >= 1025) + +enum { + MFX_PAYLOAD_OFF = 0, + MFX_PAYLOAD_IDR = 1 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 reserved[15]; + + mfxU16 InsertPayloadToggle; + mfxU16 DisplayPrimariesX[3]; + mfxU16 DisplayPrimariesY[3]; + mfxU16 WhitePointX; + mfxU16 WhitePointY; + mfxU32 MaxDisplayMasteringLuminance; + mfxU32 MinDisplayMasteringLuminance; +} mfxExtMasteringDisplayColourVolume; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 reserved[9]; + + mfxU16 InsertPayloadToggle; + mfxU16 MaxContentLightLevel; + mfxU16 MaxPicAverageLightLevel; +} mfxExtContentLightLevelInfo; +MFX_PACK_END() +#endif + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved[14]; + + struct { + mfxU16 ClockTimestampFlag; + mfxU16 CtType; + mfxU16 NuitFieldBasedFlag; + mfxU16 CountingType; + mfxU16 FullTimestampFlag; + mfxU16 DiscontinuityFlag; + mfxU16 CntDroppedFlag; + mfxU16 NFrames; + mfxU16 SecondsFlag; + mfxU16 MinutesFlag; + mfxU16 HoursFlag; + mfxU16 SecondsValue; + mfxU16 MinutesValue; + mfxU16 HoursValue; + mfxU32 TimeOffset; + } TimeStamp[3]; +} mfxExtPictureTimingSEI; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU32 reserved1[4]; + mfxU16 reserved2; + mfxU16 BaseLayerPID; + + struct { + mfxU16 Scale; + mfxU16 reserved[3]; + }Layer[8]; +} mfxExtAvcTemporalLayers; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU32 MBPerSec; + mfxU16 reserved[58]; +} mfxExtEncoderCapability; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 StartNewSequence; + mfxU16 reserved[11]; +} mfxExtEncoderResetOption; +MFX_PACK_END() + +/*LongTermIdx*/ +enum { + MFX_LONGTERM_IDX_NO_IDX = 0xFFFF +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU32 FrameOrder; + mfxU16 PicStruct; + mfxU16 LongTermIdx; + mfxU32 MAD; + mfxU16 BRCPanicMode; + mfxU16 QP; + mfxU32 SecondFieldOffset; + mfxU16 reserved[2]; + + struct { + mfxU32 FrameOrder; + mfxU16 PicStruct; + mfxU16 LongTermIdx; + mfxU16 reserved[4]; + } UsedRefListL0[32], UsedRefListL1[32]; +} mfxExtAVCEncodedFrameInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct mfxVPPCompInputStream { + mfxU32 DstX; + mfxU32 DstY; + mfxU32 DstW; + mfxU32 DstH; + + mfxU16 LumaKeyEnable; + mfxU16 LumaKeyMin; + mfxU16 LumaKeyMax; + + mfxU16 GlobalAlphaEnable; + mfxU16 GlobalAlpha; + mfxU16 PixelAlphaEnable; + + mfxU16 TileId; + + mfxU16 reserved2[17]; +} mfxVPPCompInputStream; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; + + /* background color*/ + union { + mfxU16 Y; + mfxU16 R; + }; + union { + mfxU16 U; + mfxU16 G; + }; + union { + mfxU16 V; + mfxU16 B; + }; + mfxU16 NumTiles; + mfxU16 reserved1[23]; + + mfxU16 NumInputStream; + mfxVPPCompInputStream *InputStream; +} mfxExtVPPComposite; +MFX_PACK_END() + +/* TransferMatrix */ +enum { + MFX_TRANSFERMATRIX_UNKNOWN = 0, + MFX_TRANSFERMATRIX_BT709 = 1, + MFX_TRANSFERMATRIX_BT601 = 2 +}; + +/* NominalRange */ +enum { + MFX_NOMINALRANGE_UNKNOWN = 0, + MFX_NOMINALRANGE_0_255 = 1, + MFX_NOMINALRANGE_16_235 = 2 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 reserved1[4]; + + union { + struct { // Init + struct { + mfxU16 TransferMatrix; + mfxU16 NominalRange; + mfxU16 reserved2[6]; + } In, Out; + }; + struct { // Runtime + mfxU16 TransferMatrix; + mfxU16 NominalRange; + mfxU16 reserved3[14]; + }; + }; +} mfxExtVPPVideoSignalInfo; +MFX_PACK_END() + +/* ROI encoding mode */ +enum { + MFX_ROI_MODE_PRIORITY = 0, + MFX_ROI_MODE_QP_DELTA = 1, + MFX_ROI_MODE_QP_VALUE = 2 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 NumROI; + mfxU16 ROIMode; + mfxU16 reserved1[10]; + + struct { + mfxU32 Left; + mfxU32 Top; + mfxU32 Right; + mfxU32 Bottom; + union { + mfxI16 Priority; + mfxI16 DeltaQP; + }; + mfxU16 reserved2[7]; + } ROI[256]; +} mfxExtEncoderROI; +MFX_PACK_END() + +/*Deinterlacing Mode*/ +enum { + MFX_DEINTERLACING_BOB = 1, + MFX_DEINTERLACING_ADVANCED = 2, + MFX_DEINTERLACING_AUTO_DOUBLE = 3, + MFX_DEINTERLACING_AUTO_SINGLE = 4, + MFX_DEINTERLACING_FULL_FR_OUT = 5, + MFX_DEINTERLACING_HALF_FR_OUT = 6, + MFX_DEINTERLACING_24FPS_OUT = 7, + MFX_DEINTERLACING_FIXED_TELECINE_PATTERN = 8, + MFX_DEINTERLACING_30FPS_OUT = 9, + MFX_DEINTERLACING_DETECT_INTERLACE = 10, + MFX_DEINTERLACING_ADVANCED_NOREF = 11, + MFX_DEINTERLACING_ADVANCED_SCD = 12, + MFX_DEINTERLACING_FIELD_WEAVING = 13 +}; + +/*TelecinePattern*/ +enum { + MFX_TELECINE_PATTERN_32 = 0, + MFX_TELECINE_PATTERN_2332 = 1, + MFX_TELECINE_PATTERN_FRAME_REPEAT = 2, + MFX_TELECINE_PATTERN_41 = 3, + MFX_TELECINE_POSITION_PROVIDED = 4 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 Mode; + mfxU16 TelecinePattern; + mfxU16 TelecineLocation; + mfxU16 reserved[9]; +} mfxExtVPPDeinterlacing; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 NumRefIdxL0Active; + mfxU16 NumRefIdxL1Active; + mfxU16 reserved[2]; + + struct mfxRefPic{ + mfxU32 FrameOrder; + mfxU16 PicStruct; + mfxU16 reserved[5]; + } RefPicList0[32], RefPicList1[32]; + +}mfxExtAVCRefLists; +MFX_PACK_END() + +enum { + MFX_VPP_COPY_FRAME =0x01, + MFX_VPP_COPY_FIELD =0x02, + MFX_VPP_SWAP_FIELDS =0x03 +}; + +/*PicType*/ +enum { + MFX_PICTYPE_UNKNOWN =0x00, + MFX_PICTYPE_FRAME =0x01, + MFX_PICTYPE_TOPFIELD =0x02, + MFX_PICTYPE_BOTTOMFIELD =0x04 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 Mode; + mfxU16 InField; + mfxU16 OutField; + mfxU16 reserved[25]; +} mfxExtVPPFieldProcessing; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + struct mfxIn{ + mfxU16 CropX; + mfxU16 CropY; + mfxU16 CropW; + mfxU16 CropH; + mfxU16 reserved[12]; + }In; + + struct mfxOut{ + mfxU32 FourCC; + mfxU16 ChromaFormat; + mfxU16 reserved1; + + mfxU16 Width; + mfxU16 Height; + + mfxU16 CropX; + mfxU16 CropY; + mfxU16 CropW; + mfxU16 CropH; + mfxU16 reserved[22]; + }Out; + + mfxU16 reserved[13]; +} mfxExtDecVideoProcessing; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 ChromaLocInfoPresentFlag; + mfxU16 ChromaSampleLocTypeTopField; + mfxU16 ChromaSampleLocTypeBottomField; + mfxU16 reserved[9]; +} mfxExtChromaLocInfo; +MFX_PACK_END() + +/* MBQPMode */ +enum { + MFX_MBQP_MODE_QP_VALUE = 0, // supported in CQP mode only + MFX_MBQP_MODE_QP_DELTA = 1, + MFX_MBQP_MODE_QP_ADAPTIVE = 2 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct{ + union { + mfxU8 QP; + mfxI8 DeltaQP; + }; + mfxU16 Mode; +} mfxQPandMode; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + + mfxU32 reserved[10]; + mfxU16 Mode; // see MBQPMode enum + mfxU16 BlockSize; // QP block size, valid for HEVC only during Init and Runtime + mfxU32 NumQPAlloc; // Size of allocated by application QP or DeltaQP array + union { + mfxU8 *QP; // Block QP value. Valid when Mode = MFX_MBQP_MODE_QP_VALUE + mfxI8 *DeltaQP; // For block i: QP[i] = BrcQP[i] + DeltaQP[i]. Valid when Mode = MFX_MBQP_MODE_QP_DELTA +#if (MFX_VERSION >= 1034) + mfxQPandMode *QPmode; // Block-granularity modes when MFX_MBQP_MODE_QP_ADAPTIVE is set +#endif + mfxU64 reserved2; + }; +} mfxExtMBQP; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; /* Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_INSERT_HEADERS. */ + mfxU16 SPS; /* tri-state option to insert SPS */ + mfxU16 PPS; /* tri-state option to insert PPS */ + mfxU16 reserved[8]; +} mfxExtInsertHeaders; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxExtBuffer Header; /* Extension buffer header. Header.BufferId must be equal to MFX_EXTBUFF_ENCODER_IPCM_AREA. */ + mfxU16 reserve1[10]; + + mfxU16 NumArea; /* Number of Area's */ + struct area { + mfxU32 Left; /* Left Area's coordinate. */ + mfxU32 Top; /* Top Area's coordinate. */ + mfxU32 Right; /* Right Area's coordinate. */ + mfxU32 Bottom; /* Bottom Area's coordinate. */ + + mfxU16 reserved2[8]; + } * Areas; /* Array of areas. */ +} mfxExtEncoderIPCMArea; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + + mfxU32 reserved[11]; + mfxU32 MapSize; + union { + mfxU8 *Map; + mfxU64 reserved2; + }; +} mfxExtMBForceIntra; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 NumTileRows; + mfxU16 NumTileColumns; + mfxU16 reserved[74]; +}mfxExtHEVCTiles; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + + mfxU32 reserved[11]; + mfxU32 MapSize; + union { + mfxU8 *Map; + mfxU64 reserved2; + }; +} mfxExtMBDisableSkipMap; +MFX_PACK_END() + +#if (MFX_VERSION >= MFX_VERSION_NEXT) +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 DPBSize; + mfxU16 reserved[11]; + + struct { + mfxU32 FrameOrder; + mfxU16 PicType; + mfxU16 LongTermIdx; + mfxU16 reserved[4]; + } DPB[32]; +} mfxExtDPB; +MFX_PACK_END() + +#endif + +/*GeneralConstraintFlags*/ +enum { + /* REXT Profile constraint flags*/ + MFX_HEVC_CONSTR_REXT_MAX_12BIT = (1 << 0), + MFX_HEVC_CONSTR_REXT_MAX_10BIT = (1 << 1), + MFX_HEVC_CONSTR_REXT_MAX_8BIT = (1 << 2), + MFX_HEVC_CONSTR_REXT_MAX_422CHROMA = (1 << 3), + MFX_HEVC_CONSTR_REXT_MAX_420CHROMA = (1 << 4), + MFX_HEVC_CONSTR_REXT_MAX_MONOCHROME = (1 << 5), + MFX_HEVC_CONSTR_REXT_INTRA = (1 << 6), + MFX_HEVC_CONSTR_REXT_ONE_PICTURE_ONLY = (1 << 7), + MFX_HEVC_CONSTR_REXT_LOWER_BIT_RATE = (1 << 8) +}; + +#if (MFX_VERSION >= 1026) + +/* SampleAdaptiveOffset */ +enum { + MFX_SAO_UNKNOWN = 0x00, + MFX_SAO_DISABLE = 0x01, + MFX_SAO_ENABLE_LUMA = 0x02, + MFX_SAO_ENABLE_CHROMA = 0x04 +}; + +#endif + +/* This struct has 4-byte alignment for binary compatibility with previously released versions of API */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 PicWidthInLumaSamples; + mfxU16 PicHeightInLumaSamples; + mfxU64 GeneralConstraintFlags; +#if (MFX_VERSION >= 1026) + mfxU16 SampleAdaptiveOffset; /* see enum SampleAdaptiveOffset, valid during Init and Runtime */ + mfxU16 LCUSize; + mfxU16 reserved[116]; +#else + mfxU16 reserved[118]; +#endif +} mfxExtHEVCParam; +MFX_PACK_END() + +#if (MFX_VERSION >= 1025) +/*ErrorTypes in mfxExtDecodeErrorReport*/ +enum { + MFX_ERROR_PPS = (1 << 0), + MFX_ERROR_SPS = (1 << 1), + MFX_ERROR_SLICEHEADER = (1 << 2), + MFX_ERROR_SLICEDATA = (1 << 3), + MFX_ERROR_FRAME_GAP = (1 << 4), +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU32 ErrorTypes; + mfxU16 reserved[10]; +} mfxExtDecodeErrorReport; +MFX_PACK_END() + +#endif + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 FrameType; + mfxU16 reserved[59]; +} mfxExtDecodedFrameInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 DropFrameFlag; + mfxU16 TimeCodeHours; + mfxU16 TimeCodeMinutes; + mfxU16 TimeCodeSeconds; + mfxU16 TimeCodePictures; + mfxU16 reserved[7]; +} mfxExtTimeCode; +MFX_PACK_END() + +/*RegionType*/ +enum { + MFX_HEVC_REGION_SLICE = 0 +}; + +/*RegionEncoding*/ +enum { + MFX_HEVC_REGION_ENCODING_ON = 0, + MFX_HEVC_REGION_ENCODING_OFF = 1 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU32 RegionId; + mfxU16 RegionType; + mfxU16 RegionEncoding; + mfxU16 reserved[24]; +} mfxExtHEVCRegion; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 LumaLog2WeightDenom; // 0..7 + mfxU16 ChromaLog2WeightDenom; // 0..7 + mfxU16 LumaWeightFlag[2][32]; // [list] 0,1 + mfxU16 ChromaWeightFlag[2][32]; // [list] 0,1 + mfxI16 Weights[2][32][3][2]; // [list][list entry][Y, Cb, Cr][weight, offset] + mfxU16 reserved[58]; +} mfxExtPredWeightTable; +MFX_PACK_END() + +#if (MFX_VERSION >= 1027) +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 EnableRoundingIntra; // tri-state option + mfxU16 RoundingOffsetIntra; // valid value [0,7] + mfxU16 EnableRoundingInter; // tri-state option + mfxU16 RoundingOffsetInter; // valid value [0,7] + + mfxU16 reserved[24]; +} mfxExtAVCRoundingOffset; +MFX_PACK_END() +#endif + +#if (MFX_VERSION >= MFX_VERSION_NEXT) +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved[12]; + + struct { + mfxU16 Scale; + mfxU16 QPI; + mfxU16 QPP; + mfxU16 QPB; + mfxU32 TargetKbps; + mfxU32 MaxKbps; + mfxU32 BufferSizeInKB; + mfxU32 InitialDelayInKB; + mfxU16 reserved1[20]; + } Layer[8]; +} mfxExtTemporalLayers; +MFX_PACK_END() + +#endif + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 NumRect; + mfxU16 reserved1[11]; + + struct { + mfxU32 Left; + mfxU32 Top; + mfxU32 Right; + mfxU32 Bottom; + + mfxU16 reserved2[8]; + } Rect[256]; +} mfxExtDirtyRect; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 NumRect; + mfxU16 reserved1[11]; + + struct { + mfxU32 DestLeft; + mfxU32 DestTop; + mfxU32 DestRight; + mfxU32 DestBottom; + + mfxU32 SourceLeft; + mfxU32 SourceTop; + mfxU16 reserved2[4]; + } Rect[256]; +} mfxExtMoveRect; +MFX_PACK_END() + +#if (MFX_VERSION >= MFX_VERSION_NEXT) + +/* ScalingMatrixType */ +enum { + MFX_SCALING_MATRIX_SPS = 1, + MFX_SCALING_MATRIX_PPS = 2 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 Type; + mfxU16 reserved[5]; + + /* [4x4_Intra_Y, 4x4_Intra_Cb, 4x4_Intra_Cr, + 4x4_Inter_Y, 4x4_Inter_Cb, 4x4_Inter_Cr, + 8x8_Intra_Y, 8x8_Inter_Y, 8x8_Intra_Cb, + 8x8_Inter_Cb, 8x8_Intra_Cr, 8x8_Inter_Cr] */ + mfxU8 ScalingListPresent[12]; + + /* [Intra_Y, Intra_Cb, Intra_Cr, + Inter_Y, Inter_Cb, Inter_Cr] */ + mfxU8 ScalingList4x4[6][16]; + + /* [Intra_Y, Inter_Y, Intra_Cb, + Inter_Cb, Intra_Cr, Inter_Cr] */ + mfxU8 ScalingList8x8[6][64]; +} mfxExtAVCScalingMatrix; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 reserved[28]; + + mfxU8 LoadMatrix[4]; // [LumaIntra, LumaInter, ChromaIntra, ChromaInter] + mfxU8 Matrix[4][64]; // [LumaIntra, LumaInter, ChromaIntra, ChromaInter] +} mfxExtMPEG2QuantMatrix; +MFX_PACK_END() + +#endif + +/* Angle */ +enum { + MFX_ANGLE_0 = 0, + MFX_ANGLE_90 = 90, + MFX_ANGLE_180 = 180, + MFX_ANGLE_270 = 270 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 Angle; + mfxU16 reserved[11]; +} mfxExtVPPRotation; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + + mfxU16 SliceSizeOverflow; + mfxU16 NumSliceNonCopliant; + mfxU16 NumEncodedSlice; + mfxU16 NumSliceSizeAlloc; + union { + mfxU16 *SliceSize; + mfxU64 reserved1; + }; + + mfxU16 reserved[20]; +} mfxExtEncodedSlicesInfo; +MFX_PACK_END() + +/* ScalingMode */ +enum { + MFX_SCALING_MODE_DEFAULT = 0, + MFX_SCALING_MODE_LOWPOWER = 1, + MFX_SCALING_MODE_QUALITY = 2 +}; + +#if (MFX_VERSION >= 1033) +/* Interpolation Method */ +enum { + MFX_INTERPOLATION_DEFAULT = 0, + MFX_INTERPOLATION_NEAREST_NEIGHBOR = 1, + MFX_INTERPOLATION_BILINEAR = 2, + MFX_INTERPOLATION_ADVANCED = 3 +}; +#endif + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 ScalingMode; +#if (MFX_VERSION >= 1033) + mfxU16 InterpolationMethod; + mfxU16 reserved[10]; +#else + mfxU16 reserved[11]; +#endif +} mfxExtVPPScaling; +MFX_PACK_END() + +#if (MFX_VERSION >= MFX_VERSION_NEXT) + +/* SceneChangeType */ +enum { + MFX_SCENE_NO_CHANGE = 0, + MFX_SCENE_START = 1, + MFX_SCENE_END = 2 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 Type; + mfxU16 reserved[11]; +} mfxExtSceneChange; +MFX_PACK_END() + +#endif + +typedef mfxExtAVCRefListCtrl mfxExtHEVCRefListCtrl; +typedef mfxExtAVCRefLists mfxExtHEVCRefLists; +typedef mfxExtAvcTemporalLayers mfxExtHEVCTemporalLayers; + +/* MirroringType */ +enum +{ + MFX_MIRRORING_DISABLED = 0, + MFX_MIRRORING_HORIZONTAL = 1, + MFX_MIRRORING_VERTICAL = 2 +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 Type; + mfxU16 reserved[11]; +} mfxExtVPPMirroring; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 StickTop; /* tri-state option */ + mfxU16 StickBottom; /* tri-state option */ + mfxU16 StickLeft; /* tri-state option */ + mfxU16 StickRight; /* tri-state option */ + mfxU16 reserved[8]; +} mfxExtMVOverPicBoundaries; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 Enable; /* tri-state option */ + mfxU16 reserved[11]; +} mfxExtVPPColorFill; +MFX_PACK_END() + +#if (MFX_VERSION >= 1025) + +/* ChromaSiting */ +enum { + MFX_CHROMA_SITING_UNKNOWN = 0x0000, + MFX_CHROMA_SITING_VERTICAL_TOP = 0x0001, /* Chroma samples are co-sited vertically on the top with the luma samples. */ + MFX_CHROMA_SITING_VERTICAL_CENTER = 0x0002, /* Chroma samples are not co-sited vertically with the luma samples. */ + MFX_CHROMA_SITING_VERTICAL_BOTTOM = 0x0004, /* Chroma samples are co-sited vertically on the bottom with the luma samples. */ + MFX_CHROMA_SITING_HORIZONTAL_LEFT = 0x0010, /* Chroma samples are co-sited horizontally on the left with the luma samples. */ + MFX_CHROMA_SITING_HORIZONTAL_CENTER = 0x0020 /* Chroma samples are not co-sited horizontally with the luma samples. */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 ChromaSiting; + mfxU16 reserved[27]; +} mfxExtColorConversion; +MFX_PACK_END() + +#endif + +#if (MFX_VERSION >= 1026) +/* VP9ReferenceFrame */ +enum { + MFX_VP9_REF_INTRA = 0, + MFX_VP9_REF_LAST = 1, + MFX_VP9_REF_GOLDEN = 2, + MFX_VP9_REF_ALTREF = 3 +}; + +/* SegmentIdBlockSize */ +enum { + MFX_VP9_SEGMENT_ID_BLOCK_SIZE_UNKNOWN = 0, + MFX_VP9_SEGMENT_ID_BLOCK_SIZE_8x8 = 8, + MFX_VP9_SEGMENT_ID_BLOCK_SIZE_16x16 = 16, + MFX_VP9_SEGMENT_ID_BLOCK_SIZE_32x32 = 32, + MFX_VP9_SEGMENT_ID_BLOCK_SIZE_64x64 = 64, +}; + +/* SegmentFeature */ +enum { + MFX_VP9_SEGMENT_FEATURE_QINDEX = 0x0001, + MFX_VP9_SEGMENT_FEATURE_LOOP_FILTER = 0x0002, + MFX_VP9_SEGMENT_FEATURE_REFERENCE = 0x0004, + MFX_VP9_SEGMENT_FEATURE_SKIP = 0x0008 /* (0,0) MV, no residual */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU16 FeatureEnabled; /* see enum SegmentFeature */ + mfxI16 QIndexDelta; + mfxI16 LoopFilterLevelDelta; + mfxU16 ReferenceFrame; /* see enum VP9ReferenceFrame */ + mfxU16 reserved[12]; +} mfxVP9SegmentParam; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + mfxU16 NumSegments; /* 0..8 */ + mfxVP9SegmentParam Segment[8]; + mfxU16 SegmentIdBlockSize; /* see enum SegmentIdBlockSize */ + mfxU32 NumSegmentIdAlloc; /* >= (Ceil(Width / SegmentIdBlockSize) * Ceil(Height / SegmentIdBlockSize)) */ + union { + mfxU8 *SegmentId; /*[NumSegmentIdAlloc] = 0..7, index in Segment array, blocks of SegmentIdBlockSize map */ + mfxU64 reserved1; + }; + mfxU16 reserved[52]; +} mfxExtVP9Segmentation; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU16 FrameRateScale; /* Layer[n].FrameRateScale = Layer[n - 1].FrameRateScale * (uint)m */ + mfxU16 TargetKbps; /* affected by BRCParamMultiplier, Layer[n].TargetKbps > Layer[n - 1].TargetKbps */ + mfxU16 reserved[14]; +} mfxVP9TemporalLayer; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxVP9TemporalLayer Layer[8]; + mfxU16 reserved[60]; +} mfxExtVP9TemporalLayers; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 FrameWidth; + mfxU16 FrameHeight; + + mfxU16 WriteIVFHeaders; /* tri-state option */ + +#if (MFX_VERSION >= MFX_VERSION_NEXT) + mfxI16 LoopFilterRefDelta[4]; + mfxI16 LoopFilterModeDelta[2]; +#else // API 1.26 + mfxI16 reserved1[6]; +#endif + mfxI16 QIndexDeltaLumaDC; + mfxI16 QIndexDeltaChromaAC; + mfxI16 QIndexDeltaChromaDC; +#if (MFX_VERSION >= 1029) + mfxU16 NumTileRows; + mfxU16 NumTileColumns; + mfxU16 reserved[110]; +#else + mfxU16 reserved[112]; +#endif +} mfxExtVP9Param; +MFX_PACK_END() + +#endif // #if (MFX_VERSION >= 1026) + +#if (MFX_VERSION >= 1025) +/* Multi-Frame Mode */ +enum { + MFX_MF_DEFAULT = 0, + MFX_MF_DISABLED = 1, + MFX_MF_AUTO = 2, + MFX_MF_MANUAL = 3 +}; + +/* Multi-Frame Initialization parameters */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 MFMode; + mfxU16 MaxNumFrames; + + mfxU16 reserved[58]; +} mfxExtMultiFrameParam; +MFX_PACK_END() + +/* Multi-Frame Run-time controls */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU32 Timeout; /* timeout in millisecond */ + mfxU16 Flush; /* Flush internal frame buffer, e.g. submit all collected frames. */ + + mfxU16 reserved[57]; +} mfxExtMultiFrameControl; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU16 Type; + mfxU16 reserved1; + mfxU32 Offset; + mfxU32 Size; + mfxU32 reserved[5]; +} mfxEncodedUnitInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_L_TYPE() +typedef struct { + mfxExtBuffer Header; + + union { + mfxEncodedUnitInfo *UnitInfo; + mfxU64 reserved1; + }; + mfxU16 NumUnitsAlloc; + mfxU16 NumUnitsEncoded; + + mfxU16 reserved[22]; +} mfxExtEncodedUnitsInfo; +MFX_PACK_END() + +#endif + +#if (MFX_VERSION >= 1026) +#if (MFX_VERSION >= MFX_VERSION_NEXT) +/* MCTFTemporalMode */ +enum { + MFX_MCTF_TEMPORAL_MODE_UNKNOWN = 0, + MFX_MCTF_TEMPORAL_MODE_SPATIAL = 1, + MFX_MCTF_TEMPORAL_MODE_1REF = 2, + MFX_MCTF_TEMPORAL_MODE_2REF = 3, + MFX_MCTF_TEMPORAL_MODE_4REF = 4 +}; +#endif + +/* MCTF initialization & runtime */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU16 FilterStrength; +#if (MFX_VERSION >= MFX_VERSION_NEXT) + mfxU16 Overlap; /* tri-state option */ + mfxU32 BitsPerPixelx100k; + mfxU16 Deblocking; /* tri-state option */ + mfxU16 TemporalMode; + mfxU16 MVPrecision; + mfxU16 reserved[21]; +#else + mfxU16 reserved[27]; +#endif +} mfxExtVppMctf; +MFX_PACK_END() + +#endif + +#if (MFX_VERSION >= 1031) +/* Multi-adapters Querying structs */ +typedef enum +{ + MFX_COMPONENT_ENCODE = 1, + MFX_COMPONENT_DECODE = 2, + MFX_COMPONENT_VPP = 3 +} mfxComponentType; + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct +{ + mfxComponentType Type; + mfxVideoParam Requirements; + + mfxU16 reserved[4]; +} mfxComponentInfo; +MFX_PACK_END() + +/* Adapter description */ +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct +{ + mfxPlatform Platform; + mfxU32 Number; + + mfxU16 reserved[14]; +} mfxAdapterInfo; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct +{ + mfxAdapterInfo * Adapters; + mfxU32 NumAlloc; + mfxU32 NumActual; + + mfxU16 reserved[4]; +} mfxAdaptersInfo; +MFX_PACK_END() + +#endif + +#if (MFX_VERSION >= 1034) +/* FilmGrainFlags */ +enum { + MFX_FILM_GRAIN_APPLY = (1 << 0), + MFX_FILM_GRAIN_UPDATE = (1 << 1), + MFX_FILM_GRAIN_CHROMA_SCALING_FROM_LUMA = (1 << 2), + MFX_FILM_GRAIN_OVERLAP = (1 << 3), + MFX_FILM_GRAIN_CLIP_TO_RESTRICTED_RANGE = (1 << 4) +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxU8 Value; + mfxU8 Scaling; +} mfxAV1FilmGrainPoint; +MFX_PACK_END() + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 FilmGrainFlags; /* FilmGrainFlags */ + mfxU16 GrainSeed; /* 0..65535 */ + + mfxU8 RefIdx; /* 0..6 */ + mfxU8 NumYPoints; /* 0..14 */ + mfxU8 NumCbPoints; /* 0..10 */ + mfxU8 NumCrPoints; /* 0..10 */ + + mfxAV1FilmGrainPoint PointY[14]; + mfxAV1FilmGrainPoint PointCb[10]; + mfxAV1FilmGrainPoint PointCr[10]; + + mfxU8 GrainScalingMinus8; /* 0..3 */ + mfxU8 ArCoeffLag; /* 0..3 */ + + mfxU8 ArCoeffsYPlus128[24]; /* 0..255 */ + mfxU8 ArCoeffsCbPlus128[25]; /* 0..255 */ + mfxU8 ArCoeffsCrPlus128[25]; /* 0..255 */ + + mfxU8 ArCoeffShiftMinus6; /* 0..3 */ + mfxU8 GrainScaleShift; /* 0..3 */ + + mfxU8 CbMult; /* 0..255 */ + mfxU8 CbLumaMult; /* 0..255 */ + mfxU16 CbOffset; /* 0..511 */ + + mfxU8 CrMult; /* 0..255 */ + mfxU8 CrLumaMult; /* 0..255 */ + mfxU16 CrOffset; /* 0..511 */ + + mfxU16 reserved[43]; +} mfxExtAV1FilmGrainParam; +MFX_PACK_END() + +#endif + +#if (MFX_VERSION >= 1031) +/* PartialBitstreamOutput */ +enum { + MFX_PARTIAL_BITSTREAM_NONE = 0, /* Don't use partial output */ + MFX_PARTIAL_BITSTREAM_SLICE = 1, /* Partial bitstream output will be aligned to slice granularity */ + MFX_PARTIAL_BITSTREAM_BLOCK = 2, /* Partial bitstream output will be aligned to user-defined block size granularity */ + MFX_PARTIAL_BITSTREAM_ANY = 3 /* Partial bitstream output will be return any coded data avilable at the end of SyncOperation timeout */ +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + mfxU32 BlockSize; /* output block granulatiry for Granularity = MFX_PARTIAL_BITSTREAM_BLOCK */ + mfxU16 Granularity; /* granulatiry of the partial bitstream: slice/block/any */ + mfxU16 reserved[8]; +} mfxExtPartialBitstreamParam; +MFX_PACK_END() +#endif + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/.github/actions/libmfx/include/mfx/mfxvideo++.h b/.github/actions/libmfx/include/mfx/mfxvideo++.h new file mode 100644 index 0000000..9256c95 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxvideo++.h @@ -0,0 +1,188 @@ +// Copyright (c) 2017 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef __MFXVIDEOPLUSPLUS_H +#define __MFXVIDEOPLUSPLUS_H + +#include "mfxvideo.h" +#include "mfxenc.h" +#include "mfxpak.h" + +class MFXVideoSession +{ +public: + MFXVideoSession(void) { m_session = (mfxSession) 0; } + virtual ~MFXVideoSession(void) { Close(); } + + virtual mfxStatus Init(mfxIMPL impl, mfxVersion *ver) { return MFXInit(impl, ver, &m_session); } + virtual mfxStatus InitEx(mfxInitParam par) { return MFXInitEx(par, &m_session); } + virtual mfxStatus Close(void) + { + mfxStatus mfxRes; + mfxRes = MFXClose(m_session); m_session = (mfxSession) 0; + return mfxRes; + } + + virtual mfxStatus QueryIMPL(mfxIMPL *impl) { return MFXQueryIMPL(m_session, impl); } + virtual mfxStatus QueryVersion(mfxVersion *version) { return MFXQueryVersion(m_session, version); } + + virtual mfxStatus JoinSession(mfxSession child_session) { return MFXJoinSession(m_session, child_session);} + virtual mfxStatus DisjoinSession( ) { return MFXDisjoinSession(m_session);} + virtual mfxStatus CloneSession( mfxSession *clone) { return MFXCloneSession(m_session, clone);} + virtual mfxStatus SetPriority( mfxPriority priority) { return MFXSetPriority(m_session, priority);} + virtual mfxStatus GetPriority( mfxPriority *priority) { return MFXGetPriority(m_session, priority);} + + virtual mfxStatus SetBufferAllocator(mfxBufferAllocator *allocator) { return MFXVideoCORE_SetBufferAllocator(m_session, allocator); } + virtual mfxStatus SetFrameAllocator(mfxFrameAllocator *allocator) { return MFXVideoCORE_SetFrameAllocator(m_session, allocator); } + virtual mfxStatus SetHandle(mfxHandleType type, mfxHDL hdl) { return MFXVideoCORE_SetHandle(m_session, type, hdl); } + virtual mfxStatus GetHandle(mfxHandleType type, mfxHDL *hdl) { return MFXVideoCORE_GetHandle(m_session, type, hdl); } + virtual mfxStatus QueryPlatform(mfxPlatform* platform) { return MFXVideoCORE_QueryPlatform(m_session, platform); } + + virtual mfxStatus SyncOperation(mfxSyncPoint syncp, mfxU32 wait) { return MFXVideoCORE_SyncOperation(m_session, syncp, wait); } + + virtual mfxStatus DoWork() { return MFXDoWork(m_session); } + + virtual operator mfxSession (void) { return m_session; } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +private: + MFXVideoSession(const MFXVideoSession &); + void operator=(MFXVideoSession &); +}; + +class MFXVideoENCODE +{ +public: + + MFXVideoENCODE(mfxSession session) { m_session = session; } + virtual ~MFXVideoENCODE(void) { Close(); } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoENCODE_Query(m_session, in, out); } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoENCODE_QueryIOSurf(m_session, par, request); } + virtual mfxStatus Init(mfxVideoParam *par) { return MFXVideoENCODE_Init(m_session, par); } + virtual mfxStatus Reset(mfxVideoParam *par) { return MFXVideoENCODE_Reset(m_session, par); } + virtual mfxStatus Close(void) { return MFXVideoENCODE_Close(m_session); } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoENCODE_GetVideoParam(m_session, par); } + virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat) { return MFXVideoENCODE_GetEncodeStat(m_session, stat); } + + virtual mfxStatus EncodeFrameAsync(mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp) { return MFXVideoENCODE_EncodeFrameAsync(m_session, ctrl, surface, bs, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoDECODE +{ +public: + + MFXVideoDECODE(mfxSession session) { m_session = session; } + virtual ~MFXVideoDECODE(void) { Close(); } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoDECODE_Query(m_session, in, out); } + virtual mfxStatus DecodeHeader(mfxBitstream *bs, mfxVideoParam *par) { return MFXVideoDECODE_DecodeHeader(m_session, bs, par); } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoDECODE_QueryIOSurf(m_session, par, request); } + virtual mfxStatus Init(mfxVideoParam *par) { return MFXVideoDECODE_Init(m_session, par); } + virtual mfxStatus Reset(mfxVideoParam *par) { return MFXVideoDECODE_Reset(m_session, par); } + virtual mfxStatus Close(void) { return MFXVideoDECODE_Close(m_session); } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoDECODE_GetVideoParam(m_session, par); } + + virtual mfxStatus GetDecodeStat(mfxDecodeStat *stat) { return MFXVideoDECODE_GetDecodeStat(m_session, stat); } + virtual mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) {return MFXVideoDECODE_GetPayload(m_session, ts, payload); } + virtual mfxStatus SetSkipMode(mfxSkipMode mode) { return MFXVideoDECODE_SetSkipMode(m_session, mode); } + virtual mfxStatus DecodeFrameAsync(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp) { return MFXVideoDECODE_DecodeFrameAsync(m_session, bs, surface_work, surface_out, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoVPP +{ +public: + + MFXVideoVPP(mfxSession session) { m_session = session; } + virtual ~MFXVideoVPP(void) { Close(); } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoVPP_Query(m_session, in, out); } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest request[2]) { return MFXVideoVPP_QueryIOSurf(m_session, par, request); } + virtual mfxStatus Init(mfxVideoParam *par) { return MFXVideoVPP_Init(m_session, par); } + virtual mfxStatus Reset(mfxVideoParam *par) { return MFXVideoVPP_Reset(m_session, par); } + virtual mfxStatus Close(void) { return MFXVideoVPP_Close(m_session); } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoVPP_GetVideoParam(m_session, par); } + virtual mfxStatus GetVPPStat(mfxVPPStat *stat) { return MFXVideoVPP_GetVPPStat(m_session, stat); } + virtual mfxStatus RunFrameVPPAsync(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp) { return MFXVideoVPP_RunFrameVPPAsync(m_session, in, out, aux, syncp); } + virtual mfxStatus RunFrameVPPAsyncEx(mfxFrameSurface1 *in, mfxFrameSurface1 *work, mfxFrameSurface1 **out, mfxSyncPoint *syncp) {return MFXVideoVPP_RunFrameVPPAsyncEx(m_session, in, work, out, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoENC +{ +public: + + MFXVideoENC(mfxSession session) { m_session = session; } + virtual ~MFXVideoENC(void) { Close(); } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoENC_Query(m_session, in, out); } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoENC_QueryIOSurf(m_session, par, request); } + virtual mfxStatus Init(mfxVideoParam *par) { return MFXVideoENC_Init(m_session, par); } + virtual mfxStatus Reset(mfxVideoParam *par) { return MFXVideoENC_Reset(m_session, par); } + virtual mfxStatus Close(void) { return MFXVideoENC_Close(m_session); } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoENC_GetVideoParam(m_session, par); } + virtual mfxStatus ProcessFrameAsync(mfxENCInput *in, mfxENCOutput *out, mfxSyncPoint *syncp) { return MFXVideoENC_ProcessFrameAsync(m_session, in, out, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +class MFXVideoPAK +{ +public: + + MFXVideoPAK(mfxSession session) { m_session = session; } + virtual ~MFXVideoPAK(void) { Close(); } + + virtual mfxStatus Query(mfxVideoParam *in, mfxVideoParam *out) { return MFXVideoPAK_Query(m_session, in, out); } + virtual mfxStatus QueryIOSurf(mfxVideoParam *par, mfxFrameAllocRequest *request) { return MFXVideoPAK_QueryIOSurf(m_session, par, request); } + virtual mfxStatus Init(mfxVideoParam *par) { return MFXVideoPAK_Init(m_session, par); } + virtual mfxStatus Reset(mfxVideoParam *par) { return MFXVideoPAK_Reset(m_session, par); } + virtual mfxStatus Close(void) { return MFXVideoPAK_Close(m_session); } + + virtual mfxStatus GetVideoParam(mfxVideoParam *par) { return MFXVideoPAK_GetVideoParam(m_session, par); } + //virtual mfxStatus GetEncodeStat(mfxEncodeStat *stat) { return MFXVideoENCODE_GetEncodeStat(m_session, stat); } + + virtual mfxStatus ProcessFrameAsync(mfxPAKInput *in, mfxPAKOutput *out, mfxSyncPoint *syncp) { return MFXVideoPAK_ProcessFrameAsync(m_session, in, out, syncp); } + +protected: + + mfxSession m_session; // (mfxSession) handle to the owning session +}; + +#endif // __MFXVIDEOPLUSPLUS_H diff --git a/.github/actions/libmfx/include/mfx/mfxvideo.h b/.github/actions/libmfx/include/mfx/mfxvideo.h new file mode 100644 index 0000000..88f388d --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxvideo.h @@ -0,0 +1,104 @@ +// Copyright (c) 2017-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXVIDEO_H__ +#define __MFXVIDEO_H__ +#include "mfxsession.h" +#include "mfxvstructures.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* MFXVideoCORE */ +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxU32 reserved[4]; + mfxHDL pthis; + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxU32 nbytes, mfxU16 type, mfxMemId *mid); + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxU8 **ptr); + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid); + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxMemId mid); +} mfxBufferAllocator; +MFX_PACK_END() + +MFX_PACK_BEGIN_STRUCT_W_PTR() +typedef struct { + mfxU32 reserved[4]; + mfxHDL pthis; + + mfxStatus (MFX_CDECL *Alloc) (mfxHDL pthis, mfxFrameAllocRequest *request, mfxFrameAllocResponse *response); + mfxStatus (MFX_CDECL *Lock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + mfxStatus (MFX_CDECL *Unlock) (mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr); + mfxStatus (MFX_CDECL *GetHDL) (mfxHDL pthis, mfxMemId mid, mfxHDL *handle); + mfxStatus (MFX_CDECL *Free) (mfxHDL pthis, mfxFrameAllocResponse *response); +} mfxFrameAllocator; +MFX_PACK_END() + +/* VideoCORE */ +mfxStatus MFX_CDECL MFXVideoCORE_SetBufferAllocator(mfxSession session, mfxBufferAllocator *allocator); +mfxStatus MFX_CDECL MFXVideoCORE_SetFrameAllocator(mfxSession session, mfxFrameAllocator *allocator); +mfxStatus MFX_CDECL MFXVideoCORE_SetHandle(mfxSession session, mfxHandleType type, mfxHDL hdl); +mfxStatus MFX_CDECL MFXVideoCORE_GetHandle(mfxSession session, mfxHandleType type, mfxHDL *hdl); +mfxStatus MFX_CDECL MFXVideoCORE_QueryPlatform(mfxSession session, mfxPlatform* platform); +mfxStatus MFX_CDECL MFXVideoCORE_SyncOperation(mfxSession session, mfxSyncPoint syncp, mfxU32 wait); + +/* VideoENCODE */ +mfxStatus MFX_CDECL MFXVideoENCODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoENCODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoENCODE_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoENCODE_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoENCODE_GetEncodeStat(mfxSession session, mfxEncodeStat *stat); +mfxStatus MFX_CDECL MFXVideoENCODE_EncodeFrameAsync(mfxSession session, mfxEncodeCtrl *ctrl, mfxFrameSurface1 *surface, mfxBitstream *bs, mfxSyncPoint *syncp); + +/* VideoDECODE */ +mfxStatus MFX_CDECL MFXVideoDECODE_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeHeader(mfxSession session, mfxBitstream *bs, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request); +mfxStatus MFX_CDECL MFXVideoDECODE_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoDECODE_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoDECODE_GetDecodeStat(mfxSession session, mfxDecodeStat *stat); +mfxStatus MFX_CDECL MFXVideoDECODE_SetSkipMode(mfxSession session, mfxSkipMode mode); +mfxStatus MFX_CDECL MFXVideoDECODE_GetPayload(mfxSession session, mfxU64 *ts, mfxPayload *payload); +mfxStatus MFX_CDECL MFXVideoDECODE_DecodeFrameAsync(mfxSession session, mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp); + +/* VideoVPP */ +mfxStatus MFX_CDECL MFXVideoVPP_Query(mfxSession session, mfxVideoParam *in, mfxVideoParam *out); +mfxStatus MFX_CDECL MFXVideoVPP_QueryIOSurf(mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest request[2]); +mfxStatus MFX_CDECL MFXVideoVPP_Init(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_Reset(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_Close(mfxSession session); + +mfxStatus MFX_CDECL MFXVideoVPP_GetVideoParam(mfxSession session, mfxVideoParam *par); +mfxStatus MFX_CDECL MFXVideoVPP_GetVPPStat(mfxSession session, mfxVPPStat *stat); +mfxStatus MFX_CDECL MFXVideoVPP_RunFrameVPPAsync(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, mfxSyncPoint *syncp); +mfxStatus MFX_CDECL MFXVideoVPP_RunFrameVPPAsyncEx(mfxSession session, mfxFrameSurface1 *in, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, mfxSyncPoint *syncp); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/.github/actions/libmfx/include/mfx/mfxvp8.h b/.github/actions/libmfx/include/mfx/mfxvp8.h new file mode 100644 index 0000000..eda41f9 --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxvp8.h @@ -0,0 +1,71 @@ +// Copyright (c) 2017-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXVP8_H__ +#define __MFXVP8_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + MFX_CODEC_VP8 = MFX_MAKEFOURCC('V','P','8',' '), +}; + +/* CodecProfile*/ +enum { + MFX_PROFILE_VP8_0 = 0+1, + MFX_PROFILE_VP8_1 = 1+1, + MFX_PROFILE_VP8_2 = 2+1, + MFX_PROFILE_VP8_3 = 3+1, +}; + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_VP8_CODING_OPTION = MFX_MAKEFOURCC('V','P','8','E'), +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 Version; + mfxU16 EnableMultipleSegments; + mfxU16 LoopFilterType; + mfxU16 LoopFilterLevel[4]; + mfxU16 SharpnessLevel; + mfxU16 NumTokenPartitions; + mfxI16 LoopFilterRefTypeDelta[4]; + mfxI16 LoopFilterMbModeDelta[4]; + mfxI16 SegmentQPDelta[4]; + mfxI16 CoeffTypeQPDelta[5]; + mfxU16 WriteIVFHeaders; + mfxU32 NumFramesForIVFHeader; + mfxU16 reserved[223]; +} mfxExtVP8CodingOption; +MFX_PACK_END() + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxvp9.h b/.github/actions/libmfx/include/mfx/mfxvp9.h new file mode 100644 index 0000000..7575f2a --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxvp9.h @@ -0,0 +1,53 @@ +// Copyright (c) 2018-2019 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#ifndef __MFXVP9_H__ +#define __MFXVP9_H__ + +#include "mfxdefs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if (MFX_VERSION >= MFX_VERSION_NEXT) + +/* Extended Buffer Ids */ +enum { + MFX_EXTBUFF_VP9_DECODED_FRAME_INFO = MFX_MAKEFOURCC('9','D','F','I') +}; + +MFX_PACK_BEGIN_USUAL_STRUCT() +typedef struct { + mfxExtBuffer Header; + + mfxU16 DisplayWidth; + mfxU16 DisplayHeight; + mfxU16 reserved[58]; +} mfxExtVP9DecodedFrameInfo; +MFX_PACK_END() + +#endif + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif + diff --git a/.github/actions/libmfx/include/mfx/mfxvstructures.h b/.github/actions/libmfx/include/mfx/mfxvstructures.h new file mode 100644 index 0000000..5fbefec --- /dev/null +++ b/.github/actions/libmfx/include/mfx/mfxvstructures.h @@ -0,0 +1,22 @@ +// Copyright (c) 2017 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +#include "mfxstructures.h" + + diff --git a/.github/actions/libmfx/lib/mfx.lib b/.github/actions/libmfx/lib/mfx.lib new file mode 100644 index 0000000000000000000000000000000000000000..b39632ea72ab34d202c4cf29453d11ee1b183696 GIT binary patch literal 359450 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≤8+;oY|h~$ENhd&ISZTu3~)B42%J8Hb167+3~)B)N^o`?oEr#( z0nWyJne-T(E#QPOz}c9WNRPpJ8=QLdvo>brK`0G_b38ch7~pKo6v7ys5^(AFSubZpL9;B3SY zV{^jb;;1^*jm=9iuJPKffe7<22_($vIea zPNPL0jx#lf-c%_L>WzO5GD9)+?+S@IUQ2yha&k52`;v2r=KMi&4%eJqT0Y{KsyVkx z&J4{NMgu&KLd{twIp=83_ax^G&H1b3ptO;TKSDl(wK%`d87#S%pcLUCRdu6LNBn#^hy{!O5rT zOxTGzmoNsW44i!i=W@anIi=Q+o?<8G3xqK^4-+Qh#Qcyj2IqOgM4gz|z-c!)8DoH% z?Zg~M96nTC%t+zfp2B%Xawh6>ej^2QM2^sVjK)lnoU=5iPIAU;PKV^=YtGG*W7ptI zDV%&YJ=apn6wcZd&Novy^bSsOsM45!xSO*vg|kC)CTr_|O~D+0gj-Kkaz<&XZpk@9 zbMBU$LpA4Z$vIYY4#v!jj)OEOBsqs^PPgPt(VSmP&UDS0h4~sCGd1Unl5?)+JSRER zG$$K#Iyz3*oFd7g`fAR|&G70IR!U5^mU>=tPSBjgF%zWY6wSF3Q40x(}0sskloIhHt@{ zru2w1a@wMa8YVtChC{(HRD$3DGn2%!49;|LO3~(Rsbe8UoxfcdlfV&{sZL4HOr-C| zM{Axu8E226McI0aAXTUJKx#5&Rjiw2E@prs*G*22ST{L2V%_BAh;@_XP$uNM$%zr` zCMQR%nTmH$r0-&Cr7NCoE))ka&pAF$;lDxCMQR%o17f6ZgO(O zy2;5A>n0~htec#iP_C*S6)k-!9IXE*V9!B?3Q>fRv-^rOu zUBC|t9hj-qNA+nAPOMt=V?Fq_`@<{2xl?n{nx;|zF4ky-qhkXw&F4BaPo4tq6$XcF z-K04rwHZ=<_!YLO&*V-Dj_X`dCgfUA=9D2~t>@&3wVsnB)_TOD;|18dlvj2VGnrH; zG>0(n0`o)7fj?8IRJUmkVMb#&s2{&}`Q(FhlpgU(ipCwWu9UVo7h+v0IeHwVC5<@_ z(nQ4M(4vbudK^4cakw;aV$t;u#%NBi;%Hl9oP&p&L(^8%7A2V+8n&1-nFk)6Az)k> zGRhe3A+}Rom?Kj-N2hR(O5tFT6?!;dV%6s4h*g`DBUWurj##xhIbzl3k08P)npa{JKA`8)i!_ zky4B?Y@u6l*(%VsdZiR&3|rWCaN4^4^Ix~69+FawF>HklTN|F=dSs5awM$Ad#;_GO zY`s>!xYU++CO~Dmby+#F~+bp+pzW4oJU?fPusdzN-@T;RbtrM z8OyJ;rG6r%7-QIq8Mf9=t$kyXw)LKrVvJ#nR*7~Qo>}>gmu#tHDEx6S#;|n}xS1K7 zFwE70`uVSp6$2iDtyxlvF@~)`nNQ$BEQo;9v|>h2Xpe%J#4doY4m63UEF&Fe||!?RMVRgYyzNcHX~A zdN3=nHE#iDyuo=EoC1Th2b_q(c^{lEgEKl;ShsVL2hJJ;GZUOV_+xum4$gW5lLUum zayDiqIJX&?&w+Ekfq4L&I}Oa!;7}~vdR_tNJ_GX?aB2+9!6%7l!tC;y08YJuDFo+H zLr*0*Ee0kD&Q=4n9Go5lvlg7~24*ujYYfaU!P#YC{sqoP1CuwwvR*VW#o$n6+IepP z=M@993Y_~5%w6ETZeX^7^QeJ&4Vy69s3NfoTBeLj$u09Ew%j z=dXi9*N^SGcnX}?4a{%A8Es(x0nR=Ha}+{utbv&d4z(TIRwX#&4NMm}+3?WD+zw8j zf%!f-V-3u!;7l|yBTvD8i-9QsXPSX22WO&zX$I$f1G52~LIblIoQQ$>IdKfkU%{d4 z;&vGxb}Fvx8JLOS)EJmja26PtBykMPb>J*9Fn58|WMG~Kr^~>+0Zxm78GRadN)1c_ zI9&#&8XW2+?7HX%XQhGpA~?4jm@VL}F)(|;xzE5HlrP>DV3*HH;A}Q9=Yn&aq305C zsCC=^tN`au19K}lI}OZ(;M`|mwu3`0*VgkJa2_%+AAqyRz~o>O`lx}K0uHrGTTeAO zTMbMHIQtFEMsT(pnD2p;1&*!fSK#b2FxDBkU&6qg3eJlLrWBm<2IdNIUNJCh!O1r; z_kr`ef!P7hGy}62oVN_j@H26V%)sP=^A`hi0XSs_W%WMG~Jha$noV8Uy)7??xpLIF57 zW*RtM2BrcWs%0Cqn558}z?8AE8XS6qg&i$l1Bc#0VRL>6&TfPAJ8)h%I0wL?H$K=> z$6-1Y&vJ4u00#q&W5#$HIQ0f*6*%~FVD83gyMfsT4&85L=W7o*`9{8mVY6wiA$0~g zw;P;`z?iZ0ordoN)%`32L$PY>IUIWxG@gPfBViIag@#ld9J+JJ z&e!GOtTH$^fpeR|c@UiY4bC&*U~9pl=S^^8VA^FkavJh(V9o@GX1O+|44hm8vjm)a zoiFF!MLFe5?_JPZcr;ZJAFCln2V;zNTm`uHn(>(Bzk1k~dPGVw##l2}vQ##y#6h;k zXuy_Whm>NBVXM}#bzEQc!{fEB52O@h z3|n=Et;>J%-n+KcNpgRVF@~+VDYkO8t&5}-V+>pK3|ntM^_A0YsV*tS7{k_l!xrr| z9inZ0MM^Qouyu)H>+)Aethc3pDy0}>*!q-Vi{kKbZRf7272kc|mYPM| z)i@Yq*t!&4yM0j{PSv)ql~Rl`Y+c4uqv;!;8<%%3w59$jr5Iz_N~GADp>1^)A`u5; z3|sZ!I@(uF(ZROVTT+TKhOGuI1;RS_&ZlM!fn>UUC# zF@~*1mQrnb;xp&mcaFAo39jwX!5G6<6S%gm=fiI=u%+&nQj9TdC0R<@qPBd7w)KXT zVvJ#HkztG4vMqJ?c}T>;7{k_LaP8QjI6P9@S|+6!W7t~4QYtp6KeVOpl~Rl`Y&ECY zI$GO$PD(MxuyuKgEn8~8lwyow>xvXxM`>HRG$p{n7{gWzxORO}zHF%yDa9DW)>4*I z^+jbkR@+)Cr5Iz_YE7|aOMOvFF$Orybim0s#?zOrO%)o30=S~CjEI4rk^Da0vU$uQ6dm-j624*@qj~W>I zU%&MR=1Oq-49rd7EHN+-g0suOJPS^{f%!c+FBzDBfYW1O#?BJ+XWQqqz*%KrO2DCe z)@@8ZIBN~e4d8reV7>{?Mg#LxaOfRtLXUHf)W*@GVvPEPi8{vKffOB#F=DJ8Tsxkr zPq3wq4v`E>1Ru;m9M_VrB#tp3J4V}@6+$8o#u&Cbz_o2r+p(nH>LiY~ zMfo~Q+gcw&A`ZqFwz|NzZBf2#sVyOr!TJgx(^fZew5?y4|8D(wZR@oV5^*rbu(b?a z+g8&h*|*qI2ZdS4VvJFS%UMd*7um|!w$6}Jj4^EW7`E0uyyrW&!1#VjV(eV z4#pU^t_Ju2qwY)KqbjfV?=S(vB7{{0ga`vhK}Y~0sK8`{i3SKsSVVLZk^v&wOeQRf z76efmP*kke6_r}5R;?>4wLz$0#k$nmYQI`7pH_@jYi(Uy{?9q@a_@WRPG&&+_4j`v zGv}W7dCocSdf&Uuy>@#Q-7@pif!fy$$zqJ*>oR7kebbu{zLaURY9)&?hOh4#zNlQi zw6E(Vi!p|;wT3TRkJ+r3B#SYIuXTnmYOitHSGPQ5A~DABbvd+lKcw}T%~~y4j4^zz zXO`-RYWKADKvuF??MCt=(RC=Ph11S^N6AWHH9@wUJq> zz5YDq@J%-B!~*gpUfFDpVA~DAB)dHlo(^gb2YSPJT~hN$zqJuH;k zD(UlJQ6h}Vx&a!$uP^KI`_kLb{Lp57AX$U~i*5`F&^{W^5yqeRjl2)iWqJ3ZgDYR% z3ke}Grmq{J_4@+&B}JiPRz5j00u!w&*Z)WsVNBL7%%VD^2yeIUJ!rE&lPtoRtXrAYU9#|nqkekAa$VYaM6T_tLb3>BvbJlM zDvixrCs~9sS$8r^^^NjA-#l%z?vyOTn5?@rE4Ey}k}Sf2<>EW((qdzhta!))dIC5td7>&KcETN@ur z7Gc10)W%L`O~WUZYsBh59U_ECLyN>WVN72?fhJyUlt~t0OxC^3@~(|5B#SU6>po_A z*T&_{qWG_&K?A&uXr#tEi1sofZY)G>x1Z%nIf@nEVLGnrS=VTR6%poZ=xG=bo@(Rs7oiPr2L1El@8zy*j&HV5@1weK< z+!$%7Z;XZ;>8X^J%OaJ_msC{OG&e?&h4P12RyI{OtPVHH&6&+L(dyjQ(MVbS{OYPm z-m;2DnR8JS%s|G|Cd2yKli|wxhSf33sz_6`v3@nml&O*8DV1{ya&m$TsI;CrIR&}% zGP8nQtSlFGuA;77RuK)xWagrZa`V}Act%Wa4p(5IsIP){vgI=a3Rcn61LibG8dn$2 zEH2U;^CFE+^jK45o?TyER~l(joB7pE7n&M8SD-H9K$J$J#f{bVjn&cB#Gheq=GV`! zZ(L3p^HA^gd9zCj!eHb!FIf_4%&DoVudKkcMPu@(H=;Yo&kj}8Rn+#|D~uCl%=QW~v@F(-0FeKny#nw($YQ4Xoh#{)B~BB4k{Rm84) zC&5)lnPrqw>dZ1qrCCO)^e&^FDS|S}C^OMvN|#qR%tXxY;!$_2SY1Lx~s!d73*73$1V<#pmlbmQ< z_UOEvUF7WUT9doFxFWjDG&HwPVY%KI>x|IWni1N1&rs~_So6{)c7-$>dOkYZ-d$$J z#pwNFB0J8VYj{Sx_Gq=Cc9uy3vw;g@;Srt%KXYrBtP;&Nw=h2##0m#{{K*Lsne9HX z*ijir`;=o{M~l(9>Vij0pHq;V!_QW(Mt`NXxxgWk=%-= zNRYd$?m0ZV1gNR7E>yij0=QR(u=WhkFGH`F3&fyY!)n6@CyvqSrNSqhOkhl5O;h=i zB^6k}%P`|vL&dotjU5bz#G)Gkdl}Jg@*43xRW7=4GQENxdB56rH7#fU1k?lVxSN}T zL7H>~GWId#zkf*0`1_q*uE_P1XBBt%Ge)J@t<8*|hk6JvjYPv$VpxW&YHGrC`hhBf_LVU;niHNM zKF3|BG%($kDrimnE$oTLrgn?eM(QwDaZpR=OyWdVh^oLGms6On>ZZ8ajCLBK>mC4+kLTbaHSs1ftDN&u(EE0+Z_t#~mGTv7Vbbv#EYY(Y$K!&^ zj8eIgN0)436ybspU3H06Hq+$%@r46G0AaBd%5_dfZH^LtSDQ(Fog>H_i$)*R8BZ?X`EY zF3`Z2UE77&X1uTK**4fQsP=8tOo}%DjOQaojeX*6OOMU zbGcW|tZ1-@r4>N;b!nFI1-nMlW;&4$eU?*S-7t>LJ9X|b_2lCY*UpGT$%-kVq#(nl zh!YdGak=fR3aN^%37KJ6gj6`n%k?1D&f-dyD-OF%VvM347-;Klf_;704&I@20oAo% z7gnonxbxDmjW)D4*mdF9#=A3Y3JPRjS+)tL+J-wXJlkkPYlCsbs;^SpU_)zz7MY zcK0fR3*lwNyg=_|#D#DfF)o3+=w@C!M0r-T9lAnz8=yPjCrZ7&$~Z86G}7I~`HHdmQDU+T+h&9sm!oWJ2DX<7yGb zSGgYK689ZE9wuTjNfzsM+j^~l*?a$r)oWz(O=*&b9;!XE1v>l9h1hKm`&#I4w zxy;GA*gZ>dJZ7FZG0vXP$u}Y1X1p3uy7z2AndjMnW}de{&jyr4?*^2aTv4hsnpN(F z@b=zrFOX(j7;i(ddjQXnVqvy9o-oYYzU*P>mFY!w+#BXac4m9gQC4wQ)iDFut{u5v z!d%5T3Z6e@m&D@43H6Zv-C z#;JTa%*&j-k|Wx|arcjQ@_DGb^PN4%ofof|9=*k++JFQmoI};qgfUcYgz8To&84!W=VWf{ zl|42os5YDUPGD^|38*%k;3j0pH2_iegh4wP+DVeP9qR%li`Nbk-G!_zCj@GfiEdlg zCKCd+$>i>H)`pXWYx7yo8yMnVOT~$C+?&Ur>P{Bz@z^b>AY$){NhXjucdaC#^8GO? z_Wygws>uJxcY3P=|6jXR#r-ebXs(L<-*Byp9eYbsg5Jp^Y!0qPE^u73{gzf#Fu0s~ zEMwi{s_3^eqr*w!MtaqTeAA#f+KGG9y*g1N?p+pO&l~AIjC$idA_dTWGrhOD7?feG zy}RZOd+h?HN%R>$JiwVB?-Q4fjCd4vW>POzOp7YpgYG&Bp?U5z5IVzs`oW#y;lq96 zK~rMRI_Mma^>A$2JU|}aaVX7Z-KU?lFBiaNg6^(&pD7ad?2LF6Rqtl#+M>$#pnEk7 z@jRP_GCZ5bk>TOPvssAZ-7J*jQRA^?^8k5xch!2V85cmBz->76b2jHa{^GX{9`juL zIBn4VTM7M}0Jrrl8kCE?E9T1irDH|^YEuFKHgZRn0&m~$74hWEZ%8pR3*+h30-$yH^D zT@bf#AkG>*E-At4J1&n)dTh>A(cDYl|Aa3w2~GRIaHWd%AG!-)_1FKDc@=)_+BQ+U zBw8CM$yWimR>keJPEkQoaBki5y84xM z(@wYH1e-(;0SZ^wEvXL%C36yHCGVf&D}b|OBonn4ul>G2jBr`uIQ-%~ZZuXnuPmp1 z1PWM^*`AGHHd#pmmi(zcycks3v#S~p48n;f!&yuwT)1>|=+`m&9HKNl!3C0)TQc6I z&*m`3d1|wAg3~f{f(1G5X9x+>gt&FCoyA2+w+Zs?01^Nv9AjVOWK`SkHOf<488mOfQo^yH(pIz{{w`b&o>gaiQ z=~i*M^EuT7q^E__dwiTJXk`YSZ$_j%dbS+Br-$A}L#Ye?80UC;9O*Oh*C;Wx&8aJV zr>Bq2FPNS)x2UYBF!zjM&CS(SV`{1w4@*itvvgiwNtp{fyC{EF&dh?+Vd*LG@;Cg^ zBP7qae7(qN-WiL^A{DiH_!-Zl#m&_p z-0+-@rpThE#>zzq2|xQ?M86BKlt25Wp99hFe#g`=zR)_uI;)p&G2Rhm^|8{dJF6}I zJ+r#9vA(H(Ni;p9Wi!EmZs;`*EUqw;DJ0=Xj4%jHMIW2jDqp4Pf;U= zT8aXh?^C$zzwkAu9_dG7+dHB4`!e<(j7^$9{#Bdl0OxPY4-D8;7D!XT0WJA~j7=#4 zLZ?H{Z0Q^Lr036ifiu9vfu;hQMx4|ueS42bNZs(4VhzJ5niA3+e0FEa*TrXb$;Fcq z)pu{7)ti7wr-?8A9O#h8IOO9X`(e?tgp>-YH|xlL50>aTuR`hzsXyze-}YpQMwF1! zA(7s1)s+1u@`Kl|9aH5Sc+)$hzRXxY^15@YTNj50zj<59M;C71^ze+@`e)=bXP+5uU9AB|TtIY%lD z6u*zgDoNc+U#DIy6V(YNKgKQD5^qEe;@j4gky<8!L5H-;@n>V`iND*m2Ji4b9UGj; zr~NkNAht|Rxz;#m4T?)V=NE!i=*yyqM#@Abp~M*DiN^FuN%2%xnmJZ)c|(LtVC!A} z6z^`Q2*ev3sV4|Kq@i~vQjcIeq_CQxp`Kx5?u3TgUtpZiwWKEs`+YPwnd#SH&@&*u z%b)p+$3K>?tj2FA%j)r)L_Fk2jBgoeiZ# z`{?nLGBdHOMxuRmGw-8cD!|(+&?_i8M?7s0hkg-FPR``9kKTd&@AYwlXkUqawBxDU zlv{(p;WVW=QqT$poihYwT?t#)0M|c503-O~eYtC&e=_u`qXkBNrl(<_@4}5o=2+ks zODq*P9~C%{oTQZZ?dkrQ`&<;Vu6IstA5>@@-N zR016N-3QDEN#H&MW*}80QoQ)cUH}++2P38SaAm+;oCIzIF!v^bdlZ;A6X2*l{uh|u z<2byy@dc1Q7?@xJ997%dz+9XFM^Dt=0L$Yjp>1H*g0emexd!^RV|` zlJ-6V?yDs14bZDYI8}c6T)o()Pl_)cxX}{ZUVLXKX|Dvh3li9S2!7W9GkPLLAy$4~ z$EvN!D+8wQBtnT}QpS1I-)GqZqdw!c$2Y*GP8O*4$~#hG64@IA+!+b%Q9Un6(q0vC z4GHW~|GPR#dp`i~t|aWWCTZ^gaIYm{@6#mheFa=6yxDk#Y?X~aON!lv`?t&!jtx3|}2H>_PVef$??L7|MvkC0c{QP#3_C5seiv;#)e(pad zx%LW5EFGyQreQL*N`=$QUEofQC&>@ybC9$<7r@CGI6qB+4W52cmtSs6X2*E9|O}T7Xp%Q57)I1 zdNb?E5+jiKl-E9{=M)wdPM=v=Iy0v%FLcJR@XXS@@VtVODOr;yfx#^!%#S8(W^LG%c_NaMG^ zc0;dGZL}(_u~sc!1HB3_;jXf(p=+=z@T$~GYnc^6{uoFN{7P87PS=`=SISo5m8dny zOSh)rU%Hhc`Odr$Y}5fsxKsENn!XYzlcF|5``2bVvvD0NJ?wEI>Y%!SmEpL~Ma2$v z6ooR%X%yZ2(pf&PyruKyv5>CXdGkZ-KFmO|LM8I@uE?m#g% zebKQ}vZ5nGEgJ$s!mOpL`3zN~G%c(-JOtK&SpdukYprEn(b_y8blUbsXG*CV4By z)HikYZst1NbQSebhq9cJ)X$VMw0;+Nv*_TQUEimIZ0Uzjd>uz$;wtO-Rw`NuTr>uoqt|FHr4Df;>5QA29upl8y>TaQyGURO9wkHF-pSCfv2DdS+CEu4i z`Er^U8oN?2{ulaZTgSso@pX7R0*M#rw4Phm9c7#$iZf(IPl$;#gh93^^{9iqkYY_$ zQNwtK)$?a z$`bgYqM!~*P2IAIIW|fY_`q)O;`^0F!c_hpJwAyAJQo35e>6KwBGw?>!ze;`iPr6-_#F)?Z(`9qUAp@PGZ_yBap%h}y1jyT^N4E|&%Lyx zUvJz3WAC-G&)$hLn)__rrD27z7v)7tbJtz}rs?h{GzFmFF5_yXE<(*$gaYN$SPG&~ z1~^MJRma0cAfR0WJbMS$VG`cB7W=UdZ7+}+5iRE*AbzG?Z0T+i?QX-`ZlZ7=qQ>aC zVGzD@cD)Q4_wC40Ci;EL2FA3|oR&eu$`?JJzB)uNpf7*V4fM|0!>{6lMiSX;39iAY zoj?VanvkB?bd*I~)YMRfnXcs(wE(184{uJ&+5)>UPHUJl4Qp*V?l8)|iREr04-MKq z(SWj|J#E_I1!%vVT|vYtDr_wzQDLa}(KgVodMA4z*gc=f4~)U;XHAf#(d)nHvu2{r z3vJmJAe+u=iH+h_1lM*P@$;9U$}a~&v_3Yr6I)r)ea!Z7_y&+^=B6G=y=7UbWiz)Q zmji)^2rRlLtcEC?d$BzwQa4uD5eRF7MK_7)=V0X=yWtJt!OtAi%C?& zp->KoVvax!hn!t+10$;$4n^jMz*@*4@In?=P~>l*X=m^}gKVxITKat3!Q&h)%`I$*gAeb{ z_omTxvD4%zsRv}(CcUY5$bNe&_1h`b?=q<0j<2FQ)hw9!p&q+kPn*5d0pOY~`yL#UQaZVuX@ zwVu5=+Ym@aRG}7bS*$@e^Y)SAG!m(djujSFg5EK!_0<5X!gL%yreLwsWq%5&%LdQtl@)*XHv5)H9p+JUx|(GiUv-H-%ZR41ss zQot%5Gk~Z`UU&q&1|vKLCZj=`#=t6?McIOYcSlG0YNOVtD zigh}q29_Eiy@S6L>+hHY1a1xnb1LW3u8NKdQ>+Uhtz)Sc(q%0D52T+mmrjg)k9DVE zRuH-kknZQ)TOo|wwvGij|cd@h^(k7Pv45^l-GjXQ-7M4mORkO57>+XbfA?u#ix;G)! zuvn71A0R!>5X+mtBfTu7oenjwh@iqaG=wU=ex%~748rBfm8VBMKoD%QCbTDJqzeT;hy z(gQ5*hV&zregmnFrEa~^+gX|h=^mB}Aqj3Jq(@kH1Eim@^n%V!?PFP&v#vj+4J?g< zbOlQ}kk+$Q0%;>lm5{DvX|>L^=U|%2uph-5qNU5^)TYk7-PV!5Qum7eABpOO-lkN} z3GEN2!lcC;`-7-GDepxCT95GfJx20A6O*K~Yr=EM%*sLWCKh!>q0&$hWDx`g3cCx}%7 zEtz^gNar+BQNfV^K&XY!Frwn*iOzH(9XUX&m10^jq+2Uk84{dP4i0SK^w)y6J-k|R z3<&N+eC~!iQcEcHeT0wY2deW#2x0u$eMTUJmI$%cVMerEJvVjA0g+BtECDOX%=Tiv88&Acph~q~Dk8?6bSR8^+=b5tY zn#urefy)&y_g2w~l&RT`EyXrC|X#O_Vd>C>^icoPRlsFzh(LD5Ym=ei7v4je!B z^N$jL-cjPkUMcymBUUcS<13Fco+`#4eV>Rh&zNT7^oT(~mNVLQm64hvpSoVWzH~BJ z%b2NVYBh9%d`=qOKpp2$*U|%sH`E@6j(w?9&i_vsg4fg#&9^GR0puH_cU7v@&M}|e zoZP>cQU6|x_*#N#M_R>!Q;1LUQ2|4t&)*5{-$RFDp`JmWzEBN%q;nO?^>jzIVjCyPtNJDSabwM;KeMLXj_=T$Tt zuDyr+Uxl_z@I4tsCXR9*wF%hg;1CGc@*WLbg-nT19;nvDl#5{HNf%iQ6nrFXn7}v`%u4lm9Jp83t_(`SFuwbO368HKB_^bgm-67F&h)PdD5WlGuQYyCJ zVx9VxCLyWcsk94%Us}DZcpgDSQea zLL$Z|tn>BgVD%W+wLwL9!q^n+MBfOje?z}=0IW2WU&Z0;kz)1mRa>1KI+ZI=Ck*dk z_41ugP-`o&C!E~D>IV!ZI!UFtCj_W2PqexbT>4a1aX$9w&LHaG{QhNz$5u{a|TMp@U{P}S!j*^x^x|nloAl=2e4O)sq zTEn^24tI0z8ZE7bbQ$MvfV2aDem;s6(q?Sa8CJiw71ED5cbk@Of^<3O-U{g+&fTsh zvao@3cS3p?e|}!F3+W+j@8H}=A<>`T+NGu4knZ7JHQt~wW`jN07Hux1RBU$=3>pEs zgtx3L@x`Cd;!`k$M2zl&k>epPrC&i1K7>RJ+{n;QUA>?gLLx?PyNrXHAtYji+GV_`8A2k) zEWvQ}tufH5^lJ#B96};SS-XsvG($+lSlDhzkN-|HghY(11cS!mv-UWo-?pjr zdkCT|LL%1Hwx7iU=iK|hp&3FV#x|QVOfa0S_@-tEi5NEvMx4_BK{JFzjP1;T5R)E9 zj*ri>HX#oi{~x4Z>X>P-?Bk~ye4nKO_-tV*9iOzP@ZrW$%i6*c^~0-K%Esq4ECuno zm8B3quVtwipVzUp0H4>hRE|&D%lP=1;|7)*@c9FlR^gNO{&?sGK5t^_Dt!KsC9;1r zOO$g9OZbRMujz6I;e56-zi*8iVI=IUhEZ%mc&N1YJ|d zf0=Aa{HXC4p3a_)(b7>0nFvZd&M#4j0Z@rTIDI&APMHdSfW1)RUtoy}PaVX&@brYM z>Z(Y6X{4zMkERI*fySZ|c>I^imPF}(?P=|m7;Sr{6H!v>M3hb+%CGyIO7}bVLZy3? zB`O_t6YtVFn|3Z9Ly=Qe(ST=X6!H`0#A7qqN&Dsfqo@71W3=s+SHw-_6>-1$iy`m* z{OQI^{5xM4uy#t|QEm{@zk>#MFTQr}}T zZ@hfxD-9ic`&SkP4sGAw<-peA14nHg*X4wXzxma|**AZ^bmXQVUiOm|_5F{HmkxjP zwIPxf2c+qvQKol_Uy{J=Mt`g6B5T>bHYyGQ7x$^1Qe3iV)?H)s8`A@yKl8!Ye=Pa1!;wJkv!TT=Uh}u>&u^{UcwL{X zcOGiACJt}wRR6Dc<{a#D@462kUi6WhUvZ%?xO36U%DcC|ao2`-8`pH|x4+AkxmP`O z@t>})?6YrqrLwQ`?^t3P)oO3 zYq}M6=O@}$@!!#P^w95pdf@=~wwph>aLTkEZwxIv@tW@qDR}bF-Q4l1cvStVd{y6n zU)uGfUgIm?>yZD**ZVddzfaYVs{h=@13tfE_kE=*9=E+oGg6Oye$j2eedPKZugcy2 z)fBbeYj>|j9Y&73HTUN8Pktl&?nj1wc*dWu%sKREzYj0@Ss_ti*D zy=1X9jNAIn9U6Vs6~YWa89g?&C3_nkN~ zoftD7pH#FzezN9pET(f37+QS!edLSmoICj9dt&W$(U=a9R-9ttD1szsJYAE(bV~w5 z`xL)#5I!lb>3sy}x7@ytLyq6qlM%Q)`tZebV=>eMe&3n+BzAtz`MI$evXBTvdo~;M z)uqK-W9{@}%u0Mx`sU8d(a7$Ydn3p18;MV<=TB!ftc%5~Jc`8xl& z`Kw|v0~ynP{ZOw+REJbEi7<3NJrQO|5}2V$VA2`Wem$SWm;gShe#Uh=gfklMwiw13 zno|g~;H{56>Toz?=x~lO+xlLM>A`J>y!d_XV@5Eh{qaRD<@Zs!D7|&shSy?!(X0Yr z2!^5<@Y9``NZj$z!H?fZqm|N}-`^tpA#G9LqSVVuXP)zvk<#P{2tJi&j-kPNnqT)I zlnPVs#)!8yuvTF%G%&QGM!4{JRJ;jS3X{um9Nt`texd0Q#89d2gU zD$G!y0x1ohN)kzFX2xii#c0;YXl{zp{4_@MyrHR$)HX$;Zts847)!S4U!EHzK^XqKj>FRA}L?9Vl+)Lnr%{(qJ90GG%#;# z-higq(40ZL`p!;F6q-*A&0WyEj9sv8=hwvIq$2z{Msor!5Dd&Dtx>f)U2Bw`#W9-8 zVl;QhXr7PJd>o_c*GWW^s_Q39YPxC7OsN^5H7!zeg4R4QHGQ<^bEz4mHK(EeD4nP^ zjZ!mEYo3srzFPB<)b!SxNwn}mI!S9TmYUEnkuPD*P8pJroYzw zLuv+V%~`ZuLK>zu8>Ob7);uOP$7#(wQj?}N9cW3#iTeDlkbH96{u&NU8X~a!*aXsG zp=E2%fuPfk+uzbBWXp*P5S7%}A|zTWUsVO+fB^dT7mjwL5~Q z+V>!Q_}G*4gKoY1#3)xMxx?(J?F@tF6D<7fvgb;Sr7@+3#`zFe7)KpJLyLS))cmF< zpfnQ%0(W*Rjb_pG;b5UCS~CGVTRCe<%w)EM(PCprBW5k99WiS;HH1U+JAGk`_Tdii z*rL^-siAeRsiBpgsi8HSsi764siC#8si9T3sW~Y|L#td9Lu)@%Ln}Q~lOCg?6}5?> zwWz5X7NeoHI%9MTV)zKnxN(rg$d#I`Nu7fm{BIU53}lksWBGhAs- z7YNH5sWdts8VsE*=YxVzfyVEXlcRNi#pEr$EVWZuF8ecMj0Xju$}Ae#G@op`>4tl3 z)@I3KjNxmP;p^bqRkwE4zV4SS#u&av8@^^Qf8_5r>to4cjN$7v!`JBNPTvvGzOtxU zkQih58UwB0r^@w8&R-YVEc`B?6JrctW0|Gu@T&21|I$ zG4Dfjmc}^y^LS|O{!D$Wn{JCiG^rpl#;6|}Aa=V`AG2B0B#SXdThKtWeJ#1^$;$?4 zUyCJ+F@~>+hOa}VOABq*PRU}7;frPq5g`QYzsFiVXcDwoZAK(ZKP_@c8qwy&=@rtTZ0eI1f4 z#u&b+?d@{CviyW;HtQssypb4V_?iN(>FY%8>jKGQjNxl4vsAgrm(99QvKV9dqN8%t z*Ff#-bID?i;VT&9%Vy=%&J8JuKfmEChctQ)r#|0T`=WD7lo(_9%7xah!>T~vQ8w!( z$zqJ*E00-fuA}zqt$iIgfIQ)?4){Zajt4mAlg6G`QHM6`0?A^G;j4gI$`{S6Cuv^~ zNETxZU(*d=_t%_tsm=OQvKV9dnql~&aviUI<n+J*jN$9-7+*GPGA*Ex7-RT42U@#tkguWI*Y%Rc7{gZ)vz&e2W_>7Gj4^!8 zG0(=rf=F@~>M(Asra)$q-SHtTxHVvONyHnUV6lCS>S*E^EM7{ga_j4zut zo|bq>j4^!8f!3_U!P?gb$zqJ*tAtt3I<#58ku1g-zDf;WPkh!`K1};Mi5AXCj4^zb zL2K9HrKK-kVY8Yfi!p|;xy({^Nb^QN?Q5T8F~;yU&+tX_hRym~vKV9dns4}`v7DxT zWzixXi7|$+1<=~%qBWAuS}0kJVgBXN1R>e$gj=AY@n^3k9)X5h*v7mH4b_c}`2?DB z1Je@+4WzL#r$MvKz%)WrV_+VKW{rV41kEY~(=%QC49bq@EUB@5ErVt=ST?2wnyt{- zn4dzk&A{}*;nA%c<6I-13$5LssolHiwpc|6RY;66+F~KJc3aRI$!0wuS&T8-{XESg zt53gu%ljv5Uxy@%F@~>2n&pQSIs4|XY}V<+$ddRWrMVwGA6mOyv~C%$eQlI1#u&aX zV3r=ISo7PgR>@+FQLeDz>%(&%d~Kxm^`&Gn#_&~c_@cSaW=$B5Or&!BndPb=jo!c0 z*y*8t)kzj(3}1_xrOHKP$7cORvKRv#9-j#f^%lF2EyY58Cp2~+`#@@JOz#om)>Rub z85)&37*|~@q4xXI@Yz8Da4afP5m+=25k};0FzgWOUPI%&o?C@nzi&G}`{GX|W%;+# zGGWYkBGAN(=Of7?jADsLQZ8W@DgteUb$DdNIu$X_hKz&?i7;R}9#py%8o#dqpFaG( zarz(rYO_iti!i1ynqT}rDig78x9&Y?v$jYUVN6yvv#8yPC6cP~eUe2OlXW39ejk;K zurpS?afa>dYsn&v$y%;iv9)pL$;d<^3|NlZsDZ}5W_Rh=D<8Cd&6O;|n7(S6ClVU9t#cvZBoLu8juCB8-UoZmEHS>^L63+RS!# zQso%wF)#w9GqSR>GEdLcQWm|Eu`qaU&H}s$a6$N-tm26|3o?TX@p7eU)5hC+-VV=& zLg2*qJO#j}ylz;qiX?t@ec{aFBE2y$(nz=G(e~N()phc2J=)B#Zo1Ia;M!tc#DOS{ zM2j1%>+ur0)kMH6+MS#E_4Dy2JIdhu0P|*-;9;$iXm0b8C6UIQ8oXwzB3j=VlRv$& zqBasgTfDB;WWlkQnhRT8QxRQK-&kuhN>|ra&Tfb_R?u7XbXLKvyxDl7Ec3K7zaYLc zKT=s=6$#<>S$KDzD(Jl8VrfFWXX~P-`o<_)Ez^0=U^2IZ@_SJ68uMw>vW}LjUL!s& z_KnQRdS1Yu!!wS>HT6Y)TiCR4!MEenOX7=bnwM7BO|Pg#cUc{TA{gYVp;u&vaqp$R z!<0HdU;idh9F`~+y+b|@Ajst=zv2AC(&BI^XI6eufpl30cXGtw#kSlu-as-^R9{h5 ziYFXbMk7`EMMV@;tjTFP^CwUlq7~8RreLtRAU8aJ{)EU(yk@Pop{5M4DGmlhp&S$y zD7pclxB>%2IGjf`!y`0L^zImo!Eq3KgD32;_>f6<%4<)D#iJD}TYfoN@V)71fmz?HE7t z^QcPm$LCKDdP2gpxEnKQ!HmMJc2Ssy=HX@W^^Jx3Ubx(xLaI!lM3C*Grcnnp@1J%Q zCnisicZ!ti%A``ZtD}Wbk1>r$?1EKE@jbeu?on7hZM?8uR)_n}FVPyqao_3zmECS`}G8MS{F^9Q=3RwP-M9#&%a=}E;y zg~D9mS`LW7VA5O$9F0X6lc#AI6f1myqk(VJJvrm(1AkjCf$ZN@y2=Os+5aBa0@> ztq|+581<~?+QnFyP2=gixwdw-UMZaGo(>DKhn*J_1hsi}Q@DCY@!TMm)ZtlpD}C&* zJp`yKF$joogIq9^J9YW~{&KqT)v; z6tHt`6&n|dBYKIs^o#>^>|T;Et9Llla*{xkZMlRoekj8|uc5hVS$J_p*XmQ;lp zrl=O1sxOWtXGHFcV^_!RR1U8kBef0D)yetDL4Tp{Pe;4SF>-mP$E0YKOb($WDu)_{ zCK#`!cbtM5l;XxnLq%gm4KvZtVulJjEg3tu?r8RcCi#0Q)Y7y-ZFL={qNZpSb$ax9 z49VO=9v#lXuY$tL47NBw9G+1srsc-GWs%C|SR3Mf=*@Ik8pfM7Dwl^V>+6?SN9@-U z$2+uE@A8eCuigxN>_=qU#W5e#>6a_V_THm8wo`$8ODnoYzTJ_cie}okG^4{w@&Hcz zO%|^m&>>{((Gwj#YMbpql$m2Wfa61{B##kQEdOyoszAqlOsXP1b^|H|eH;?oJg$Qv zM`IlwNx9;~G^d;RN5-mrM?=wWs3*l9RmF6+I1pv#TOAy#_`jVIXDG*fr0ERh*o~-A zbj!!qUJ~6UDUx!*iwNV z+X21`*5;J2|1D;`(lksnAeL_o)ugIo&no z$fJHYl}>7?IR68d9YMR!rW{4gE~YDFSMIm8>j?N;o}i)gJdT?EF085GzO%DOD!%W| zpbC-qG5QqKQ8bF?IGg!9vZjJFF4`r#2NkEI%#&TJ{=PedD#W8Zi>Bf@N|thlV2eJA%1bG@x`gPM(ZXB{aSr><_a#h*C%_%)qFW<_B3M84+ zgUVr2Scl<+rxYEA6JxdExThhtx%dcWA*haeqX(njg9~F*k^_$l*!Oahc5dQ0CO&qui)mblbpdKyIF48VeQpTOvQ^b{&vDp*TohfT# z=A_dnWlbV=RyO6x&&H%nQ6bxp&qqmjkUO9S*95KcSs`LvYPSI|n!b>4VM`T_W>wC@NO(5{w+pvF4i z7(cUg9$qo;dLRAlqWoDoGYd+GrKf=SH~jq&f9F}gUSuclj74RUirPF}ZCbRrxw@t* zXDP1HE?S9u9~UiIQri$&8m_Bex-43=I@~B;cfY8qv2syO^Dcn< zOFICW-^avpUuvW)xVHW{h+oIxfQapRb$h#4kza+p-1nzIZoIISYi5s20 z{EkN6nZPVffLj3ECBXb90WJ%;zW_6U?!88eR}Q*Md>Al=64wFSUhz>goDa;J1oo(# zZUpA`1h_H4?F8m^iHqlV32^k|k>U{$km8kta0`KHO@NyY+^>L1lRr#|XKxa410@C` zC$D-5B4-Y8*Cwz>zizuF344Uwl?0C3Y- z%A8MAflHym}^ZZ-mSpxOv2uCN!t50aBn7I?~5eu(X&Ik)sY%#d zl%%~X;2ILx+W@~;1Jj!p07x`%1g+TlU?=p0f!QZwgWvt&!Mx z^+)w`bCUM%0q)@h_GtclIZ1oJ2kw6p*rWJ5OmGwyV!ZP90B)efwpZTlB<%-URNwBC1LN+N!t4WxPK;LuP+_c zI8wa$1_PHNvAR86$AfgdFddi+3>=OJT{t=fT_Z8dbucX!NA|7;?w$np(tz6s%xe-y z>sYqO^Iu?<@-Y~~`@p2o0Rd7x9QA_%z>Id|XtyAK|IK__8U%r75(0>KZtEbG&59hD0tEjE6EDRn^sgdG)BE#;zVS)v@E}HcDS%~c6fdvewkcaT##2dy|AF9lzltTTsAjXSB=3* zMVI|J>Lkx|{s48h;5$3dNk0hnzk`#Ud5w{ZXhi&oSG+-bKD|>jEwrB-TFOD% z8}Z9F@zTmxye#{R@vTo<>3B!xy^IL&J?NF}7lVrT)Y998^=q^BD?i2iG4WJKYB_Mk!Ke2Ydxdu} zHok08yaVqG@BHRY85z9eMWuy!&1Z-skWhlG-vj5Z?7CgQUjFc6(#+^weo3fwicq16Fie8@z{^fUc-g7Z4(c_t8IIyR8_SW;A*p^q z8@eCy206w1lwA!STi*y@wJlquHr*6T=RUMQIDoB)-sLjIajSSjgf9+lp*P1$du`pv zze@EZ-`K439sV3Ibnf|hE8batf)oETRe^YMY};ePyowYRC#%ga&%F7&uFA#Ej{_d{ zcBq9;=UJig`$C&G1R9V-FQ(l|-|OkM>hQfeuoZ122x#D9F^1QIg)s~TP@4qPHmOrjPcbk3Kw@ zX`%@0S7mmL_D}`FR;T6=hXu21C2l(xIV5TyT{E5Ed>$QwSkme3!0rGu4?l&Hx8)_W z6M&t76&(aS0oa+~wlkrvIfPQaOqEZi<6-l+C%Ia86rs{7hw6bUKeT0=s1NA3pQIWC z)h?ocSvHO%6ZOl>8@F3bM4Lr3k3T3_>-JH9a1AhLf58mAfcjNKf^N(C=nQI@pzEk! zExPS;TY=7%PBX(Q1s8~X2LfFW9lJsIJG2DM$!bz_i;OB$nR&?9*7frbNlT90P|HRO6xwQ|Vx)A2|S{JfU=4xsnv2Eyn?7wQN{NUm^dVBX0{A%3fQEYdhDq zJl%CaoPQ8g3Z!j=@OV<5d0tv8|&` z7u(u9hNY^_i_jvQ@t4AH?M!9qW_)g8=|z0bWvLrFx4;!Z5<1#{)pG8&I+tF!D007t zc|hde1?g(W{RL8#rAat4TftHRq-$B44{0S!Rgku_)C}o5mM(|1o~3IcUCh$Mkf_(E zSi2$7OCnROLy(rSZe)sh_*#mU3#o>65l9nxvR@qaX=x1EhM^ zt%bCTr7e&eSh`E&9*1-z>pp@cO8E^WQOX{;SSCt22$Cq}Xh_#HV+y1QOS2$}lAi}@ zJ?l0=TFugfkiN&#Zb;26b?Pi0jhbQ&gEWVAO=!|3EPV#4g{4!w;A}J3RTiXQKD9Pn)_!Z@M9f=ND2 zS%5r19q^>?EdnOpwUgt62<(v8& z67qY3wSf799DEhYd@L7aL5*glLLvw%5w)OQawzHWW&Iuqa_z{Gucxve59nr&un^Kb z{OS4xC{6CdWbx9xT%?8f_RvNg#dKAUE;ZFqFAzk(!sBn{1mmJQTZ}0E0TgqC185kf zYFmguSpZa1hIbQDHOao9f)Q0f%{5E1Ih{&DDt}HY+_aNv4{=1D+F~7PW#T42os+uP&PIO%B76PY9k4W>UnB<~RGCFB z!7rXtF2&>^kUq7D&J0xtzhDFpQuN!<`orjkc9((T{nWNo$hX@m4jES2MPHcPat61mqvn#nq&INr|a?1r6VJL?0z*!!LKU70I~p%i{M%6Af-82xs1 zUi%@{--|=ETBp(#hmIVejp7iW3|Ijry5Nzrzyit@9WvxU5Ng>&s9@V3?)&Z84uyI? zC=Y{z4yJI{j$7?*l=h}$k#3C!nDb$jic#26`azpkUBG+ zxWZf{cG~iUv8{j!rUui{4O)bqO*sfrm~OGC!P>f_;OR$NMdN7(PRgc7&k|WJt$N-O zMri6mqojwbpBHn(Hg**9pPi}(e%ntdGBMpHfZ9L`k_&I2)1g`li@hpWKg|oT_^2Uh z9T8?7eg2Sjv})SMy7%yT5lf%qvyP=+z%;Tn2$GmTMnSrfbw>YNM(x?qf|_eZ>8Y#i z;*x$|h52p&9zJE)Gl=nmJ+9i!-J^HDAY{;(%dn!;$P$_ilb>8`Ag47|PO@~yK2uJD z_9BiE&7ffnM}l!B8u_@f>5$xvJaD=C(5fX^DRm;mCj_(HO*n;`g+ucTB+zha$}u@V}U zeh5J@ghY&&S?BBIvpP}FL&_3g{CP7z1w%;0c%5~=o*k^7p1D-OvZ|j z+c}r&N=U@`h;{5kGDbtA(j5?l4;$sKC1Vc!~ z=q(tsm#Ff@eE0KP{Vwm-kXDXj$kx{1vJQCray(9dREl+iZ%%6WhHgM(+RFte&2OdM zB{T*PRLw2?u?MGFbrUZOn?2rQ; z>4Ze1Xc*_71?gVS4QeSL5*;`A`L!zdaV{-! zg;We_B}?ghY%+!JwIR7&eh6i7)=#k5A!4NW|F43$KwlX^}2{39mHHvC&RSL0&oj#9VnRz<$0r&P^fQ zU7SlL-^r32GX_5!reC=7uW(D~fwTpUjrct-bip8luLlqR9f=mzv^l_`Ba!^w!Cok* z0)Kw|nTh=A`V-IoWWdpR`H}W=F4!1DrW4Pt?$8Qe8l(rV1{p|LVHG27bSy#}$_>sGa)!f$e{MaZTR(+wQ#n z+~y=`zp%=BQaW zFWc4f^bHxyDtp(=n(@fi3mRserM{n>`{wKKhxxBr2U1dZ_5I$IOYYoQ`dZ#u9moFYx@p%xv}50h z(Bd0UdiL~T^Bz3)%CxC1Esq}_)o1U=e;zhRZQnceZ$sbv+p^`_$gib@b5heR|=5+{FVvzhd`& zrN23E-!E=`^xuyxe({>WU4MRS-Nx(sT)p#9qowd`KDzVTA$=~~?^Av4tN++--Pd=2_tO>+&S+KJqXJJ1d*p$t7x&d2 zdH$_8`;T9`Ec>%_dKCR(&6@ldC*CynPHWVx2e((RJL7NHt<0~Q_4IvXPQC2as`I+$ zD*tV1CyqGntiWx9*Z*@>?ZMoOr{q5U`{}=(y2rh(;_j}{*>a9MYHZ2 zo3G;k!Ssh;xMa-GFV*&tj@^FU>4OD--ZysL)f*r2)pkE+;`(ov44QXlebGyAA3V8J zePzcyYyQn2op<)y)YBS%`8(xb`BU|`>&aK^N`7+t$o@au(6MIS>_6SM_3D=%e|X+o zLuzjMY1y5jkJR?08L3A;zv#B#p7F=8`wsry^ZWK+@bRYu_8r>)*ny9GrN8*(r+>UO zXVjYR_df8?+WWfy=)$Xes_kC8doAiPa@?)MK0M=3SLPggwBLu9eDYZ5agR>j^HSdF z52XxL`6CuCd?WDddtZBN#`6zfw(B?6unS)N_>qbp2ULFEdA?UdUEX>(o*gx#9NQ1y zhdZYZHWmBB_Z`ZG{&wE?Pjj2!cbv>S<>}3|V3LVuUP_FyoWBaE9KVl#KOTg%`{ki+ z_(F1GI%3=JqxBvI`NvPz92R%PJ29OYqgIi3KIqGi#dKy2tYk|bPH)qC_SPaeL zejlBOp_q@~HtdC14Ar^cM{92Ku;LWU1Ji>sbeutUYU+l}iM7*{F*MT?=Jwp#2V*g` zPxJf6;FEk+F8wE}!CkIijG;9z**WXFs`6M&?<6pN7&9H8WT$KYl!dW&XwT~RskLv` z?vDU>$J387L41;(2Y-0*qgYIT#+-;xN{zo;j>V|k&hg0c``X7)?fHG`c<%GsYg%IM zoWPjd@JT)Url;@tAQm%_F?19_QRL^GpBsxAlmupQ5*R9x-?s>#l>YJNg!5y44MC3I zw~`T-_064^W8k{$hf3}D(HNw9{^HPc`(iQaj8T2#%+#49V=*T&MveEM-FN18`}4hTE=q?ivr_a093P`N14n4xr{l`eIs3WYU9 zYx1PV(wfp3O=XNG8l(AsjOMNw%`QVz8>y|VZBQx|;mb;aZ&8jvX^p~s7NeoFfRwuH zQjC7!ZqNKHSjIUqGDTJtV6v`?@#ov|zX#L$d_rW_7! z%v@;RHZ(tgrUABW%p=fjH8j70hEl5b-hp4c- z6SSs4YC3Aol~Qw@);upYL$#)mh7;0BTC-njhHK44+Swuv)0)SmCS7a3mYRWDlS{i_ zPSjhlTlHwcO~AZt)Y#L|q@&jCT74Uu?S^I?cG@qaBsQi7n(c_&)@&h+p?L|KAfmJ} zQ!(AV46UtM56vfr=0#}I@MmLsU{{}MXl6rGY-qMYv(?bN1x>4=IhmFNoYY7O#b_F1 zG+U*nldk7)q^7UdoGlk_1GMHwsX1P2d~!nUuQkin6sa|r8JaL&O0v8uy4;NU8Uqt3 znsvG?6lPkQtDPF!@34k;2b?H$Q-f-9Y0{KNTMj7A1PGjH&uH2~Rl78_A~G>(Xra+| zXfMnd?TgkeriNA^rX3obHb%@XPK=maq=tQ!`>01rO*RBMw>Vj1ZgFbF+~U*_lZKfY z4-G|ALycr=Xw7D7Xr;#*S`2fdwT+3PZe(g`onUHCQktwxNR)=-k1=X#hnYlbbUmjl zjcyBCHQAQMEFm=14djd;~Q13&!uS zn7rjgUV}ny{aB7l#uzUcAIU5lceHET^xmcpHtPk+VvOPIWM)xMqeQ-jXkQ;m7Gn%w z8Nk{vpWk%T4foiro-`bh7-RT41zNjYTVC1Suegyv=%7vKV9d8f*BX7u^T6uTC_fA~DABMdQ_OuLGfsc{Xc|WHH9@MI**87rp3y zu=X`qvKV9dqMmO1q8HuUtTmFw7{eEhMcWtEVOQF@~?nhA(QbLE6`2lEoOq*BOQ{YA>7ho@6n`@I}YGcDV+%7JSo3 z`|3}-ASA{ZzHs>GDA$EAeEPA?3Q87Z3|~{2rRFH|)ld7XmMq2?zNQ+!{`%}~r`W9P zC5thJuW8KMfKTkmt(gzJUXCxBc1spx3|~PY#3LtZCi?PF$>oxQuXiLX2$^PPoKL{g zgGwXpkY+42G{Xh)Col`3p{{6SHb67Lz&t25Hs&2@0tTixb}#9Mo%5i{G%$BVL$jJ~ z=KwU+4nh2hcs_(?f`RGV57(46Mm%c+n@BnMv-`%^Uk+WKs@v;KuqZLcsKZ=n?LPn9 z-$%~1S&fp#7^A)NG>fd3&93%!*1mR17Gn%w`I<$g`_lv6Zn9au`;#S{&B34F@Krz> zpX!G+NA=LYE|Dz87`~=6i&~d_T{--gAK9#jC5thJuNj&J!7A*!rM$QH^}b{=#_&b$ zVb|eVKiPnx*pUn%jX7R?Gsf^$hz!9Z1o`TvSxu6~7{k}unnmRzUpDJ$$zqJ*>l|jO zI;1)31nsK>b#Elb7`}?2wab-$=M|6Itf`X47{k|0W+`9PUdL%)t0jvuhOb$Mui48V z`Mb^9D_M*&e9bm|(L6s?`|3{1Z6wARzKWr>%XQ_-ro}dEn`AM@@HK~7s$AsjB<*Vu zEv}ImWB4k8*7kLKS#CF*b*E%8#_(0jEamHx+op^du6>Q9gDND(7{1D&wS8^bv=@(8 zRsHZb$zqJ*Yc8`e(eT{c_11r^9Hv=)=s*yOF@~>s(AvJ%#OnWf6L zx&QBuOV_^A=>QjrF@~=N(AvJJ&)cjz$zqJ*>s)3jU)1LZYF|%F7Gn%w3k_eiU$$9Y z>3|!FF)S^BhGuMg4!;f>s^cL3XoOnU3((N4W@Em9rW~3e{sbm4RQyQ7##{zXje+?c zH099Pm=n^)FA#&!3Ofs-A(o9<56uQ>g7_1d`=E(p%f|cznyt_T@h31-Pr|)q*s?K? zL369dIQKi}5lhd{f0+5F&3$z}j~a$dB*qx^ya-ymO{*5BUSqS?Nfu))=XJF6nMKoq zh!X;i;zW8KENX4SbTC*KK;!qx1%dVDnVnxJgh+ptz6fKo!p!pa)pxk?MHpe}bZAsE z?UY09_od-e`LtsWNjroA%kjjn3T6#9Sc-q8^hFqxwU}8nmI-^u?Pq>yd)+BngaOO( z6sJmN(NT{Nf0yOmx5;MxO0o!J`l@19fc03V+&*x(&H6~P2xIz+XcqbUbnb2p7FDhs zGKNGL)7KJc{624A=Sdb}z;ZkVY^i4XA)Oowsht#$;Uxja{x8E8aN6X1yg@gfUsmH7mAU|B@`im@JwX{61B# zOFNIqwS5g8flMUAn5F}_D(~~n(>5zCS%fiJ^_mr1uB#-A zFkm@)Zv(T6@Ja3U+}4Li+P)4*7GX?Z7cooKhS|zpVSy51OjaW_V%8#GBB^=_Nfu#D zRueSwT6v>n5k^>gQEJG#(7a)2oDbBGvgPemT}EmHBTzcy|FQQba5a2?`1lQxB_i3E zP-M$(FI%_$rj?2i?G&Z7kUf&E>_Ui0WQili z|M&ZimwTUi=6TNhoHJ+6%stJ_(G!~)8jI0v9#S-cJem;9+dh_ay|(j2IqnHhsMN1P%?3j0%hp5v<3E2p*5;P${A2Sf1M3 zJ2*7ld$fO~fA|>hNHno`RDd^o!ywG-9X_T684ws56%jTDN+@QP)UAcw6!&tszH0J9BeA87n*A{pcXyC`pNpmQX*I*7Qv6CAN~YvX{CUO+zjJ?n^H7crswQcWAP? z#FGq{k`BM9)GTre(_?0ng9c-xFmwEQlFZFbL5C)B_jZOjXd)8oc0CV!Yl#F;=x%OS zrb0}4oWcU4LjtLL`?wlVv=PsYjrX4-1;5~i@%{B=Y6n&N3yWr?{uo z61q9b_oB(c%-w?n#>hzLN{qnZ=z>7%O0-*`{{vRg|F>Voro+XxNMwRCYg?>^;rf?hdOV2@xw=rBhR zb0T>NDF<_;SX$tFXoI0E_Js+RyrV+HLnOjd(8sMZa74g=7+t}W3k%8qeE`);nmCIMxsEx~+IU7UJ!+Vx5@Smj0heQ?C*=7Fj0_( zgY20Wb>pR#8^vQ!%XG(&!r@qBY)1Hp1q9-UKIGI0FIeB;fWR;-(E8Iw#CfI?!IyJ_ zQ^INmDM2D-m%FsA^bHUHy#%P4Yb&Bc1gBJ5h2VO!3JVPt(jeql44!r@Bn0Lg^Tp3o zpsO|11F#oRj9_SBl(%m{0R03Ih>X!i2`#loZH7?}i3p^x)6j(Hw2S1!?^;4crvP>bHq@o}1 z#PLX7a>yGW;EJm#A?7s4=B-R&nR%1f02E}ACuNfrIu^m^Sg?T!@wc8kJM=)qMB`(_0H3m_OB}Qw?k-u^VVvD3# z#?>0Wwqu4$*!=yPiw*Y6!$YWaXpjjm%h=ezl}P!sLX1?EKQm-9Y<7Nq;ET;dIjn5h z-yQj4Gx6IAFzs&?w6@Pb_ktzFMj>;7Fza8Xc3jZJH zf~kxO8FFRHR56J$S%cqC6)*tH5?-)lgR)!iII(eEhPJ2`OY;n291t%O;Fx zkWw%-h^|k5bu5|9MTIBKWVzgf)lAmPp8%5ubM&iOQ41h0-OJE13I6sdxlGxpyeZhN zr4F~VKOFz=usf6gzZ{jRfAfkQHf73Ep^3t+2PQHDPsWxKbPJ1>#9M4>C9!dFv9@ru zag@;S`eJJ3NVY$#)-Yr2nt3~!3F zp)Z%!vyhmJEhIJ;vNz#SCd0D!bRPqS3OZ~V+qn#sAvFAr2E^=!awY-03#DLCPCH!@ zzvbqtsocqUd)tTl4h^(~zs(bWNud6QP@{{Uk)9@R(K8mC7@6pqn3`y6>Y1Vq^ru*C zY-p&dX<%$=4VImcO3=yBfizaSre^7=^>rWJgu(4>%e{>mKso&|2I!-Yk~8$CPUo~ ztgv}nheVI?M|T@|NBR1N1XjRQt-L)edp!Nxx{`?0|Nc50lf*)%Pu*I~7yQ5N{Mz_G zt$u#BJ=KtDkAHeyRVH3Vuh*7IU;Q`NRb>4CZ=LKv{&sy-m)ReR*5S(5enfDT2)^-% z3UkcEdhh7Kh%xp~uIRZ7v>mU*Ennz9KD6E|EO>+)bz2|aZXFysj8EaDsB}jJGD28) z3ygA&2o6K{ieR6e%sR@CO$?n8&{Ov{x%7ca(F3C_qlXL$jIam^34{CO!nlVItmy5w zaBFiQw;AP=@KZOf;J6$QIgrb{jTzzZ5{~YxMMY-HgMBv6RxU72JFXM7fr-QC?OoiW zBZkQJ;X0S&>k}9m7$t{i_l-;($T`jqzOzq`54KZx=D9`r%1f8pNL5-Sl$I@rwT=Ap z(L8l`n>5fD?jFPiWb(!L$typ-y+rwGzC`(HzC`(HUSavU?NnA}%TI5I7UecPI2`UR zpnnX=lmpUt^&Nxmox`Q%_A~9L5|>kdeO+C-#sOX?U6!XShtIQ>BBN(3MTTc9MTRd? zDRQ>Ex>7a5j}N0#xFnEA3)~oZKJpxboK z>Id=i>Id=i>Id=i>Id<1vc={L?H}2CK%Eg&E>{Z&x%p;!nS3K&UcM18FW-olmv6)? z$hUP^zpx1OFd$l(e4=ue)(%j5rESOkDem1|Lwuu#ghiky0D0--{fmx{kZ5>%0msF~ zg!ugIqx}3==Mn10T6|uR+mBQCEtl-aOYpEugU53H1AjZaYoVNcp53)FJX<$1Jk%t% z^ZRjrdh+^dyq)fc_~#)$FR!2GZ!eL5I=vG4r}+~3=f{^ql`u<@7ro zPxd<;FYiF1-jqts#!wR)vXV#>K4Aa`kQhEyF_OS1`k|LW4O< zqAWn@v02C;AQ-p-bOBI1j0ypvfgH#mp!OJ{$5cCDqz0%XMw);+VI&6B86ycGU5s1- zp`jinkq;nL!%FzwpL!U@0;iABJU|8*r2;a#r6D3wI1fZQ?40_1^F9w79N4%okd`e9TE$P=U2fcj&E zUgv<`c>(nY2#r@l{Q>gANDK(Qa{<~PAoLyuXn%mvyAfdj0`kEq9FQ+Yv4H$Ang_@q zqf|fv7;)1xqsdYCpy?Ob`QFjA@OaMDk~BMgJU0=bd{Nok(M)t`I#QeyJe?*#1Dv0l z$d{OU8HdDET*}FhFulx#)-bs%nq^QzPVp=!4ioTq{njw;A559e%yfw|ZH+P@Gs(2V z9B})Ooevoo;BWcKtd|}2*Y(s)h18^wPoT|;6xIdWC%>LPzv|1*e`)i*`k?t8H63C0 zN>8*8V9rNkB4Z}sru_E(U+=%)jsK_Xn{Cy2Qqcc?{}V^5fL`Kv>-Yb(_V#~Ud-)^# zk7$IycD^F4g4!=kU0m`c1(UQ}YXzbHP6vPw+wY-sm!N)+IDe9j;{WRNmxA^JS0#>G z(qF0>s)iM$hxgzAAJ120Qz`p={p7jIH zEE>ro1qT%Fu%yyDTk-kD5q=<1Gp@s#2YxHjbF0Jbq2bqP> z^RW#hfNw?V^Lf6PkA=k2RuD@_9{92NSV&xc`uw`(=Le0nF$=%Ee9Vu_$NW5WV-kUH zeq4S!e9TXWj}@iK=lOa?m|xy7$P?9rPzd!PnV5qYJp;7B?m_y^zBQZiF z&lJ)Gv;%Wm@QME1TN#fJQ>YWHXJZbH@kU~VMsX>G#%XtB4voY{VI*OZH6U~{re;}> z#>f#qDTKy6_hAl=YL3DPjayO(jZE&xoDY1C#wdVAL4XcoE(AVfFhZrK5X#3P%%Sx$ z7>#F9ETAKpn+l&}F`B`mL_o(dHxE9?VYG-vO9AC$ZUuazG%JfzS+o|=Nz7%y=LC#4 zvnUJDY0T|}&xsiAVNouivzW_+&q){^Wzh*h=P`E%K4USuz@jUFE@JK)d``yb7K;i2 zUB=u)_?&{#6Ba!ORDikH@EM2Edlr2HbQN>o;BzWQFeFT)DuAwIP6bdrMrf`z3aJ6Q ziMjfKreOr#GL4!6x{WzaK+`eOVv!D@yO`?)2<@H9_^%`sG6e1(=1c+2#0bp>Paz4Q z2bi-4Gz%jsiyQ$JVa^p$0!HpE@&xo4b6$W@Td0g@J)=+na8EH81ZXx!AuI|9^bB)R zfaYKn!=mwkUSKX3&|HkBvS zR#O&r2Lu-_;FSPcg|}L>ND8P9-s%V_6>oKAkvpKec&jI%)p)BHi+ljVWe=nr0B8-~ z8pNUyKpJ>!IG{AVHHt+sfEwbh%)Hi)n`xp{aqm=NqY|Ni^Rz*bg5ci;~Mv_vx#orvhA z3jK{VP;gi}z<=~tI*#!GCQF%O5KH})YY)K$1ABsCP>^c`gL?NT1cUmpPXvRGR5kd~ zh2l`LP#o1hW+w3Bl|I#+6`>0259y=-e@nU{JrEK`{4#$s-ulUlkGz>MK4G z3_4C5RpXZe9V23bLG4pYFwKGSA((c+#1f1iFsTI74VXNFu>s~9!MFhPiD3Ez(@2G% zLw{hz1QQC3lwd{!<3li$fr%xU1YlALCJC54f>{MjA;D|_MpT`jpB=z7BAETahzTYi z7%9PA1jdJ8ZUPfSFh#&DC74&hWD(3~V9>0NTsy1`hsP6wQAGy~{Osm54S~@lm{!1; z5==*6&^(Wv%Ltetf-wgsmSF6GSxPW&!0aKILBL!in4!SDCYX`HsMO>~9|w#k!Ndb& zN-%SQaV3~!V8RI|4VYMh$pj{qV0HtOM=*zgDI}QFzDO`=+1xAfv(BP6L z!Mp=TOfcVpkq``;v(=Me>H-r)FinApAsB67W)MslU@{2C446EEu>z)$V4Q&YL@@n; zQB&oY)E5{Xf*B5slwhKP2_l$Dz{C>FOkh$8W+5JZE^V59_d9vB~jxeiPW%kZD>LT9APO6WN-BS0!=-yeZ5Soj(^Wq@Wh=J|6^ zBLWQ{qD5JxNuSZa(M%O!DA)&rXo7}gl7NvA%w1r72u2^m#uAJtFsTG{3K;Y&gG;$9 zoEb#Wn{Z4jFcN~P4t;Yh!9)O)M=%AzpaOB}^n)H$LNI%PLDw{#rU~>|sRR=Y%msqE z3=FCm&ea3@3^Bnx0VbAU9N-wuBbejBKq9(rV9>P$7i*jvb)CR5*MUL%jAKmeLJkRL zDlj70L!9OrFzAfWF^=^hhXnHom@I;^RfilBOfoQU0BH^89t zDaW{IKz;~j3oz(h$!Wd-Gml_qH-KJ?V45|Abf7hGuJOQx6U zErv^{N@Hj(1d{~JJc79n3_62wE=d!pF@jkS3_2HZ8r7z7{$d&aY{JkOMC6R9uv?*T zfy%@Snx#}(gj8r50qLLxYlxYBV3&alLWtmy5TRL0IoDj;g*C)%O(+V?GwDo>8YiCGwK^_FkAx+N`p!VQB9gtcX@J}`M^LU z=V^Wd13L&cAzUJuC8Y($aOvCzMvKrmwS<}nhSMAXMoegQL7+oul7ZH4f$2nO#u-po1zbA!fH5UBwuV%VahgnEtO<=eToM%$ zv4#SJM&-D2`z^D-#cWbI8aIy9Q zgU0^2{Is%x{)b2>8W=PJ$Z1Xh6GLcxZQ*WqLh~7zSVCiC2Q@}$<^eN<(EJ1jjR|tG zLZ#6E5Sm-SppijN)61S}QCzw90E5N{IgNHN=zoZG<^Y4Ps3{Hq?F}`c=~q^Ag->$% z01k5tS9@D{k$^;E&>Lpq@Nl+rw|8;&wzhGz>SOPUutZ{sRrm>wvZeI2R(dAP1Xp^d zEHYz|zL-UNEYfF@0gDV-WW*w47O^q(*%Y3 zYzzZ7h5;MHkd0x;#xP`K7_u=8*%*dw3_~`CAsfSxjbX^fFk)jEu`!I;7)ERiBQ}N+ z8^ef=VZ_ETVq+MwF<=rhW;!x9hA|t%n2lk~#xQ1M7_%{q*%-!b3}ZHi2^+(NjbXyZ zFkxeuurW;77$$5C6E=nk8^eT+VamoZWn-AKF-+MQrfdvTHiju1!<3C-%EmBdW05Q4CWeuiiD4vWVi<{;7)D|yhLMP~L>xJaMQr|p0GB7$I44z~|PmxK?EyOVa;sBEX{{Uk&$%M=+^`tP{fIG|}K|eq) zK{Lak2?)G_qaO~ZCWm2D#m}0Rm2Bxr@E%eB<%IC`W&F&r53&DpQgl%b@T4hj(c$3{ z@KkI+--r>xBZfwnNX>Hq%(cM==AKe7`Sg1Ut4y7js2oHWx%SB>$9z4A2 z3hz~jl1S{)1S4dL;5lFRJp|1e!9hU}f~czg0C5iF=Vmd8>$* zf}AdZE|ct|&c7GTDk>rb_Xeon!;KBSlf&0P5GE3$n}%g@6wC`2h^9mYhOH&;uq(MY z`AHpLCyhBN8-JM<(K2&^FH$i7kQ@+t~B&}Tz)wObO_!KbXUQop|~)z zFES`kIDCmlbV~9&FO(@G!F?9{=9%(liQj3+>9E-J|C=rYh5vK?1%53IdN)%=R9?v* z7bRa&Jq1eZFLV=380tkr<*pXmF6V&4RW9>JqVk53Iq~b!hqFyg6wDZD5glXg8|5qf z>`%Otm-Qznn5;9p0AjX|IQ-YDATYf4!G> zr34ps)ccak5exrTEu+_A)BkUJ9Tfi0^*Si^KX{3PlCP*<2c=aJ?TczskedC7@M!ok z$TTuwT%w~Gieb?&Z2Grx$u=*q1F?xIZ#$IJg`iv*3O@g$H*VqAG?h08WgH1?`v1+5 zfWrT|BLSuU2ag1ld_^4zD6NV)65xj#B*r@sDB>561M1aqzue$T9!u!({tFissP6tk zn36BI`{gP^$3EH}^vm%Sp2ndx^eiR6Iy!@AL&hP{8}@JjcGeO_L-OpL914c)*#yWz zMCRqGvg5+Pnq|6DWRpP`cTCRyeqd(u6Zw(3@kjJJ+4436nN-Ryu#BOc6)lqr4qJM0 zD{$Z&je3{9S1USLDMf?BtOBD!J1(Pief>@97BW8#(BCc; zbU*0Yj(L}Ixk5oNDSL4wzi59XlKj2K5A~O>$jUDB-^xg-RZ@XhiKUjfBIA@=po+XO zEww}y8mQDFmHT42)clt})lxJ2C$1PvEyo`TSXL2ve>^Maz_gshRyF z=l#;k@kaudRYcw&?aO)I=cSUp7pLzP-AXe-R^3FW9o zxwkl!TDCtCuhark&4e2BLetZfcc`G`?NB&P;=V96l3B{F6{S|p|585XS19_+*k8C3 ztoSfx6z6YUb;#|q+0y>4Tqv%Lio76ESk{URqPQp(dL^Q;EEO6>abe1TS)wrK&aq1;$ZaAlcc<%6nRrISKyiJyMEm;(sNB@~g1I zZ|0I;5fvY%l;Zs6yC=5 zr-I2Z8XgjX9an+($IESw6(6UIo~e;0Z_zUrn;4nsnV6brYU-Jy4fLm2Y;0(#sc9_M z7sDo4d};(t>!ak5e9`;jr zT5b%#7Jvo30gt~(L~54&_u->$YVf~ER;MPB$kP=I)G5PT_4tcKL3$bjb=m@T@IESH zQ54rkpw2^}E>NH@TA(gope{+EE?uB5TcGZkKwW`AU6DXtu|S*Z&B0^ zGz99j1?u44d&HtBu8lyQhd^DRKwY#zUA#bDl0aR$KwY*#-7$f>0)e_Bfx2RWI%RmT zEPqkd4m1SnxS4yXR28KMZ+s*cMLHXSIuC)mK!Lhwfx38sx+HWT&Gl;N%Y{6%5=6R6V`s526%vk|EC5U2|jsEZb;ix;R%5~xcTsLK|pJ0?(9 zAW&B%P**HarwsEy@E3*cPoPd)pw393&PJflL!d5Dpe|aVE?%H6NuVxWpe|dW?wCMb zfk0i6KwYswoifZV!e11&KY==JfjT3BIvasH4}rQsfx2jcx_E)QB!Rkgfx2vgx?=)$ z1p;+N0(Hd#b;=Tc>w|e*6#e}}piWz$&PbrnMxf3^pe|6LE?S^2UZ5^Xpe|jYE?c1P zm_S{DKwXhQU9mu&vW19P6t+KsI&FbEBY`>_fjSR?xNH@TA(gope{+EE?uB5TcGZk zKwW`AU6DXtu|S_fjSR?xa+#wj0Eaz1nN8l>H-Do(A=E-MNz%P3)CeE)TIm5 zWee0D6R0Z?s4EhvD;B6zhS^N{i=ukg5UA4@s526%vk|EC5U2|jsEZb;ix;R%5~xcT zsLK|pJ0?(9AW&B%P**Har)eWi@Q2-Il{)ENoXp}Bqei=yMhL!d5DfNnShjF#1j zPP$vou)vYSfEZKQ0FR8=Oa%S6&Mqx6*_{c zhn2NpK5x*~?n^OfXh&1z>Z2>8L$^FE^%RLN!+*3?g8!Oo@^z0v)4D&Fak?1vK1hl~ zpNa6_7&M1@I*CXu(Z$baaJroU{{hXc0TkC6zOYUvJr&>`y(kUyDN!q#9u!yP4muxN zTN&1|PEL9g1*SI*bPHtDiy+IZ330MObAi@X!EsCWyGZv5G>rxUfTc8@1T;Qn=+JW= zGiVJ?5I(qeuNA>?S^$=UE|=C)^#b|BukmDMqBfwr0h;f$PKin{k9tmoORqlg)dq`1 zP2oRUXdV4L38zE*LmM=DW#~};x`D=<)}i*Ns2q`?Swia+l|vi+*`T>W>q;xfL(qI8 zbtTGy%3H}>Bx(Tv(NbFeI)KJmfX)vz(`cQdag1N=EoiFx zpi-1xjwU`LQBU}f7Ph?pLBk_q0(WMaS3@M~MyS9#w z4i3-_3HEC(h<0-8Yt_eHM(g5e?QG#>+-wUz?&!u|7 zfA4^pQNH@#0fD1}{R4Hw{Dz6Tin`ZT@`Gbqqz=zdtqvBk-%i2)5n+*GL!vZw`n1<{ z36Ba64IT?Kd23pQg@y-*1j6yOI-rK?H`6^%s~($M^*KApnlubPyl9R5xo1m7m5#EW+BaO1Ioz)8u~RQ_SR*0 zyT9!zozf$7#B=Rj+uh#}y}mow)kJ5O+9ZRe-5hqub{g)Tp6AzUymh-Hxz(If2d0?~ z-1+ixicg&7VW$ID`*yl$+&$OHciQDODa8>FoF{ucPaQg^TUGJq>Q;4CAJ&~eUqz%@ zYuS*(i-pr>#$Kqq;-QMDr?_Qg%u{10?FZ-T9z3KX>Ughmqp8`>8A(SsO7}V?T>9th zIpy?5O>@6)+hn%57aU7m{P_)^U%sK?vhv864Ly9W zyuRsBw`v=s8g{c!eLXz2xBF|)zBaCQ=6+TOlMmiK`}9S7_cONs-#T6CHAU;9r^%hs zBD)I_)g(=yNLQ@OE>^pDU1L_=tHYN^xtz3EIj-jYtJk}^ zd|&3gsaf+!w(Gm71kWF*`Xp)TqC*|7Ht#iO(2Mv94K*~qMqjonGS#x5J?-+h^BO&u zi~HPmot1O3?m;*)d{QnJtEf+1ZDF*@C3o^ijlOSd_PQ}?aN@xyi+e4LUw6N2qQ6&b z%ciD_KD@SA9RG9RcAvYtJuT9HC{L_wziec9WxY3t7Y%;8I_O{Zdls>EYuSgaotI@1 zKS;~UthIHPw)*<1AI9vS_V%;hRM#JtyEQvj3P?8b7uWUC?d_K0G^dJo`yn|O+&7Nt zc(m(A2kC~no!)iWP($bC$4UkH&A&UR4|?qo=A~@2r;GU|<0Mnbibc%|b-h~k*;za6 z$c*;kz2>}Bnfk4hmVrg?5WS@nD?9ISeqP7BW2-sddmBWL`WRrH=vKACB*~fNR(UnM zXPl_!ydiRU{nMvAPV9XC=9Hmlk4X;RTGhnstgZjuD%W3HZi}@4^A83ylkD4G;j4kd+oO_%zYA{X)sVjEwYlDOB**&2h?Ky8_w-GA6xJ&|)o!lV;n@qrZrI(}b8ds}*{{|c5-M#CzGK@aeaF!` zK|zP52cliX)(2*+5ANw0^l@!{$#nNCy~m{c4sEcv@w6(1*PNCQx$z_{cF5A)gEt2_ zS6l6rV|p{ec>9TWProd!J>dO4r}h1O^xiD_@UPv=dLoN?gB+HRcJt0jsBh_-ey6wT zzM~GwP5(V_a$xX@qxVgRra!UlwQX3TYbAJRj}(;5_fb%q{xcJ^!hF{6XxZ zeb;*JD^%4>dUf3Yp8hbiW%k=8^R+e%`w>2BXvV6ox)HLpLuv7rD+Nc9p+>POF_0wZqr!4lX)un_i{k;!~HjSH~8wU;0sL zqjW_bYoku>i}LJO-_^c2$k;A>)04Du11C>cZm2XR>8q{NY$J)~wo9t7?oG<`>8pI+ zCb@FK2>n)-EDy9RS{2^(hIFCoxbqEn+Rt0?(m(&n$aWS}pM7{yrEAX~MUUs&de(hz zJ0o}C;*$?uE~M8zZGXS-*Ip^6J>JJe+;7@g``acJ;|`9C{%zQ_c7g4tStGmckFA>G zG;904OFK8mh922(*kt%bUF!`O0(QMJnKQLGY1>-uDc9^`>!ny2FPU~f&$D`=`r&iE zHjn;s=7sLd^fuMw?)ar|wMd=zV9oKIOE*rrEq*lVyt2#2$kTD=8){scy7Yp&^T%Fx z8GUx`f09`_!+ys=ulAYuol|Od)NWU2?Btm(mbmPH>0zC5XJ!8?wIl7)UP(u-xZTq^ zdx-1j_NIQZdBc+zyJkMOThJ}cV!G4yXKq8Pt`C`=A(>x$b+N zXE(gL(n;gTYCn^=wW;Q~;i8v*)vFdeXIJU^xZS~eE=%+hG)Fy|*|JOOME}$KG$eC6 zt6bR_m4EE$qgTTeQ`8!ih5hS*w`h5ZFZOu~^{q;CdhFH{*|{uDOM6eC!wBFxa%UztMA<^%rwq_L%vqW1+>& z^` zzqj?Ag!=pUH;y)0IVs3E{lP(}ZMQU@nKldZmst$a%0s~Yeo&qd(uU++Mt!EeP_>1<)>E3 z;$?@NmnU1_?l$V<8og$oM>ow}Vl$`XiWQrzYY+Fly1+qeKyT^V@X3Q>w%ltRCv83M z%#JZmlUKz>X>>X;-lBc|yYDpbIxp+BBJT3lh8Np)xgB(FZC&T7(@hpVR3G$ZOw|MV z4RwN@QY!Uc<~H%daf_yvM%w4Mayk%|TE}3JXGcBFs{b0+e&ez{^qE?J1Bs5zdV9NF z$7rj&Y@-9H@0)$QB7%!iFjoDYlo}P@Yr_6GWUk6Vc*`{ zZthC#zGz`sJIl=JPt$%pSGl;cUf*=B563OnT176o5Rm7RZxmrYdsv?19IcgG!}pHp zD6`%vY?D|^GkuNqVx^C7yY)8Q7P-#o;}FeQm(*joU)FkaaM08DHykQoylR{N+Ap?V zg9fkG=V(osTC}O?AOs^rIu~nKYb8Y{%6w$o82z< zD#1-8*;C$L9o=N^S<8468=D$&%b)1oZLJcwqM3E-7}ba8MJvWBM=$s7CYs{Bd!5sz z72@h6W!59oZ-n>`4z{sblDXto=cc!3$gIy4M~Vt(7Qe7ut2F4Q+T-}kU%a|Zs`aLg zH2dDuu1~yevv)1fnzYTQ$YzVjX!FE^Q_t7GsxImLILC42-T5lc8K;l5Yc}oE<0LP; zX#>^sPMfC;pI|1+s=2&}bm__94n98T4|be->w7@lE$2n&4^8s9(=0ad+vb+y4aXc- znYudXE!mfMYuBEIORF|>TKTZ5^;6M_L6Z{-a|U;wVVgNjUCW?vpo7M`%ZrjTj`iBo z@!_=(hQ^b6nC>wxJTt~|WzW8A-;6&RE3-bi?|thYts^w7H@sM3^QFf%vCO*Os^q}p zEb}H7YucJCExmI{EVHgRqxbwC;+QS=>zCEZT3xh8B(tv6Ex(<0-z8qX_BiD4U%w(! zQ)a!@%LQ}JO&bJdMwg-mZSAu4 zTHEv=+PU$QQ66u0FP&zw*ZSWtL#!)ZzrKBIP}0i`ySc6w8Y;1o+xjo-IjG>N$YI_7 zpN2ns2TGml^vr3vXOU#h#RC5^k5b=R#AdD^uyc#!^t6|!cLr^^r(xc9!rE^|_VErI z-X7fVrPX}ah?sUet*sVRtNys=tpgisAD-H=P3B#vg*TOd?w|NAU20ROyLq0ITSL3zS&ue zz_}sL!~I%RIX~NFMgGb01M9SzZ+cFv_QE5UcKf$Qxj3vWoO8SLj&!q0xxMx*m{;2> zd*!}K!v`n3{WI2nZ;WwTt@a0%Tz;5Jn|%Ba2xKD;-lWvxYo!+TVS=eMopJ^8-{itK)nU`4SMC}8P8u6D&N1PZsnV$9 zflf!(^zjr2UaY$-4So+rkNbRM%Q9E9zOcTUTEFwQoy-0DHLcR^$6razonq5rox>U3 z22$IpV|VTUyzqfhPL2D`dM|Bdy-3{r&h8;ks*mWs_4Z-UA=0F%BfB)N=&r7|vhVIz zQwyCl)uzoK@IAA-=?m-C_2xWuN?H8KPO>ds>(QxIfj0+kaN73sRELJMZ3|D>es!Pu z+R=8~_x=}mb?W9i^y0kS@I_`88*&cR+*iEYN$=w1mYdB@Y*yBqIIdO~2ag6iV>=J7 z_049*<9@XVpM83APnW}6-i>uojNjXru3lQ$~OBh`8;1Be$=a- ze^bZUEeG%ErgfZl?{QtN&GpVZ?ytXO=@U1nyqhm8Z86H9XFI#kfZ2yDsc%d*R@Hla zsfOdmD#KFR?3pp_`H+$0@>^}O-rnTo7X2m|Dwi#w+K&aK?u%(SiT{O>A3W0aaG*I9CN^eDd^X^u`cC99ogodQG#q5zSZ zNEbds;2*PC2csA77+70H1o}n=nu%oAZDMF)fG9>ZR1{poPx-7p?d)xR{bBytF?ym? zr}t035)f*+Wp<{L-TQW4i@UYHF!tbgs|EYlc2k|Q_t~Jlm&z07`dRHwzL@i_Uw)N| z8MQpSH+OeRZod2SgTqVDwX1g|9-h^4S>E+clOu_ZvL|_zKCWxAey`mt{n_e|vbQEQgv7glR|JQ(~>%J`3$+uLk@8RIG5e8;Hk z)~~fbtXgK7ykpInVW0Laf7IZ;*3g#gd+nKX**r{7XZ2fG`!U}#XW7gfthTylP1kNK zj;Y`NV!Tw6@iqU2*{yini5|yZ1^TJm&RS#@A2air@vWQPLMsi_u-?<>+~9;W+h-QJ zjL%Zl%WzoJ-KCCZSgQn|`lGKWt!wMD?{d36l5C4JZHA^j{PDfD!#3OQRq`e|p0J2$ zSm|4EEy>(B3)eb*nAZH9TEaH_wgV*7>m+>~eMPV9){q(VdoB+t=j7cr zzN{E~N}4#Z&BT%E)`rrVj#?_x1Z()1t%`Q1bSAx;FF}7-5aDh45;T_1U^L##;6^N# z=1VmBD?04Tku%&v#fy8cgVGiAV>)VypHLPS#U0h*dr>M}eiJ11WjD%fZ&d1bX@W$v zq<~8wwwH)b##bw8=jBgeo#ATY5|Ykz*HU9D$yA!)s3pO*l5ed=)$VL}EzP}Xr2D4^ zsx2FXJcCO}CZ*P~Lpsw!#o!Wm{)UZ- z82)rslP1tCs)6YG(%HB+83El8d6GI)*FvSUGA2p3%4S+?nM&ivYnh7bOpOBNUQNix zPj?{cn6OX8yr5!HbT$3FryeL#CMyXNu@ut5y9PdBgQJ$tPghMQiJ2B`wi6_3W>d9J zK(QiFGPQ9s*eY_I?WpAn%_3nD-cBc?0|{$F{xn5V$Z#8S$HavU#y~Df3bG*&TF6B0HD6VS%NT++~xAYG^_)B+Nq0M=Sk zUhc&|=Vd^4NqbAaT?%%cXI1p`o~hu^N?A%M!+7r-oS}B+8=O+oW+BW%!u9Vvou9r{~SSt5!> zRtX}|KE)}QI4BXz9+a#kss*ntVwUT}pt&$@5jA*ylwoL&rt~QX4ozNzL<%*eU@`#v z)D#+(ST@V3WuV4@+Ne0eT?-m2D1W;8aILe_GYd#%52R)W<&9S7r-|G7Gc~5AJ};^^e+`|ppm$}YIPfzGr(ibB zw5TGFgv&kIyu%qv4Kml77Zhc#wKVQ%3|m>hUH%60%KxlS$?OQv_)MiTv(4^eYX71} zk|3$VmWtiXyM9ZMsFb=Lt`Fs00P@l=d9r~p-1c8+ue^K^*M~7^C!?l@_da#)06mC~ zC|dbxF3?=1=0k@9ga|51Q-u31cK7oeXQgLRoJR`%mrk@Jk6@bRFEuI7|Ewd_JKfRI zheMtCu%ADFauOawtq%PnsSn3;713lC%>lFvZV9O(LI=$rjL@|ig>nIH!rU1^TQIuE za%ym^#%9c!1KNs_1E7XD#(Wm71eA-nW&p~<=rSNjtg8X*ZkTHbpSv;AgHLyitl%>f zBV$l|U?c@ZaSs7q!rWXquTnW!4yXxE`5ud20y=_qp8!!g(5lMhU=^UgcW8^2fT(Ei0X4@dcTi#CwyZ7^oyR&WKzlKAWjS9!`!F{FP!2}(0cB&94rm)jI{*E7!|Nv|7ExS1hfNhZ31_`Q0Z9#%EO#1ASy4ufDU7B0-!?}%>hJ3O9Mnj+XINo z%SBd~UsEL7i5(9BQ7QibM5WgdZnL7c>HwnB>j8*LuMZ$9e?fq#xCwx$x=&&`e!mCT z=1kuS4cauWPzgHcIyn+(j@%aN#EecI>cCS4?+j=o&ggF@N9B`CPN}+*sJbQGX$C(8 zYWu-Avo7=9xOF9wni9G-NF+*ycA-$$rn0E6lA)+ZIF^dgH9!fis**_cKJd&piVf@N z+V3J1va$%>?nfb%iXQr)7y5=qyvBc_tt}&fZ@yk!iQ7PD2@{I+?G)%6amk22@$gn2 ze#yg^aXFx(L==L9Nc0GE&@e<-FhW-p6hh-7|6&fsDZr>1i!=c}$D9_Re=yQvQ71qz zF^B5!Dn{r|G76ajdX2g6fUaRAVUabUx0sUxx{i?}i(CP{$DBK$n;3br2<@Y9nDYU2 z3!?xQ1p)ejxe!3NF+%lEp(sGm4a1&}0dNOz9nYdzK$Y;;selUc))_2H1XKfWod@V1 z-nxiIO99owTUP+OkGH0>Xf2@Hcxwir2YBmd7G(ia!&`C7w1iby_^&OyfgKQ zC(J2w++`gULXN6927odbO;9R{kY@v=qlDi#PN7D?p>r7=UILabY&r+nbWmTdBtq$+ z^Odl4da~&pW79!>C6x~9`IJPmL&!o>t_8VhgKI?%P+N@Z148A8L}eCTbBn&#p4Rx5 zLWz^Dr$mAU4mfj+mLC=+-(GG~ol3B9QSlR{AweH93zbDwWmFdVF=V9dDvGU-qoAT0 zVT6i?c8P+b8CaW@Q8->FB|-sA?wewZ;e)7quJ(#f3qBykti z5ua^#i9hU{=#{p!V_MpXkG)3a9~l~Yxj{4cnrYj5Z)ux+`smmhi>+%X>%80DpjXI{ z=*2@M({)sLisw|TzH89Ue{IgDw9lHab24fElZLmmwm0gx<s7vhPEpMdXFDz7Ael=)S!a3I?FP&`O-aS$^)Tj8>pft%gSbovXJ_v)evk+UU3epRU%+s=ncI z*OXfiPQGYttGd)Labefaw+xV4eH>Y9d{mPXH6$|(-*bxjv21*yGT@JymUC>!Uip-~7SUB&)Za?Mf{pz(GnlNg@fxu9`;~Mkbb|v(0F)+s?>VWUg z)gOCB-57Z*E#pnAi(YaLA9qSr?(r?YMIA*-zArpHhk*1Ve`%87=zE7 zhinTjIAZ=~;oQh!5!VjQSnX+PkTAa}M*qO3qX`jJTRM-jTXyE{;m{Ygn(wH$IIO>8 z!HyO!Gd2x;5z%vh^+jpkXY*3@T}*fE{Ca$Go^zPZ6?>Hx9@}3mnP2m%G{60*gStlgx*c2B z+1z)Wfo0I7I#WBFw|(8aec!#yauzh|G}Ody($9;_5>Grd3a#;Jahz7aZTcCygSgjh5#T zk+Y5amwRX2&bd3Eel(`tj5ay@J*TZ}ai&AR@4ekR7AwoPW5EJygBy*8gG3!z50qB-R#*Im?=-^ zdW-e?w0IH_spfmc`HuU5<*`jp*Y^5k@x0Oct|Ox=XG{xToZnB+Z12HYPj80@zSRC$ zef^_4TXVf`fB)uGXJBHE-H46LCw9m_up(f}%?2+%MyE}@5%;KZz0=1Zr%ao!y!-Hm zgX8brc{+dT=SdwVhU`vXr{rSV{M-BWp0`#UKOQ0RUJ)`R>%4zPu(oo(*X+U9SLM#% zXuQ*S*4b4{KQCCf)6r2)?X6xNyGN}~-(BCsZ*8TXq2>wyB))&Ka-3=YrvqAzC5xnn z15Omj8qHN*`0t2_TL+KmxvJk9J1#_P&6WnL?kYX5-|BK~eBQ437ajL5Y^)?QJhb_p~sUAgSvOp$r(NCbN#oArtkNkWji@-z^dA}c5U$$Jy>Y!w`72C#Da^{ z=ZtbPU%u&k@XUXlylyJ3YHai&%}e#}6i>r0tDlTAn@}t3_~`{|aZe^iPcePJVw|Mf zu=>-Tof=3RS$UdA_YY8RorwXb-6%dXE-c3uj* z@_lXLq@QkwhiZ4eX4P)Pz_q(~W***f?)JEic?GMIW~}K@bKlAV>CGavBD#7{4E26# zsZ({zlFjQk9GT~0xH<1db-zzbmV7J@9WZI&PyhQ#hdzd91z%eew{%lv&ut_3Sq}(( z)%}G2s)l>D+gu7?K6FZA-ycogXS9g)nSXlFf!DnaZ|~iAW!|-fIiEMYuYYUN*46u; zjc;FNf7~nUiwC|%9lk!OwceJ_=fibhq@C`#rN-&y=Kr(~TwlF&_Xmp?9Qbtq`$g#x z(XtCeVykrC)_$b)@p6l#t2s^GBiH0U@Ly`Qyz{LmEkc`Z^!cV=XP5qoky}$H4bHf! z{`u^010|d@VEEu&qB6TNJdbs$pM0dDl>{d$+{1`b>FY zy5Z2O!55$RzSXGHrlRV8&Iejqe)pU_{km;HSihr@FFV%NkGy3(U%PNXi}yKiZrrff zZ?Hfsv}gZ1r&Efiepq*MiHi2J-p0os2jy63PEW5TaA6G51njmsp)n z7H6yMUenm_$S{{TeRlgkFPwj?_p5amc3r!zVlPRqyS-&>FZ<&4eovkxeZFC~x2lVJ zGdJnH$r`VmzMeGO-|KSt=%0_{R)`N|+qlHp%~MN5x^gD-VUso|yT4)EgQ^9g?;mSNry0i%ty-P10W^5nW_}j(<$IqlMKGS@b$~Mn+UG=7!`ehCY+m)8|&(FmcbD~x9lb=34)F|oJ z{2V3izUhm-&Ic^hO&poq>22KY9*LSs?UjBW-u^(NMGLjBpBH%?n;|~E;(F{pP3N{} zKDv(x+Fhk^P2!B2+lrWPtuZGLYwLu@FKD8YS!wc*lYVF6-iSeYBc?4-pOf(*LL|FB zBxr2rC%^rpWxttvteacct5RG26>7?=9jo8JYuNgE*Spg#9_-Y3KJImPHT|7E51qF% z%Bs?Y(JiPvVx;MTHsRU>23*%VxADpyyOY}|?zt>#J^1Xa9lo_sFuGk+KgK;fb8e|3 z9dlhP@rUQ2bb|v{2P-R~A1ReZk|A(=jjmV>qb#u$!=LdAU9VSGq8~YA5`l02Y**-) zL}jJ5ysZ@E&tQeF+bb)f>v^;^_rf&={hf|OR7Nj9v)qvr0cv^1(3?neVtdfxh z7Nj9v=+`*s%BZgoqjZdG8?wNHG^7g#GkGqv_yPMl*I8tN1!+hZ3{>)5juX-(oa-TM zLkrT7E*QY%xo$r{4Fgk54y({V;*f@PpNL*Pmv$iy>8eAxOm$jGI9CMiLK@PA+AWtuk6yJMI2Rh7L<`c8 zF7)&x=PK~%0Z+0r<;tL4NJF~n5w1g)o_jdg0osK$qzeu6aXPuhhvqzm1w!nsbxYyHdRP@66w(vYqOgiHPY)MCzs{tAK?q#<1mf#G6J zPuzKoa}B3mNJF~N?{CiK5L``{b0yF&q#<3630Llyo^Lr zj&>mp>1s;2LNp>RIoB)Ng*2qA8R6>F&~*#vs!I=zAPwniPPlZVtH2OE9YSPCyO4%- zwIE!dH*a_3T%NQGX-HQ~!lk_U+z`&Skai&r>Cz-zjS5s3a;}rK3u#DKE5dcJM(#My zr9z)nkcM=%CR~1*ZoG2}8rwn((vYq;z;G?9hh6_zE*2UzL<`c8E-hd<*Nyk)ojBJR z+J!WvOPg^0yn$x@VfNQH+J!Wvt1aO&-t-B&7RH7C?uQnnAzkf&;c_TGv!pBMYJyIZ zupkZT(gB8ZUC*u$Co3kFIqgCk($$`DP3gB{6z2+{T}VT^(0QJVwKH~ff6kRiyO4%- zbtGJiI;U>pT-me>X-F6B9$u`-Hua$GG39zfyO4%-p}&N2Iovqv*)h(gR24SDf;6NH zx+I=!*4yGPoU1AALK@NqBA)9>M&~HbWkkD>hIB!f#B&WQ4%x-I>}eO$kS;yKwWYcf zuRjc-T}VT^^a|!rqw+KDLK@O#O1P#E>pG3g zVO?}N2@BGYF6btBd%4y3fp98d%GHH-Ar0w*1D@x4eDT;~&gDS6kcM=jzi4r7-okm} zWzOYKyO4%-bthaq-aR?axu(!Aq#<2B2$xRF)n1%y1MNZ@($$l29ZlKK>qRfpE~Ft{ z=7g(W!Vq2^7SS%GAzc!}Wo=T#%V8ySArFfL{*x{XV7NM5*?->$q@b3Tv9QeQhi_L(=3H}W z7t)X}Tf%iA4w4e7EYT&AOMf970|X&2IvE-B&a5va~<8>;9h6f8(Xy6l1B z_Ls=ccpewakai&r>FPzehHtG6ryXX0xzH}8AzcoHEBdZ!F6SCfyO4%-ITEhOm8Nj1 z#l%XWT}VT^oCufFrS@5zYcuUa8q(!VxSob=KFzr<(JrJRT`q*H-c#dj&h?gdAr0wr zC0zSe4kvN0hBaU#EJ#DTdIQ7luk~xC-khrg?Lr#T)rW9xJF0$)bM>TMNJF~Z2-i=I z^iiB^0PR8=(&bLLOdf~N;9MhV7t)X}55l$XL60=fwSaaZ4e9DjxWc!-!wy808Yi?zM$ajv(t3u#CfTwd_@ z^7vh|eK=R`ny?WTq#<1cf#KT5qrK_8^RhPWLK@Nq-8#=@J0R#P7t4}%Ar0voM7V6; z9G%Fyd}$ZbkgmamtJAEcLe4dcb|DSvf+o((q4g8}O`K~M?Lr#Tj+$+@c4f{m~s4e1I1 zhTF@1t6ja$xmwXKq#<2_gzMIK|3;jvJMBUm(lvx|oo-ZXKIiI7yO4%-4JBOXr6135 zu3@wbX-HQP;kxZUXffxCr(H-xx`GMUK*LIKfyV6RRN93!q-z-A@(wgu%enT_E~Ft{ z!wJ_ngSU@4*A?1@G^8tpa1D64H-dA0qFqQsx zu@|rJ)umlXL%PBUm&HJj7hJ4fv7 z4s3)4X-HQrFx>u{IA=VspEssmNJF|N6Rzj&U-jf-dC)GTAzf1lmw(Gs3pv*)+J!Wv zD~@oz^_e)Eb0yI(q#<2X30HvYm@k|wn|2`$>53;@{)yFdIoDO%g*2pV8sRF=t$mtv zeWYDTL%OCDuB?oGZ#Y+DHP{FX(vU9bYI*ys?b2LGm^l-f(k`SST{8(+tJAl;a<2Zg z3u#E#EW%~!`T$PdOsp}q3u#DK0^tf`_nF@AzkwcmukJEaMUxd3A77oNY?_wHDGTi-ZelP?Lr#T1qUIoTxVu>ROVvk z(=MbTU5g0Ud*?`KK1>c@&@QAQT}gz?Z(`IB&Q+%#Y=i}ANEck9@p8CV&22d6GN4^Z zL%Nm_t}dGH%{Z3_?Lr#TwUlsuNa+Wc;Y_*4&@QAQUCD&YGj~Qf=UPg;kcM4KjMyxMrzZ77^}m~wTZT}VT^(g~Nho8bk{)th!94e44(xDH6IR5;gY+J!WvYdzue zK6$o?bFHIYNJF|Z2-mPB9ba;;0@{T%q-z7=iiu9=?Jp$_*a!>KkgkouaP4r2*y17= zt26CF8q&3iaJ?4ULeZI;ccWcML%QH1k{4^z*lw(onm2%rupkZT+6D|) z^A8W*d&{{7&@QAQUE2v)vxC;WYk>LxAA9ctA60R_kDnz0A}Wc33W~bIqEQf&5Fk)A zyU8xu$R=5Gfk2T>NH!!Al9+6`SZz^Ip@_9!s`ZLWt6wiIRja7g#yehW)!KTgwpyz~ zQR}4_+gkZQ?>jSR&g?A<`2GDapZ`G4zUQ6idEc2iGjrz5nRAY05yoWQW3aGLEuei3 zNETsC*1ZPnpZEOAk;0)zAQFKvChO z-EXiS7`@)nv)wIOgfUs$4c2B?O}+N@s$>zyWIbT8rd%=USJ!r5B`cL?m zW*t2SkqCq_S-1pplwt7m{56_&x?~Z?WMLrgV2wTXt8&eXNfu#D*24ztx8EM_(yW^$ zi!dhZ5reg}t{KIwTFN7mMHrLyOM{hN{oMi0dQ-9pW3m8pKTubZV=J(5Kjll6qby5X(w z;uNRK@CTAb7?bs+!8&kj)+Eh(M6w8DvYs+n*I$vnShL=fEW(&9bhVB$9Q(-Jq^FlbV&-$)i=Ox7y~>)8oc z<0PzDLs63{5XNNv78+fKi$~q)7;h9y7GX@*?+n)1@Vo!ezM_&v7?bs?!TMg)pU=~* zOC^giChIkWHGak+Yc%U&$s&x&dfi~%JN)pGn)QKX5yoV_VX&su{p@hf8g(=x5eQ?l zeh-ZtV?vjLG_=!8-lw+4D5(RmmcZ$$HyhP3_zM9nJcyWD&+>y<@QMyME)~@p9jy~!ql0_Jk^{K(~UR#FYkMi}XWD&+>;S$JE8b5me zuE#X%J;@@B$@<)2efe1H{hBr0jYtH-n5@4+qucV)|M+*iW*y^3Bm!Yf*59Ggto(nJ zInG}*-H1dWjLE|3%E3C{b?t51*E}~O5eQ?l&?Pxo#l<%{>U@tIkqCq_Szkb-QXx1HWL?RHzWc?c&&5B-pJ1T-Y%1^oxi9i^W^&e<7 ztLFTnztgNgxDkm!7?brSG@4cDd10nz{nL#|1j3lC|3af#Gymvu9Ob;@h=Z@P;m>4! z1&wC)zIEUX?Q61R5yoWgF<4K;MxU=)6_Q05lZ97iID8G=y5cO&S}IwDFmJD>jLD)WjdU5FIlklq&3Z?& z2xGE_8m#;iy0>Z8$nhvV1j3lCVFv4OPhNJ4W*sY8gfUrkEv{3z^n@{enpG%S;(Fcr zTw9L8s>^xzGR>-#EW((+@H!=jujkfZu~V~_N)};E)(C?&adMrb48JW|gfUqM8m#wL z&Ble@5K(m2Rgy&*lXZ~6Iw|WAuV!tNEW(&9yu!(muM3a=z;V2uk}SfQEPCs#F8Kqe z|2d?6eJELkFN=|#$+8~uwMF~_r9flT_#zCFl>aaS*;CFO*B{ylg@idv$jeWVNBNX2J3~#);oIsMp{sPjL9l8 zSfR70Jf>N%NETsC)>MNvYRiISHS6z^MHrJ+Y_NWGhI^-GJyJVA3?g63hVneI})eg_RsotD=86`E~^=Fk)9>%C6QG-y!a9jqnL z(5On=`8G6EzqIB@(1Z=mW6)e`Xg-AI6GJm9A9hf*+RhYc)*6~hXa)>T2Q>8J2+i6+ z8iW}xmG|4EhDyG}^>9|Qw<7KUX02i8&(OSRXsi>F_hC+7$3f%GacX?fP$+RJ?@Ogd zcz+_P_jSMw7?D+`p_vR#-hoa`Ei?s&=G)MO4b5%P z^cb2Q&}=g_Lnm=Yu~9ia+|YPJ)jakQwT|A?p){fUY>OLQUEMxxh{r8z0G%f&bgMfB21Cx%ouA*k7mtc*1dq8jK61| zn?MtjGSo;GV_4S>4Jw`R#hRO-K__Tw%*)W^85q}Oi{CD)F{en4NDmpRg@%R-8WV%Y z4UNWJ1xo$TItS(*Xl5Ij9AvD-z?=e2(8f5+@EcqjltT&|rZ#*q!-WRTp@9kr zfiXrI&Sus@h(lAgCe_^fnr59VS&SjNwG|pKes#WfKvNHm&iig?D1{o6JH@h^3``L; zVFU9`XgUqdI%rxA%pK6IwlU7U(>q$ST+Y0g*m-{$EDDS<@_t%E-Zkq#lEoP2Prw+D zQmFG)0S$(Wj=Y}e93pe7j z@h1YhZ4S4BMWsR*bL8Mn!+Kb<2xGE*X;{CNEW((qGG^t;G?`bmAA?1KFpA~D9Drq& zGs^>sYUT;iiRTeQgt3L`aKtER)J&@#`G0n)@aGP!Mgo< z&8n0v!kDZ%%%ZjfK?aq=C6YxLlU2bi$`@fPR=z$<`|6V{!kDa}%}Okd?@Jb8z;cvE zC9@{N4+QIw{6D>-ecdiugfV@c&MZ|L=MJA(rddx)7GX@*T$`oJK(pSIEW((q5VKTi zG>!W5AyGoXSujQok@9h*a0qSI(&{_tjU{R7WZrD*chLuObj3Kw4C=vMf+rEog&+%WHjg zL4QM4SlDGZ{=odo>iR(K9A9}L;;*cmYbC17{k1h!N%Ub~ZG9!BI7wW+FC0jsUQkD=52SE4zb4dBm5f*gMnhG3&{tg%s7+#cPN*gvUYI1J+@G3MS6@?$Vh-2T)+b@k zuL?CJ%UWHaE(y9WP&>a8WtcJt!AieBP@Ouyp&B(H;E(vq%L8?Fk=k%oSu!`}RgrLT zVIAs9C_)FXT$WZHMffAZfG<=ZH0qPEBICopy1M#cZB0W(Fj84P-(Ojk?8uhaRHY~s zWHV6RP!%a_sEd#gsP&-`E&o)%uc1B|sII3<9PrO;2-Gf&gllW+1La&pk^|__R0l%T z1X7p~Sp>|FmXN|o?ZR+<4US43RmJ3(+CW`>ZDl!9Ru}Zu2K?BsX{ap^Aca)g8RbEp)r?R4C??#36YT$ET9G$>7_ z(;&`l$~vQQW^GB6v~;-<&bXiV1?mcmN+RX;++-XPNOicjGEncUT}WQ$1{MYyMaLDX ztph7k;|ql2WBiTteaZTWDs;@{zFL2zHsJHC?y}0)7zx)b2-HUEeCYElWG7ZtS)ELc z)N&VNGOBALbq!?|=sv=Hma=@IkYLx92Ln||Ce;^_BxVYABpj%%tEtA3tCwB0552aWfq4y;=s{ROuVUinSNa3G zj09KcxHu9Gi%9f>H4A+>Ehe+(^ZU>+sk8#tqgu1$5-;xpd^oy+~74 z4VqF-tvvG1GdR*9j(NByREZ-X%$L}O-7_S8C(CwfFpn+qwU=M9oR>~Uu6@mIlMJJk>f(IC6|_OR2vi4ZE6_dr=2Oj;rvzcnh$^F_jgeqnEi*B3eTxz4 zJk~Oa7{=72m6={Sr80(2E~-o8>X}4O$J@T}NfIBzuqT880*2$-7?d?(jN#cCm$=BX z%B7hkrA3>=nYJ$222`g$7a#Mc!u=m&tVgzD>YGI3Tj&9|e`@m5wf$SbAP z@ex^i$q*R3rnMmA6D`c47Rh6wP$gQfC?M@1E;^AfIs=h^!O>bbcprzit-Wpf6L zw?`!L?Odmm%p`#&rk8>KfEeKnVlNSv!k!v2rOBgCoE-Qh97{80$!kn9%wTEKy?x5! z!ucSD6Q_5uBocQoIy&A z?DeStF+}IFFwVkrXu3g7al~0o%Se$?M@p#6nU4#S$b!mh423oi0S;E%R7OG^rH*ial;ieoQ#pAE?6QO6mr}Ae2~oR5=X+F^@MFdC)B& z?rg2g-GJ+gWsdt&zz1oA$xSD(a|V_M#iWoUlN8=JPw18WL3h&4OU$=bN# zR~KfIc5EPhbLP-I$ihgllIAZLVir(#mYBn(xi}sJrYMF4a%P9xrY#82bzqVTZzQpX zMuoUs#!QWvn%uDuNxpIJPiMle%IQEx zRZ9oNbPo@lf*9y0O|cU|7guvKLnY?WFhnzI4b@b*@#a#%67AVXBp{lRnl{tbCK$kV zRZRuXfpk_)-c1UO?jMqMLK2gct#P!7{y}} zQpPxj%Rb!5L=ETpd%krgSeTNiTToeF9u)J37%MlPwSg)h8kH(S zg%Edmc;HYGswu;*MPoipn3H$d?DC}_IpSsuaZw8FkmZDaT-5xxYk8Il(~Rnn$Qlu*V!$bm2O+YWh`TjrjK79zNCJS4;viIX ziN1QDwrNw6MbK?-y6H;YE#EVuRB%;sL8}HN8@4l@o1d#FzK$rXo@v9SeE+fH7I&!OGPMv8CIczx4;5i zbRsV}pYc2-BTc=SwB(2?UpYoTYHmwTZp&g5?UY-E8BrT9$5~e`2*G@$D(Gq-mS9A} zl~}Ce(3Usg8U#1g#5B86K^!P9Q9nM^U99ww|zqhT~36hFJ4e_-$_r#*TT2a#<>*;qSp>9=kPkDQDN0)}oX>N&i z_pZ?jkxacW0f}xL8o^PDj$Y&&A7+;}SbuLcE+)CQynks5 z{QU0D{uQa>qP-~Lvi`QVXm6aG%C6QFF|yR-@WM@;(k|^d{e1T8kG6C+_cq5my1SCb z*R?mdCZsFeu{zqBG^Q@r9E+B9cDF2#vo^0k+Pg;Rg3->NXm54%3RTtAkqW4KW*)0} zwa!p{%*?>*nw8Ps&gM0N)v;(-A2OBn=+EzHjdq(czW!Kyv@6!pg7mkda&~n^JL9rY z-n*tJ)?F9vBfB%LNDt~o3wkiCv~;R>p|3F>bMQNlW8JQ{&(@P_P^zo<)6_tgl zQXL-`m+WNGX1bFh?1U$aG*X@(fTYj&6{SpisyHffDic(UBoLW=29f);D6?54SWDV6 z(xKuSM-r&rKH}` z!RD^k&S-CWdlX}@NTe^?(%;(=TN7y^MWm&>dwECH^7MDD>ga0qr0icj{CG;5cx52t zMyo7lPEal~YwgN@hG=CxbswP&ra{<73LQs+J8;!3Z6m1>%E%!7jyeIyGf&FqmyFbsuM&N&~UY;N%$BRVFF-ln`Y`lxQ-T=z3I=2E{3Z>MWNeZPe2$ zdxOE0IV#m;sZ$-ZvNtHsHi&Xd(*4kY!?u+MqRdcv4AyNcdl_L3!<6I1u8+n6iARNt zCoNc+-k;u8w~*21MzOJ*d4eI4z44@`zK43TL<-p>TS^jA=6pXOuu&SV9qUTTn2)xEOmyg$1m3 zH;rh$@L+514_}HLbEIYArAZv7;BuoSwlXSrEqW8iIQ;yNb4Agm{mVRc3P;c8 zmD0mVj^MTO%A8N?QPd~+`yc@q_Bx-dC)~>;E$h{6yp4Sn?cr%S{JE`gQ#=l@Kd>qe zCxi~}yhPl1L_Y%D+Y*axS&VZ$g-aIbX~Dn5+4JTVc%9GP5{{mF`wY0RB$l$oxFq(* z9YG8oQrYtWS0J&e?9r2x)xbRK#94{yTMyh$U^?+G3JS;J&r3MRGf|{($KQQpNpb`{ zC54J}ia#*N*AS`?RhG>f-{0TSI;FE?>G+iDIX>JJm{V0*SLMSz_^k1fs=D$B?#G^5 zIJ2Mtw1jv(g2Yd);LccCLq&vF-JO~YS&J*fjuq|0X($gDD=CT}9c6Igs%9==JT@6;8_%S~l4wTaqKecu2+nML8y7?f)S;rDxnuDtw z??&ykKE)qBt9^#$I)n*ql3;R(#&b!#E!f&h9fjB&qV$FrdkG(#;KB5_z7Oo(aGs~I}WEZgAuu=(>3V!HU zg42Rur=BeLLLZaBFk7SwXNLVv-(q;^g>CYW>{_9XA&)z>(eD`(+*t3)!(L8s-G`0A zb?4xKKH(X z3kLd+dfM;t{1*mv1dMog9Rzc`eyQkays7E=3H1D3zXEgDT1AJg{v}Dg#}4KcKg~}& z?w*wvfh6o6gTziw@HTn(QjRG|h$+||q(bVkVkgn>YAZHgXEV4d z>BS7TOntD_uXV$yW7mUS9HsBDg{QoE3N~88w$pEL`G7U`nIOusplxGl$e|)J>z>G0 zDNjg$$WxFu*>RamFvSM_R6qSxKdE|h=`0AI_aS91xQX9b5S;o%aN~MU0W|A=;c3K= zD>hn6R&2y}I&!=2;2M0fCyeNwBJ1mUXVb-=9_Ti1pv(q03FXs{60%`rd1DR?H$kvs z2LnqIHHh6gIIwPdP*_>O@po?wW~<$GC9c@%YA3jE;GiJ4k?n}wNeP9059*i4iXFg>=N;&f2uk#j*a#_Q^^b)S(ka8t-F2@9Tm3j>jsn3;?$hV!a!Of@%sv3&+KAg*XciHY^ zIZ_rar^Emp=a*3-a*u>l(He=PodQx$eV*yT^PccxH)7T`svvRwm#84y*B+`4^Q5=U zYSM!k%G#y)UALVMdUoywbpF>$ZXKvN|D=j@6zZ6YI&XE(g==x>M{GyTo?Y}t6%{3F z3@U)F2@cJN@zACLI=oxh>%|`WEY+UFfMVEf*n664jWu;(*WGBi%9=>n(AXiS!qvZ0 zD~we3JIHaVT;zz_>r^6LM>_Z-T~_V|-*sek-F71>e?e!eQW=+&Upu0bC58LC%@>Q( z;`0)!0Tr2VJD2QcS#qK`M3qAFz6G1P_j5 z8F1*X#hegP-vrC|z*uXD#kAn27lXD_@Ct}mz&z@ckyyV>Y*7A|$lqcd6>h!7LF#}g zC4S#_p%kT*%xq~sCjB#mIkBNnA>WqFee7^Y zbZ}U|`d@-TbP09dniO_H@Q_kxpf?t>Mt z)jynjv)y4%B+`|-Q=)XD02?=QK{<-fyOE1oY0zR^QwOM{?x6;uJ8J5Cbw@46Ge~95 zCU16P_l^Er4L##VK2%iHdDeTpG@2?=CCRPCn};z|+{nW@{vdyPRFvZw6+y;{gbIKl zUVBuO<2>h6)LJzviW~jp@aV_Ri9IU8sF}urjamH%22qu$^IyCB02WbQ*OI?{s#U0^ zeoxr!3b^~?p_QW(anoURqca%Jr<>hFP}=LB2-=<<`JGQgq79rYVTy)C)PaMPy`gdu;vl@8(-!t?l2_ek#G(~nWYRWihBdwM#!$ei6Jo9V@Y>v2>KN@8S* zkpmvzaV2n;WC=>pP3rAK zSAez$hjPyheo5aL(jaoQ1me6y{aAy-b;{#kM|(aTwu0!6o@lenqy1-kZ2&5ZLNhgj-`)n-G3k*#kxf(M$8ricPS*A zH_VQoZ&4?`5~|d}VD3-p+<^M*6-|n2IJzfNQd1Jro*lFkrUv4+R-qgxgjlKod?@8 zmhx?BGNdNf6<}M=5_OS6qKdwhb+fVcv*fiU+HYlD5ZeGtR40TKhSbKodTi&gM0pSr zrMI1RP1shjM7D%PF=w)_6I-&L#Ya_0G3=8*i{J5B$Bf4jy&s7YB4+n>Fy()*t*U_l8em_g}c@%spS-efg@dJ{ff( zoN(~AUs~9B*OAd8ddfSeENH z5#iW6?-Jq60L&*c_Pqgoj47J?gt!lwtf_ByRNJC*eZ^cGvo=(ubA~nO<4(aCo;Ens#UgaI`drCV850V%C~rh+k`HPKD-0L(>M07pG~>x&@j6LqkKEwFfyd z)2QNbP-&i*pjnZixhz4mJwfw_1Wh(oK*LuxG)*|!>olJS%@#wm#b8CSKx}zmY`JOY zX9fmuf~GMh2TFu~hcc-M%9=tNlu$sSI56S}IyK@5Di)a*M^IsC7&`zXrX6v-B!(dJ z=tvEn9^}!H8cwq~I?6I(MEOWfVG%TR1~<5m~Nw6>0yDK}2b9cQ>Ba>FWtM$J)ih^QrT&#JbEXT`AX= z<1rCh%x^}vM(F{bN`KPG6;UiVO&Ze!FUcbCft^AuXPGgBKD7g>XlfCyLaNm3?hC`y zeT@a)MZCn7*5Bhi+S0QoqL$NRw=>#hmCDnr7fdXUi!9&`FB!Mj;)~Vgb8ttU^0h!O z(iah8^=t~YT&lmIqpLQ$3^_?ytDh>SrYG9vO%fTYMhY8(cspSv;`Q?Kc6!F3G&SCb z2bc=aG-Tc%c8MJYqYJozZ1Wmoe?a^ zO4Z6_1&A*mS^etUJNo>coz8w#wN?-t@a!a>XQa0QqN|ftk7}$w_bfymqed({?7e=J zA;lR(E!$0XMzNoTNPYHDCek3(0^|MZxRjgyvY`?(cqgdbWq`De7N%

WMYm=-^0Y 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 literal 0 HcmV?d00001