/*############################################################################
  # Copyright (C) Intel Corporation
  #
  # SPDX-License-Identifier: MIT
  ############################################################################*/

//
// WARNING:
// this file doesn't contain an include guard by design.
// The file may be included into a source file many times.
// That is why this header doesn't contain any include directive.
// Please, do no try to fix it.
//
// NOLINT(build/header_guard)

// Use define API_VERSION to set the API of functions listed further
// When new functions are added new section with functions declarations must be started with updated define

//
// API version 1.0 functions
//

// API version where a function is added. Minor value should precedes the major value
#define API_VERSION \
    {               \
        { 0, 1 }    \
    }

FUNCTION(mfxStatus, MFXQueryIMPL, (mfxSession session, mfxIMPL *impl), (session, impl))
FUNCTION(mfxStatus, MFXQueryVersion, (mfxSession session, mfxVersion *version), (session, version))

// CORE interface functions
FUNCTION(mfxStatus,
         MFXVideoCORE_SetFrameAllocator,
         (mfxSession session, mfxFrameAllocator *allocator),
         (session, allocator))
FUNCTION(mfxStatus,
         MFXVideoCORE_SetHandle,
         (mfxSession session, mfxHandleType type, mfxHDL hdl),
         (session, type, hdl))

FUNCTION(mfxStatus,
         MFXVideoCORE_SyncOperation,
         (mfxSession session, mfxSyncPoint syncp, mfxU32 wait),
         (session, syncp, wait))

// ENCODE interface functions
FUNCTION(mfxStatus,
         MFXVideoENCODE_Query,
         (mfxSession session, mfxVideoParam *in, mfxVideoParam *out),
         (session, in, out))
FUNCTION(mfxStatus,
         MFXVideoENCODE_QueryIOSurf,
         (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request),
         (session, par, request))
FUNCTION(mfxStatus, MFXVideoENCODE_Init, (mfxSession session, mfxVideoParam *par), (session, par))
FUNCTION(mfxStatus, MFXVideoENCODE_Reset, (mfxSession session, mfxVideoParam *par), (session, par))
FUNCTION(mfxStatus, MFXVideoENCODE_Close, (mfxSession session), (session))

FUNCTION(mfxStatus,
         MFXVideoENCODE_GetVideoParam,
         (mfxSession session, mfxVideoParam *par),
         (session, par))
FUNCTION(mfxStatus,
         MFXVideoENCODE_GetEncodeStat,
         (mfxSession session, mfxEncodeStat *stat),
         (session, stat))
FUNCTION(mfxStatus,
         MFXVideoENCODE_EncodeFrameAsync,
         (mfxSession session,
          mfxEncodeCtrl *ctrl,
          mfxFrameSurface1 *surface,
          mfxBitstream *bs,
          mfxSyncPoint *syncp),
         (session, ctrl, surface, bs, syncp))

// DECODE interface functions
FUNCTION(mfxStatus,
         MFXVideoDECODE_Query,
         (mfxSession session, mfxVideoParam *in, mfxVideoParam *out),
         (session, in, out))
FUNCTION(mfxStatus,
         MFXVideoDECODE_DecodeHeader,
         (mfxSession session, mfxBitstream *bs, mfxVideoParam *par),
         (session, bs, par))
FUNCTION(mfxStatus,
         MFXVideoDECODE_QueryIOSurf,
         (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request),
         (session, par, request))
FUNCTION(mfxStatus, MFXVideoDECODE_Init, (mfxSession session, mfxVideoParam *par), (session, par))
FUNCTION(mfxStatus, MFXVideoDECODE_Reset, (mfxSession session, mfxVideoParam *par), (session, par))
FUNCTION(mfxStatus, MFXVideoDECODE_Close, (mfxSession session), (session))

FUNCTION(mfxStatus,
         MFXVideoDECODE_GetVideoParam,
         (mfxSession session, mfxVideoParam *par),
         (session, par))
FUNCTION(mfxStatus,
         MFXVideoDECODE_GetDecodeStat,
         (mfxSession session, mfxDecodeStat *stat),
         (session, stat))
FUNCTION(mfxStatus,
         MFXVideoDECODE_SetSkipMode,
         (mfxSession session, mfxSkipMode mode),
         (session, mode))
FUNCTION(mfxStatus,
         MFXVideoDECODE_GetPayload,
         (mfxSession session, mfxU64 *ts, mfxPayload *payload),
         (session, ts, payload))
FUNCTION(mfxStatus,
         MFXVideoDECODE_DecodeFrameAsync,
         (mfxSession session,
          mfxBitstream *bs,
          mfxFrameSurface1 *surface_work,
          mfxFrameSurface1 **surface_out,
          mfxSyncPoint *syncp),
         (session, bs, surface_work, surface_out, syncp))

// VPP interface functions
FUNCTION(mfxStatus,
         MFXVideoVPP_Query,
         (mfxSession session, mfxVideoParam *in, mfxVideoParam *out),
         (session, in, out))
FUNCTION(mfxStatus,
         MFXVideoVPP_QueryIOSurf,
         (mfxSession session, mfxVideoParam *par, mfxFrameAllocRequest *request),
         (session, par, request))
FUNCTION(mfxStatus, MFXVideoVPP_Init, (mfxSession session, mfxVideoParam *par), (session, par))
FUNCTION(mfxStatus, MFXVideoVPP_Reset, (mfxSession session, mfxVideoParam *par), (session, par))
FUNCTION(mfxStatus, MFXVideoVPP_Close, (mfxSession session), (session))

FUNCTION(mfxStatus,
         MFXVideoVPP_GetVideoParam,
         (mfxSession session, mfxVideoParam *par),
         (session, par))
FUNCTION(mfxStatus, MFXVideoVPP_GetVPPStat, (mfxSession session, mfxVPPStat *stat), (session, stat))
FUNCTION(mfxStatus,
         MFXVideoVPP_RunFrameVPPAsync,
         (mfxSession session,
          mfxFrameSurface1 *in,
          mfxFrameSurface1 *out,
          mfxExtVppAuxData *aux,
          mfxSyncPoint *syncp),
         (session, in, out, aux, syncp))

#undef API_VERSION

//
// API version 1.1 functions
//

#define API_VERSION \
    {               \
        { 1, 1 }    \
    }

FUNCTION(mfxStatus, MFXDisjoinSession, (mfxSession session), (session))
FUNCTION(mfxStatus, MFXSetPriority, (mfxSession session, mfxPriority priority), (session, priority))
FUNCTION(mfxStatus,
         MFXGetPriority,
         (mfxSession session, mfxPriority *priority),
         (session, priority))

#undef API_VERSION

#define API_VERSION \
    {               \
        { 19, 1 }   \
    }

FUNCTION(mfxStatus,
         MFXVideoCORE_QueryPlatform,
         (mfxSession session, mfxPlatform *platform),
         (session, platform))

#undef API_VERSION
