From 3cb8aa05f8cee9e860cf83531682ff0ed4af6a4f Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 4 Mar 2021 23:36:40 +0100 Subject: sync with upstream --- .../kodi/c-api/addon-instance/video_codec.h | 261 +++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/video_codec.h (limited to 'xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/video_codec.h') diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/video_codec.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/video_codec.h new file mode 100644 index 0000000..02d8b06 --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/video_codec.h @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2017-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#ifndef C_API_ADDONINSTANCE_VIDEOCODEC_H +#define C_API_ADDONINSTANCE_VIDEOCODEC_H + +#include "../addon_base.h" +#include "inputstream/demux_packet.h" +#include "inputstream/stream_codec.h" +#include "inputstream/stream_crypto.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + //============================================================================ + /// @ingroup cpp_kodi_addon_videocodec_Defs + /// @brief Return values used by video decoder interface + enum VIDEOCODEC_RETVAL + { + /// @brief Noop + VC_NONE = 0, + + /// @brief An error occured, no other messages will be returned + VC_ERROR, + + /// @brief The decoder needs more data + VC_BUFFER, + + /// @brief The decoder got a picture + VC_PICTURE, + + /// @brief The decoder signals EOF + VC_EOF, + }; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata + /// @brief The video stream representations requested by Kodi + /// + enum VIDEOCODEC_FORMAT + { + /// @brief Unknown types, this is used to declare the end of a list of + /// requested types + VIDEOCODEC_FORMAT_UNKNOWN = 0, + + /// @brief YV12 4:2:0 YCrCb planar format + VIDEOCODEC_FORMAT_YV12, + + /// @brief These formats are identical to YV12 except that the U and V plane + /// order is reversed. + VIDEOCODEC_FORMAT_I420, + + /// @brief The maximum value to use in a list. + VIDEOCODEC_FORMAT_MAXFORMATS + }; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_addon_videocodec_Defs_VideoCodecInitdata + /// @brief Video codec types that can be requested from Kodi + /// + enum VIDEOCODEC_TYPE + { + /// @brief Unknown or other type requested + /// + VIDEOCODEC_UNKNOWN = 0, + + /// @brief [VP8](https://en.wikipedia.org/wiki/VP8) video coding format + /// + VIDEOCODEC_VP8, + + /// @brief [Advanced Video Coding (AVC)](https://en.wikipedia.org/wiki/Advanced_Video_Coding), + /// also referred to as H.264 or [MPEG-4](https://en.wikipedia.org/wiki/MPEG-4) + /// Part 10, Advanced Video Coding (MPEG-4 AVC). + VIDEOCODEC_H264, + + /// @brief [VP9](https://en.wikipedia.org/wiki/VP9) video coding format\n + /// \n + /// VP9 is the successor to VP8 and competes mainly with MPEG's + /// [High Efficiency Video Coding](https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding) + /// (HEVC/H.265). + VIDEOCODEC_VP9 + }; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_addon_videocodec_Defs_VIDEOCODEC_PICTURE + /// @brief YUV Plane identification pointers + /// + /// YUV is a color encoding system typically used as part of a color image pipeline. + /// + /// These are used to access stored data in @ref VIDEOCODEC_PICTURE::planeOffsets + /// and @ref VIDEOCODEC_PICTURE::stride. + /// + enum VIDEOCODEC_PLANE + { + /// @brief "luminance" component Y (equivalent to grey scale) + VIDEOCODEC_PICTURE_Y_PLANE = 0, + + /// @brief "chrominance" component U (blue projection) + VIDEOCODEC_PICTURE_U_PLANE, + + /// @brief "chrominance" component V (red projection) + VIDEOCODEC_PICTURE_V_PLANE, + + /// @brief The maximum value to use in a list. + VIDEOCODEC_PICTURE_MAXPLANES = 3, + }; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @ingroup cpp_kodi_addon_videocodec_Defs_VIDEOCODEC_PICTURE + /// @brief Video coded process flags, used to perform special operations in + /// stream calls. + /// + /// These are used to access stored data in @ref VIDEOCODEC_PICTURE::flags. + /// + /// @note These variables are bit flags which are created using "|" can be used together. + /// + enum VIDEOCODEC_PICTURE_FLAG + { + /// @brief Empty and nothing defined + VIDEOCODEC_PICTURE_FLAG_NONE = 0, + + /// @brief Drop in decoder + VIDEOCODEC_PICTURE_FLAG_DROP = (1 << 0), + + /// @brief Squeeze out pictured without feeding new packets + VIDEOCODEC_PICTURE_FLAG_DRAIN = (1 << 1), + }; + //---------------------------------------------------------------------------- + + //============================================================================ + /// @defgroup cpp_kodi_addon_videocodec_Defs_VIDEOCODEC_PICTURE struct VIDEOCODEC_PICTURE + /// @ingroup cpp_kodi_addon_videocodec_Defs + /// @brief Data structure which is given to the addon when a decoding call is made. + /// + ///@{ + struct VIDEOCODEC_PICTURE + { + /// @brief The video format declared with @ref VIDEOCODEC_FORMAT and to be + /// used on the addon. + enum VIDEOCODEC_FORMAT videoFormat; + + /// @brief Video coded process flags, used to perform special operations in + /// stream calls. + /// + /// Possible flags are declared here @ref VIDEOCODEC_PICTURE_FLAGS. + uint32_t flags; + + /// @brief Picture width. + uint32_t width; + + /// @brief Picture height. + uint32_t height; + + /// @brief Data to be decoded in the addon. + uint8_t* decodedData; + + /// @brief Size of the data given with @ref decodedData + size_t decodedDataSize; + + /// @brief YUV color plane calculation array. + /// + /// This includes the three values of the YUV and can be identified using + /// @ref VIDEOCODEC_PLANE. + uint32_t planeOffsets[VIDEOCODEC_PICTURE_MAXPLANES]; + + /// @brief YUV color stride calculation array + /// + /// This includes the three values of the YUV and can be identified using + /// @ref VIDEOCODEC_PLANE. + uint32_t stride[VIDEOCODEC_PICTURE_MAXPLANES]; + + /// @brief Picture presentation time stamp (PTS). + int64_t pts; + + /// @brief This is used to save the related handle from Kodi. + /// + /// To handle the input stream buffer, this is given by Kodi using + /// @ref kodi::addon::CInstanceVideoCodec::GetFrameBuffer and must be + /// released again using @ref kodi::addon::CInstanceVideoCodec::ReleaseFrameBuffer. + KODI_HANDLE videoBufferHandle; + }; + ///@} + //---------------------------------------------------------------------------- + + struct VIDEOCODEC_INITDATA + { + enum VIDEOCODEC_TYPE codec; + enum STREAMCODEC_PROFILE codecProfile; + enum VIDEOCODEC_FORMAT* videoFormats; + uint32_t width; + uint32_t height; + const uint8_t* extraData; + unsigned int extraDataSize; + struct STREAM_CRYPTO_SESSION cryptoSession; + }; + + // this are properties given to the addon on create + // at this time we have no parameters for the addon + typedef struct AddonProps_VideoCodec + { + int dummy; + } AddonProps_VideoCodec; + + struct AddonInstance_VideoCodec; + typedef struct KodiToAddonFuncTable_VideoCodec + { + KODI_HANDLE addonInstance; + + //! @brief Opens a codec + bool(__cdecl* open)(const struct AddonInstance_VideoCodec* instance, + struct VIDEOCODEC_INITDATA* initData); + + //! @brief Reconfigures a codec + bool(__cdecl* reconfigure)(const struct AddonInstance_VideoCodec* instance, + struct VIDEOCODEC_INITDATA* initData); + + //! @brief Feed codec if requested from GetPicture() (return VC_BUFFER) + bool(__cdecl* add_data)(const struct AddonInstance_VideoCodec* instance, + const struct DEMUX_PACKET* packet); + + //! @brief Get a decoded picture / request new data + enum VIDEOCODEC_RETVAL(__cdecl* get_picture)(const struct AddonInstance_VideoCodec* instance, + struct VIDEOCODEC_PICTURE* picture); + + //! @brief Get the name of this video decoder + const char*(__cdecl* get_name)(const struct AddonInstance_VideoCodec* instance); + + //! @brief Reset the codec + void(__cdecl* reset)(const struct AddonInstance_VideoCodec* instance); + } KodiToAddonFuncTable_VideoCodec; + + typedef struct AddonToKodiFuncTable_VideoCodec + { + KODI_HANDLE kodiInstance; + bool (*get_frame_buffer)(void* kodiInstance, struct VIDEOCODEC_PICTURE* picture); + void (*release_frame_buffer)(void* kodiInstance, void* buffer); + } AddonToKodiFuncTable_VideoCodec; + + typedef struct AddonInstance_VideoCodec + { + struct AddonProps_VideoCodec* props; + struct AddonToKodiFuncTable_VideoCodec* toKodi; + struct KodiToAddonFuncTable_VideoCodec* toAddon; + } AddonInstance_VideoCodec; + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* !C_API_ADDONINSTANCE_VIDEOCODEC_H */ -- cgit v1.2.3