Kodi Development 19.0
for Binary and Script based Add-Ons
VideoCodec.h
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 "../c-api/addon-instance/video_codec.h"
13#include "inputstream/DemuxPacket.h"
14#include "inputstream/StreamCodec.h"
15#include "inputstream/StreamCrypto.h"
16
17#ifdef __cplusplus
18
19namespace kodi
20{
21namespace addon
22{
23
24class CInstanceVideoCodec;
25
26//==============================================================================
36class ATTRIBUTE_HIDDEN VideoCodecInitdata
37 : public CStructHdl<VideoCodecInitdata, VIDEOCODEC_INITDATA>
38{
40 friend class CInstanceVideoCodec;
43public:
59
62
66 VIDEOCODEC_TYPE GetCodecType() const { return m_cStructure->codec; }
67
69 STREAMCODEC_PROFILE GetCodecProfile() const { return m_cStructure->codecProfile; }
70
76 std::vector<VIDEOCODEC_FORMAT> GetVideoFormats() const
77 {
78 std::vector<VIDEOCODEC_FORMAT> formats;
79 unsigned int i = 0;
81 m_cStructure->videoFormats[i] != VIDEOCODEC_FORMAT_UNKNOWN)
82 formats.emplace_back(m_cStructure->videoFormats[i++]);
83 if (formats.empty())
84 formats.emplace_back(VIDEOCODEC_FORMAT_UNKNOWN);
85 return formats;
86 }
87
89 uint32_t GetWidth() const { return m_cStructure->width; }
90
92 uint32_t GetHeight() const { return m_cStructure->height; }
93
95 const uint8_t* GetExtraData() const { return m_cStructure->extraData; }
96
98 unsigned int GetExtraDataSize() const { return m_cStructure->extraDataSize; }
99
108 kodi::addon::StreamCryptoSession GetCryptoSession() const { return &m_cStructure->cryptoSession; }
109
111
112private:
113 VideoCodecInitdata() = delete;
114 VideoCodecInitdata(const VideoCodecInitdata& session) : CStructHdl(session) {}
115 VideoCodecInitdata(const VIDEOCODEC_INITDATA* session) : CStructHdl(session) {}
116 VideoCodecInitdata(VIDEOCODEC_INITDATA* session) : CStructHdl(session) {}
117};
119//------------------------------------------------------------------------------
120
121//##############################################################################
129
130//============================================================================
259class ATTRIBUTE_HIDDEN CInstanceVideoCodec : public IAddonInstance
260{
261public:
262 //============================================================================
272 explicit CInstanceVideoCodec(KODI_HANDLE instance, const std::string& kodiVersion = "")
274 !kodiVersion.empty() ? kodiVersion
276 {
277 if (CAddonBase::m_interface->globalSingleInstance != nullptr)
278 throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation of multiple together with "
279 "single instance way is not allowed!");
280
281 SetAddonStruct(instance);
282 }
283 //----------------------------------------------------------------------------
284
285 //============================================================================
289 ~CInstanceVideoCodec() override = default;
290 //----------------------------------------------------------------------------
291
292 //============================================================================
307 virtual bool Open(const kodi::addon::VideoCodecInitdata& initData) { return false; }
308 //----------------------------------------------------------------------------
309
310 //============================================================================
321 virtual bool Reconfigure(const kodi::addon::VideoCodecInitdata& initData) { return false; }
322 //----------------------------------------------------------------------------
323
324 //============================================================================
331 virtual bool AddData(const DEMUX_PACKET& packet) { return false; }
332 //----------------------------------------------------------------------------
333
334 //============================================================================
346 //----------------------------------------------------------------------------
347
348 //============================================================================
354 virtual const char* GetName() { return nullptr; }
355 //----------------------------------------------------------------------------
356
357 //============================================================================
361 virtual void Reset() {}
362 //----------------------------------------------------------------------------
363
368 //============================================================================
383 {
384 return m_instanceData->toKodi->get_frame_buffer(m_instanceData->toKodi->kodiInstance, &picture);
385 }
386 //----------------------------------------------------------------------------
387
388 //============================================================================
397 void ReleaseFrameBuffer(void* buffer)
398 {
399 return m_instanceData->toKodi->release_frame_buffer(m_instanceData->toKodi->kodiInstance,
400 buffer);
401 }
402 //----------------------------------------------------------------------------
403
404private:
405 void SetAddonStruct(KODI_HANDLE instance)
406 {
407 if (instance == nullptr)
408 throw std::logic_error("kodi::addon::CInstanceVideoCodec: Creation with empty addon "
409 "structure not allowed, table must be given from Kodi!");
410
411 m_instanceData = static_cast<AddonInstance_VideoCodec*>(instance);
412
413 m_instanceData->toAddon->addonInstance = this;
414 m_instanceData->toAddon->open = ADDON_Open;
415 m_instanceData->toAddon->reconfigure = ADDON_Reconfigure;
416 m_instanceData->toAddon->add_data = ADDON_AddData;
417 m_instanceData->toAddon->get_picture = ADDON_GetPicture;
418 m_instanceData->toAddon->get_name = ADDON_GetName;
419 m_instanceData->toAddon->reset = ADDON_Reset;
420 }
421
422 inline static bool ADDON_Open(const AddonInstance_VideoCodec* instance,
423 VIDEOCODEC_INITDATA* initData)
424 {
425 return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance)->Open(initData);
426 }
427
428 inline static bool ADDON_Reconfigure(const AddonInstance_VideoCodec* instance,
429 VIDEOCODEC_INITDATA* initData)
430 {
431 return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance)
432 ->Reconfigure(initData);
433 }
434
435 inline static bool ADDON_AddData(const AddonInstance_VideoCodec* instance,
436 const DEMUX_PACKET* packet)
437 {
438 return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance)->AddData(*packet);
439 }
440
441 inline static VIDEOCODEC_RETVAL ADDON_GetPicture(const AddonInstance_VideoCodec* instance,
442 VIDEOCODEC_PICTURE* picture)
443 {
444 return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance)
445 ->GetPicture(*picture);
446 }
447
448 inline static const char* ADDON_GetName(const AddonInstance_VideoCodec* instance)
449 {
450 return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance)->GetName();
451 }
452
453 inline static void ADDON_Reset(const AddonInstance_VideoCodec* instance)
454 {
455 return static_cast<CInstanceVideoCodec*>(instance->toAddon->addonInstance)->Reset();
456 }
457
458 AddonInstance_VideoCodec* m_instanceData;
459};
460
461} // namespace addon
462} // namespace kodi
463
464#endif /* __cplusplus */
Definition: VideoCodec.h:260
Definition: AddonBase.h:250
Definition: AddonBase.h:186
Definition: StreamCrypto.h:43
Definition: VideoCodec.h:38
@ ADDON_INSTANCE_VIDEOCODEC
Video Decoder instance, see kodi::addon::CInstanceVideoCodec.
Definition: versions.h:246
Definition: demux_packet.h:46
STREAMCODEC_PROFILE
Definition: stream_codec.h:25
Definition: video_codec.h:148
uint32_t GetWidth() const
Picture width.
Definition: VideoCodec.h:89
const uint8_t * GetExtraData() const
Depending on the required decoding, additional data given by the stream.
Definition: VideoCodec.h:95
VIDEOCODEC_TYPE GetCodecType() const
The codec type required by Kodi to process the stream.
Definition: VideoCodec.h:66
VIDEOCODEC_TYPE
Video codec types that can be requested from Kodi.
Definition: video_codec.h:71
STREAMCODEC_PROFILE GetCodecProfile() const
Used profiles for non-scalable 2D video.
Definition: VideoCodec.h:69
std::vector< VIDEOCODEC_FORMAT > GetVideoFormats() const
The video stream representations requested by Kodi.
Definition: VideoCodec.h:76
uint32_t GetHeight() const
Picture height.
Definition: VideoCodec.h:92
kodi::addon::StreamCryptoSession GetCryptoSession() const
Data to manage stream cryptography To get class structure manages any encryption values required in o...
Definition: VideoCodec.h:108
unsigned int GetExtraDataSize() const
Size of the data given with extraData.
Definition: VideoCodec.h:98
@ VIDEOCODEC_FORMAT_MAXFORMATS
The maximum value to use in a list.
Definition: video_codec.h:62
@ VIDEOCODEC_FORMAT_UNKNOWN
Unknown types, this is used to declare the end of a list of requested types.
Definition: video_codec.h:52
VIDEOCODEC_RETVAL
Return values used by video decoder interface.
Definition: video_codec.h:26
@ VC_ERROR
An error occured, no other messages will be returned.
Definition: video_codec.h:31
~CInstanceVideoCodec() override=default
Destructor.
virtual bool Open(const kodi::addon::VideoCodecInitdata &initData)
Open the decoder, returns true on success.
Definition: VideoCodec.h:307
virtual VIDEOCODEC_RETVAL GetPicture(VIDEOCODEC_PICTURE &picture)
GetPicture controls decoding.
Definition: VideoCodec.h:345
virtual void Reset()
Reset the decoder.
Definition: VideoCodec.h:361
bool GetFrameBuffer(VIDEOCODEC_PICTURE &picture)
AddonToKodi interface.
Definition: VideoCodec.h:382
void ReleaseFrameBuffer(void *buffer)
Release the with GetFrameBuffer() given framebuffer.
Definition: VideoCodec.h:397
virtual bool Reconfigure(const kodi::addon::VideoCodecInitdata &initData)
Reconfigure the decoder, returns true on success.
Definition: VideoCodec.h:321
virtual const char * GetName()
should return codecs name
Definition: VideoCodec.h:354
CInstanceVideoCodec(KODI_HANDLE instance, const std::string &kodiVersion="")
Video codec class constructor used to support multiple instance types.
Definition: VideoCodec.h:272
virtual bool AddData(const DEMUX_PACKET &packet)
add data, decoder has to consume the entire packet
Definition: VideoCodec.h:331
std::string ATTRIBUTE_HIDDEN GetKodiTypeVersion(int type)
To get used version inside Kodi itself about asked type.
Definition: AddonBase.h:630
Definition: video_codec.h:251
Definition: video_codec.h:197