summaryrefslogtreecommitdiffstats
path: root/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VideoCodec.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VideoCodec.h')
-rw-r--r--xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VideoCodec.h246
1 files changed, 0 insertions, 246 deletions
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VideoCodec.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VideoCodec.h
deleted file mode 100644
index 54246f0..0000000
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/addon-instance/VideoCodec.h
+++ /dev/null
@@ -1,246 +0,0 @@
1/*
2 * Copyright (C) 2017-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#pragma once
10
11#include "../AddonBase.h"
12#include "../StreamCrypto.h"
13#include "../StreamCodec.h"
14
15#ifdef BUILD_KODI_ADDON
16#include "../DemuxPacket.h"
17#else
18#include "cores/VideoPlayer/Interface/Addon/DemuxPacket.h"
19#endif
20
21namespace kodi { namespace addon { class CInstanceVideoCodec; } }
22
23extern "C"
24{
25 enum VIDEOCODEC_FORMAT
26 {
27 UnknownVideoFormat = 0,
28 VideoFormatYV12,
29 VideoFormatI420,
30 MaxVideoFormats
31 };
32
33
34 struct VIDEOCODEC_INITDATA
35 {
36 enum Codec {
37 CodecUnknown = 0,
38 CodecVp8,
39 CodecH264,
40 CodecVp9
41 } codec;
42
43 STREAMCODEC_PROFILE codecProfile;
44
45 //UnknownVideoFormat is terminator
46 VIDEOCODEC_FORMAT *videoFormats;
47
48 uint32_t width, height;
49
50 const uint8_t *extraData;
51 unsigned int extraDataSize;
52
53 CRYPTO_INFO cryptoInfo;
54 };
55
56 struct VIDEOCODEC_PICTURE
57 {
58 enum VideoPlane {
59 YPlane = 0,
60 UPlane,
61 VPlane,
62 MaxPlanes = 3,
63 };
64
65 enum Flags : uint32_t {
66 FLAG_DROP,
67 FLAG_DRAIN
68 };
69
70 VIDEOCODEC_FORMAT videoFormat;
71 uint32_t flags;
72
73 uint32_t width, height;
74
75 uint8_t *decodedData;
76 size_t decodedDataSize;
77
78 uint32_t planeOffsets[VideoPlane::MaxPlanes];
79 uint32_t stride[VideoPlane::MaxPlanes];
80
81 int64_t pts;
82
83 KODI_HANDLE buffer; //< will be passed in release_frame_buffer
84 };
85
86 enum VIDEOCODEC_RETVAL
87 {
88 VC_NONE = 0, //< noop
89 VC_ERROR, //< an error occurred, no other messages will be returned
90 VC_BUFFER, //< the decoder needs more data
91 VC_PICTURE, //< the decoder got a picture
92 VC_EOF, //< the decoder signals EOF
93 };
94
95 // this are properties given to the addon on create
96 // at this time we have no parameters for the addon
97 typedef struct AddonProps_VideoCodec
98 {
99 int dummy;
100 } AddonProps_VideoCodec;
101
102 struct AddonInstance_VideoCodec;
103 typedef struct KodiToAddonFuncTable_VideoCodec
104 {
105 kodi::addon::CInstanceVideoCodec* addonInstance;
106
107 //! \brief Opens a codec
108 bool (__cdecl* open) (const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData);
109
110 //! \brief Reconfigures a codec
111 bool (__cdecl* reconfigure) (const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData);
112
113 //! \brief Feed codec if requested from GetPicture() (return VC_BUFFER)
114 bool (__cdecl* add_data) (const AddonInstance_VideoCodec* instance, const DemuxPacket *packet);
115
116 //! \brief Get a decoded picture / request new data
117 VIDEOCODEC_RETVAL (__cdecl* get_picture) (const AddonInstance_VideoCodec* instance, VIDEOCODEC_PICTURE *picture);
118
119 //! \brief Get the name of this video decoder
120 const char *(__cdecl* get_name) (const AddonInstance_VideoCodec* instance);
121
122 //! \brief Reset the codec
123 void (__cdecl* reset)(const AddonInstance_VideoCodec* instance);
124 } KodiToAddonFuncTable_VideoCodec;
125
126 typedef struct AddonToKodiFuncTable_VideoCodec
127 {
128 KODI_HANDLE kodiInstance;
129 bool(*get_frame_buffer)(void* kodiInstance, VIDEOCODEC_PICTURE *picture);
130 void(*release_frame_buffer)(void* kodiInstance, void *buffer);
131 } AddonToKodiFuncTable_VideoCodec;
132
133 typedef struct AddonInstance_VideoCodec
134 {
135 AddonProps_VideoCodec props;
136 AddonToKodiFuncTable_VideoCodec toKodi;
137 KodiToAddonFuncTable_VideoCodec toAddon;
138 } AddonInstance_VideoCodec;
139}
140
141namespace kodi
142{
143 namespace addon
144 {
145
146 class ATTRIBUTE_HIDDEN CInstanceVideoCodec : public IAddonInstance
147 {
148 public:
149 explicit CInstanceVideoCodec(KODI_HANDLE instance, const std::string& kodiVersion = "")
150 : IAddonInstance(ADDON_INSTANCE_VIDEOCODEC,
151 !kodiVersion.empty() ? kodiVersion
152 : GetKodiTypeVersion(ADDON_INSTANCE_VIDEOCODEC))
153 {
154 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
155 throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation of multiple together with single instance way is not allowed!");
156
157 SetAddonStruct(instance);
158 }
159
160 ~CInstanceVideoCodec() override = default;
161
162 //! \copydoc CInstanceVideoCodec::Open
163 virtual bool Open(VIDEOCODEC_INITDATA &initData) { return false; };
164
165 //! \copydoc CInstanceVideoCodec::Reconfigure
166 virtual bool Reconfigure(VIDEOCODEC_INITDATA &initData) { return false; };
167
168 //! \copydoc CInstanceVideoCodec::AddData
169 virtual bool AddData(const DemuxPacket &packet) { return false; };
170
171 //! \copydoc CInstanceVideoCodec::GetPicture
172 virtual VIDEOCODEC_RETVAL GetPicture(VIDEOCODEC_PICTURE &picture) { return VC_ERROR; };
173
174 //! \copydoc CInstanceVideoCodec::GetName
175 virtual const char *GetName() { return nullptr; };
176
177 //! \copydoc CInstanceVideoCodec::Reset
178 virtual void Reset() {};
179
180 /*!
181 * @brief AddonToKodi interface
182 */
183
184 //! \copydoc CInstanceVideoCodec::GetFrameBuffer
185 bool GetFrameBuffer(VIDEOCODEC_PICTURE &picture)
186 {
187 return m_instanceData->toKodi.get_frame_buffer(m_instanceData->toKodi.kodiInstance, &picture);
188 }
189
190 //! \copydoc CInstanceVideoCodec::ReleaseFrameBuffer
191 void ReleaseFrameBuffer(void *buffer)
192 {
193 return m_instanceData->toKodi.release_frame_buffer(m_instanceData->toKodi.kodiInstance, buffer);
194 }
195
196 private:
197 void SetAddonStruct(KODI_HANDLE instance)
198 {
199 if (instance == nullptr)
200 throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation with empty addon structure not allowed, table must be given from Kodi!");
201
202 m_instanceData = static_cast<AddonInstance_VideoCodec*>(instance);
203
204 m_instanceData->toAddon.addonInstance = this;
205 m_instanceData->toAddon.open = ADDON_Open;
206 m_instanceData->toAddon.reconfigure = ADDON_Reconfigure;
207 m_instanceData->toAddon.add_data = ADDON_AddData;
208 m_instanceData->toAddon.get_picture = ADDON_GetPicture;
209 m_instanceData->toAddon.get_name = ADDON_GetName;
210 m_instanceData->toAddon.reset = ADDON_Reset;
211 }
212
213 inline static bool ADDON_Open(const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData)
214 {
215 return instance->toAddon.addonInstance->Open(*initData);
216 }
217
218 inline static bool ADDON_Reconfigure(const AddonInstance_VideoCodec* instance, VIDEOCODEC_INITDATA *initData)
219 {
220 return instance->toAddon.addonInstance->Reconfigure(*initData);
221 }
222
223 inline static bool ADDON_AddData(const AddonInstance_VideoCodec* instance, const DemuxPacket *packet)
224 {
225 return instance->toAddon.addonInstance->AddData(*packet);
226 }
227
228 inline static VIDEOCODEC_RETVAL ADDON_GetPicture(const AddonInstance_VideoCodec* instance, VIDEOCODEC_PICTURE *picture)
229 {
230 return instance->toAddon.addonInstance->GetPicture(*picture);
231 }
232
233 inline static const char *ADDON_GetName(const AddonInstance_VideoCodec* instance)
234 {
235 return instance->toAddon.addonInstance->GetName();
236 }
237
238 inline static void ADDON_Reset(const AddonInstance_VideoCodec* instance)
239 {
240 return instance->toAddon.addonInstance->Reset();
241 }
242
243 AddonInstance_VideoCodec* m_instanceData;
244 };
245 } // namespace addon
246} // namespace kodi