11#include "../AddonBase.h"
12#include "../c-api/addon-instance/inputstream.h"
13#include "inputstream/StreamCodec.h"
14#include "inputstream/StreamConstants.h"
15#include "inputstream/StreamCrypto.h"
16#include "inputstream/TimingConstants.h"
108class CInstanceInputStream;
125 :
public CStructHdl<InputstreamProperty, INPUTSTREAM_PROPERTY>
149 std::string
GetURL()
const {
return m_cStructure->m_strURL; }
152 std::string
GetMimeType()
const {
return m_cStructure->m_mimeType; }
160 std::map<std::string, std::string> props;
161 for (
unsigned int i = 0; i < m_cStructure->m_nCountInfoValues; ++i)
163 props.emplace(m_cStructure->m_ListItemProperties[i].m_strKey,
164 m_cStructure->m_ListItemProperties[i].m_strValue);
202 :
public CStructHdl<InputstreamCapabilities, INPUTSTREAM_CAPABILITIES>
226 void SetMask(uint32_t mask)
const { m_cStructure->m_mask = mask; }
229 uint32_t
GetMask()
const {
return m_cStructure->m_mask; }
258 :
public CStructHdl<InputstreamMasteringMetadata, INPUTSTREAM_MASTERING_METADATA>
365 m_cStructure->white_point_chromaticity_x = value;
377 m_cStructure->white_point_chromaticity_y = value;
423 :
public CStructHdl<InputstreamContentlightMetadata, INPUTSTREAM_CONTENTLIGHT_METADATA>
468 void SetMaxCll(uint64_t value) { m_cStructure->max_cll = value; }
477 void SetMaxFall(uint64_t value) { m_cStructure->max_fall = value; }
508 :
public CStructHdl<InputstreamDvccMetadata, INPUTSTREAM_DVCC_METADATA>
545 void SetDvVersionMajor(uint8_t value) { m_cStructure->m_dvVersionMajor = value; }
546 uint8_t GetDvVersionMajor()
const {
return m_cStructure->m_dvVersionMajor; }
548 void SetDvVersionMinor(uint8_t value) { m_cStructure->m_dvVersionMinor = value; }
549 uint8_t GetDvVersionMinor()
const {
return m_cStructure->m_dvVersionMinor; }
551 void SetDvProfile(uint8_t value) { m_cStructure->m_dvProfile = value; }
552 uint8_t GetDvProfile()
const {
return m_cStructure->m_dvProfile; }
554 void SetDvLevel(uint8_t value) { m_cStructure->m_dvLevel = value; }
555 uint8_t GetDvLevel()
const {
return m_cStructure->m_dvLevel; }
557 void SetRpuPresentFlag(
bool value) { m_cStructure->m_rpuPresentFlag = value; }
558 bool GetRpuPresentFlag()
const {
return m_cStructure->m_rpuPresentFlag; }
560 void SetElPresentFlag(
bool value) { m_cStructure->m_elPresentFlag = value; }
561 bool GetElPresentFlag()
const {
return m_cStructure->m_elPresentFlag; }
563 void SetBlPresentFlag(
bool value) { m_cStructure->m_blPresentFlag = value; }
564 bool GetBlPresentFlag()
const {
return m_cStructure->m_blPresentFlag; }
566 void SetBlSignalCompatibilityId(uint8_t value)
568 m_cStructure->m_dvBlSignalCompatibilityId = value;
570 uint8_t GetBlSignalCompatibilityId()
const {
return m_cStructure->m_dvBlSignalCompatibilityId; }
572 void SetMdCompression(uint8_t value) { m_cStructure->m_dvMdCompression = value; }
573 uint8_t GetMdCompression()
const {
return m_cStructure->m_dvMdCompression; }
663 void SetFeatures(uint32_t features) { m_cStructure->m_features = features; }
671 void SetFlags(uint32_t flags) { m_cStructure->m_flags = flags; }
674 uint32_t
GetFlags()
const {
return m_cStructure->m_flags; }
681 strncpy(m_cStructure->m_name, name.c_str(), INPUTSTREAM_MAX_STRING_NAME_SIZE);
685 std::string
GetName()
const {
return m_cStructure->m_name; }
698 strncpy(m_cStructure->m_codecName, codecName.c_str(), INPUTSTREAM_MAX_STRING_CODEC_SIZE);
709 strncpy(m_cStructure->m_codecInternalName, codecName.c_str(),
710 INPUTSTREAM_MAX_STRING_CODEC_SIZE);
721 m_cStructure->m_codecProfile = codecProfile;
740 m_extraData = extraData;
741 m_cStructure->m_ExtraData = m_extraData.data();
742 m_cStructure->m_ExtraSize =
static_cast<unsigned int>(m_extraData.size());
752 if (extraData && extraSize > 0)
754 for (
size_t i = 0; i < extraSize; ++i)
755 m_extraData.emplace_back(extraData[i]);
758 m_cStructure->m_ExtraData = m_extraData.data();
759 m_cStructure->m_ExtraSize =
static_cast<unsigned int>(m_extraData.size());
775 if (!extraData || m_extraData.size() != extraSize)
777 for (
size_t i = 0; i < extraSize; ++i)
779 if (m_extraData[i] != extraData[i])
789 m_cStructure->m_ExtraData = m_extraData.data();
790 m_cStructure->m_ExtraSize =
static_cast<unsigned int>(m_extraData.size());
798 strncpy(m_cStructure->m_language, language.c_str(), INPUTSTREAM_MAX_STRING_LANGUAGE_SIZE);
802 std::string
GetLanguage()
const {
return m_cStructure->m_language; }
807 void SetFpsScale(
unsigned int fpsScale) { m_cStructure->m_FpsScale = fpsScale; }
810 unsigned int GetFpsScale()
const {
return m_cStructure->m_FpsScale; }
815 void SetFpsRate(
unsigned int fpsRate) { m_cStructure->m_FpsRate = fpsRate; }
818 unsigned int GetFpsRate()
const {
return m_cStructure->m_FpsRate; }
823 void SetHeight(
unsigned int height) { m_cStructure->m_Height = height; }
826 unsigned int GetHeight()
const {
return m_cStructure->m_Height; }
831 void SetWidth(
unsigned int width) { m_cStructure->m_Width = width; }
834 unsigned int GetWidth()
const {
return m_cStructure->m_Width; }
839 void SetAspect(
float aspect) { m_cStructure->m_Aspect = aspect; }
842 float GetAspect()
const {
return m_cStructure->m_Aspect; }
847 void SetChannels(
unsigned int channels) { m_cStructure->m_Channels = channels; }
850 unsigned int GetChannels()
const {
return m_cStructure->m_Channels; }
855 void SetSampleRate(
unsigned int sampleRate) { m_cStructure->m_SampleRate = sampleRate; }
863 void SetBitRate(
unsigned int bitRate) { m_cStructure->m_BitRate = bitRate; }
866 unsigned int GetBitRate()
const {
return m_cStructure->m_BitRate; }
873 m_cStructure->m_BitsPerSample = bitsPerSample;
882 void SetBlockAlign(
unsigned int blockAlign) { m_cStructure->m_BlockAlign = blockAlign; }
893 m_cryptoSession = cryptoSession;
894 memcpy(&m_cStructure->m_cryptoSession, m_cryptoSession.GetCStructure(),
904 void SetCodecFourCC(
unsigned int codecFourCC) { m_cStructure->m_codecFourCC = codecFourCC; }
930 m_cStructure->m_colorPrimaries = colorPrimaries;
941 m_cStructure->m_colorTransferCharacteristic = colorTransferCharacteristic;
947 return m_cStructure->m_colorTransferCharacteristic;
960 m_masteringMetadata = masteringMetadata;
961 m_cStructure->m_masteringMetadata = m_masteringMetadata;
967 return m_masteringMetadata;
982 m_contentLightMetadata = contentLightMetadata;
983 m_cStructure->m_contentLightMetadata = m_contentLightMetadata;
989 return m_contentLightMetadata;
1000 m_dvccMetadata = dvccMetadata;
1001 m_cStructure->m_dvccMetadata = m_dvccMetadata;
1022 SetCryptoSession(StreamCryptoSession(&stream->m_cryptoSession));
1026 void CopyExtraData()
1028 if (m_cStructure->m_ExtraData && m_cStructure->m_ExtraSize > 0)
1030 for (
unsigned int i = 0; i < m_cStructure->m_ExtraSize; ++i)
1031 m_extraData.emplace_back(m_cStructure->m_ExtraData[i]);
1033 if (m_cStructure->m_masteringMetadata)
1034 m_masteringMetadata = m_cStructure->m_masteringMetadata;
1035 if (m_cStructure->m_contentLightMetadata)
1036 m_contentLightMetadata = m_cStructure->m_contentLightMetadata;
1038 std::vector<uint8_t> m_extraData;
1039 StreamCryptoSession m_cryptoSession;
1040 InputstreamMasteringMetadata m_masteringMetadata;
1041 InputstreamContentlightMetadata m_contentLightMetadata;
1042 InputstreamDvccMetadata m_dvccMetadata;
1086 void SetStartTime(time_t startTime)
const { m_cStructure->startTime = startTime; }
1092 void SetPtsStart(
double ptsStart)
const { m_cStructure->ptsStart = ptsStart; }
1098 void SetPtsBegin(
double ptsBegin)
const { m_cStructure->ptsBegin = ptsBegin; }
1104 void SetPtsEnd(
double ptsEnd)
const { m_cStructure->ptsEnd = ptsEnd; }
1271 if (CPrivateBase::m_interface->globalSingleInstance !=
nullptr)
1272 throw std::logic_error(
"kodi::addon::CInstanceInputStream: Creation of multiple together "
1273 "with single instance way is not allowed!");
1275 SetAddonStruct(instance);
1401 virtual int ReadStream(uint8_t* buffer,
unsigned int bufferSize) {
return -1; }
1422 virtual int64_t
SeekStream(int64_t position,
int whence = SEEK_SET) {
return -1; }
1510 virtual bool GetStreamIds(std::vector<unsigned int>& ids) {
return false; }
1649 virtual bool DemuxSeekTime(
double time,
bool backwards,
double& startpts) {
return false; }
1680 unsigned int height,
1681 unsigned int maxWidth,
1682 unsigned int maxHeight)
1697 return m_instanceData->toKodi->allocate_demux_packet(m_instanceData->toKodi->kodiInstance,
1713 return m_instanceData->toKodi->allocate_encrypted_demux_packet(
1714 m_instanceData->toKodi->kodiInstance, dataSize, encryptedSubsampleCount);
1727 return m_instanceData->toKodi->free_demux_packet(m_instanceData->toKodi->kodiInstance, packet);
1879 static int compareVersion(
const int v1[3],
const int v2[3])
1881 for (
unsigned i(0); i < 3; ++i)
1883 return v1[i] - v2[i];
1889 int api[3] = {0, 0, 0};
1890 sscanf(GetInstanceAPIVersion().c_str(),
"%d.%d.%d", &api[0], &api[1], &api[2]);
1892 instance->hdl =
this;
1893 instance->inputstream->toAddon->open = ADDON_Open;
1894 instance->inputstream->toAddon->close = ADDON_Close;
1895 instance->inputstream->toAddon->get_capabilities = ADDON_GetCapabilities;
1897 instance->inputstream->toAddon->get_stream_ids = ADDON_GetStreamIds;
1898 instance->inputstream->toAddon->get_stream = ADDON_GetStream;
1899 instance->inputstream->toAddon->enable_stream = ADDON_EnableStream;
1900 instance->inputstream->toAddon->open_stream = ADDON_OpenStream;
1901 instance->inputstream->toAddon->demux_reset = ADDON_DemuxReset;
1902 instance->inputstream->toAddon->demux_abort = ADDON_DemuxAbort;
1903 instance->inputstream->toAddon->demux_flush = ADDON_DemuxFlush;
1904 instance->inputstream->toAddon->demux_read = ADDON_DemuxRead;
1905 instance->inputstream->toAddon->demux_seek_time = ADDON_DemuxSeekTime;
1906 instance->inputstream->toAddon->demux_set_speed = ADDON_DemuxSetSpeed;
1907 instance->inputstream->toAddon->set_video_resolution = ADDON_SetVideoResolution;
1909 instance->inputstream->toAddon->get_total_time = ADDON_GetTotalTime;
1910 instance->inputstream->toAddon->get_time = ADDON_GetTime;
1912 instance->inputstream->toAddon->get_times = ADDON_GetTimes;
1913 instance->inputstream->toAddon->pos_time = ADDON_PosTime;
1915 instance->inputstream->toAddon->read_stream = ADDON_ReadStream;
1916 instance->inputstream->toAddon->seek_stream = ADDON_SeekStream;
1917 instance->inputstream->toAddon->position_stream = ADDON_PositionStream;
1918 instance->inputstream->toAddon->length_stream = ADDON_LengthStream;
1919 instance->inputstream->toAddon->is_real_time_stream = ADDON_IsRealTimeStream;
1922 instance->inputstream->toAddon->get_chapter = ADDON_GetChapter;
1923 instance->inputstream->toAddon->get_chapter_count = ADDON_GetChapterCount;
1924 instance->inputstream->toAddon->get_chapter_name = ADDON_GetChapterName;
1925 instance->inputstream->toAddon->get_chapter_pos = ADDON_GetChapterPos;
1926 instance->inputstream->toAddon->seek_chapter = ADDON_SeekChapter;
1929 instance->inputstream->toAddon->block_size_stream = ADDON_GetBlockSize;
1940 m_instanceData = instance->inputstream;
1941 m_instanceData->toAddon->addonInstance =
this;
1947 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->Open(props);
1952 static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->Close();
1958 InputstreamCapabilities caps(capabilities);
1959 static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->GetCapabilities(caps);
1966 std::vector<unsigned int> idList;
1968 static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->GetStreamIds(idList);
1971 for (
size_t i = 0; i < idList.size() && i < INPUTSTREAM_MAX_STREAM_COUNT; ++i)
1973 ids->m_streamCount++;
1974 ids->m_streamIds[i] = idList[i];
1980 inline static bool ADDON_GetStream(
1984 KODI_HANDLE* demuxStream,
1985 KODI_HANDLE (*transfer_stream)(KODI_HANDLE handle,
1989 InputstreamInfo infoData(info);
1990 bool ret =
static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)
1991 ->GetStream(streamid, infoData);
1992 if (ret && transfer_stream)
1996 *demuxStream = transfer_stream(instance->toKodi->kodiInstance, streamid, info);
2005 static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)
2006 ->EnableStream(streamid, enable);
2011 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)
2012 ->OpenStream(streamid);
2017 static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->DemuxReset();
2022 static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->DemuxAbort();
2027 static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->DemuxFlush();
2032 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->DemuxRead();
2040 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)
2041 ->DemuxSeekTime(time, backwards, *startpts);
2046 static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->DemuxSetSpeed(speed);
2051 unsigned int height,
2052 unsigned int maxWidth,
2053 unsigned int maxHeight)
2055 static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)
2056 ->SetVideoResolution(width, height);
2057 static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)
2058 ->SetVideoResolution(width, height, maxWidth, maxHeight);
2064 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->GetTotalTime();
2069 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->GetTime();
2076 InputstreamTimes cppTimes(times);
2077 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->GetTimes(cppTimes);
2083 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->PosTime(ms);
2088 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->GetChapter();
2093 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->GetChapterCount();
2098 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->GetChapterName(ch);
2103 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->GetChapterPos(ch);
2108 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->SeekChapter(ch);
2113 unsigned int bufferSize)
2115 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)
2116 ->ReadStream(buffer, bufferSize);
2123 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)
2124 ->SeekStream(position, whence);
2129 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->PositionStream();
2134 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->LengthStream();
2139 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->GetBlockSize();
2144 return static_cast<CInstanceInputStream*
>(instance->toAddon->addonInstance)->IsRealTimeStream();
Definition AddonBase.h:206
Definition AddonBase.h:566
Definition AddonBase.h:502
Definition Inputstream.h:424
Definition StreamCrypto.h:43
void SetMaxCll(uint64_t value)
Set the maximum content light level (MaxCLL).
Definition Inputstream.h:468
uint64_t GetMaxCll()
Get the maximum content light level (MaxCLL).
Definition Inputstream.h:471
bool operator==(const kodi::addon::InputstreamContentlightMetadata &right) const
Metadata class compare.
Definition Inputstream.h:457
void SetMaxFall(uint64_t value)
Set the maximum frame average light level (MaxFALL).
Definition Inputstream.h:477
uint64_t GetMaxFall()
Get the maximum frame average light level (MaxFALL).
Definition Inputstream.h:480
InputStream add-on capabilities. All capabilities are set to "false" as default.
Definition inputstream.h:95
CONTENTLIGHT Metadata.
Definition inputstream.h:149
Dolby Vision configuration metadata (dvcc)
Definition inputstream.h:502
Array of stream IDs.
Definition inputstream.h:123
stream properties
Definition inputstream.h:538
MASTERING Metadata.
Definition inputstream.h:132
structure of key/value pairs passed to addon on Open()
Definition inputstream.h:104
Definition inputstream.h:633
Definition addon_base.h:268
Definition stream_crypto.h:121