summaryrefslogtreecommitdiffstats
path: root/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 18:07:22 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 18:07:22 +0000
commitc04dcc2e7d834218ef2d4194331e383402495ae1 (patch)
tree7333e38d10d75386e60f336b80c2443c1166031d /xbmc/cores/VideoPlayer/DVDStreamInfo.cpp
parentInitial commit. (diff)
downloadkodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz
kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/cores/VideoPlayer/DVDStreamInfo.cpp')
-rw-r--r--xbmc/cores/VideoPlayer/DVDStreamInfo.cpp310
1 files changed, 310 insertions, 0 deletions
diff --git a/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp b/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp
new file mode 100644
index 0000000..f8f7c71
--- /dev/null
+++ b/xbmc/cores/VideoPlayer/DVDStreamInfo.cpp
@@ -0,0 +1,310 @@
+/*
+ * Copyright (C) 2005-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.
+ */
+
+#include "DVDStreamInfo.h"
+
+#include "DVDDemuxers/DVDDemux.h"
+#include "cores/VideoPlayer/Interface/DemuxCrypto.h"
+
+CDVDStreamInfo::CDVDStreamInfo() { extradata = NULL; Clear(); }
+CDVDStreamInfo::CDVDStreamInfo(const CDVDStreamInfo &right, bool withextradata ) { extradata = NULL; Clear(); Assign(right, withextradata); }
+CDVDStreamInfo::CDVDStreamInfo(const CDemuxStream &right, bool withextradata ) { extradata = NULL; Clear(); Assign(right, withextradata); }
+
+CDVDStreamInfo::~CDVDStreamInfo()
+{
+ if( extradata && extrasize ) free(extradata);
+
+ extradata = NULL;
+ extrasize = 0;
+}
+
+
+void CDVDStreamInfo::Clear()
+{
+ codec = AV_CODEC_ID_NONE;
+ type = STREAM_NONE;
+ uniqueId = -1;
+ source = STREAM_SOURCE_NONE;
+ codecOptions = 0;
+ codec_tag = 0;
+ flags = 0;
+ filename.clear();
+ dvd = false;
+
+ if( extradata && extrasize ) free(extradata);
+
+ extradata = NULL;
+ extrasize = 0;
+
+ cryptoSession = nullptr;
+ externalInterfaces = nullptr;
+
+ fpsscale = 0;
+ fpsrate = 0;
+ height = 0;
+ width = 0;
+ aspect = 0.0;
+ vfr = false;
+ stills = false;
+ level = 0;
+ profile = 0;
+ ptsinvalid = false;
+ forced_aspect = false;
+ bitsperpixel = 0;
+ colorSpace = AVCOL_SPC_UNSPECIFIED;
+ colorRange = AVCOL_RANGE_UNSPECIFIED;
+ colorPrimaries = AVCOL_PRI_UNSPECIFIED;
+ colorTransferCharacteristic = AVCOL_TRC_UNSPECIFIED;
+ masteringMetadata = nullptr;
+ contentLightMetadata = nullptr;
+ stereo_mode.clear();
+
+ channels = 0;
+ samplerate = 0;
+ blockalign = 0;
+ bitrate = 0;
+ bitspersample = 0;
+ channellayout = 0;
+
+ orientation = 0;
+ bitdepth = 0;
+}
+
+bool CDVDStreamInfo::Equal(const CDVDStreamInfo& right, int compare)
+{
+ if (codec != right.codec || type != right.type ||
+ ((compare & COMPARE_ID) && uniqueId != right.uniqueId) ||
+ ((compare & COMPARE_ID) && demuxerId != right.demuxerId) || codec_tag != right.codec_tag ||
+ flags != right.flags)
+ return false;
+
+ if (compare & COMPARE_EXTRADATA)
+ {
+ if( extrasize != right.extrasize ) return false;
+ if( extrasize )
+ {
+ if( memcmp(extradata, right.extradata, extrasize) != 0 ) return false;
+ }
+ }
+
+ // VIDEO
+ // clang-format off
+ if (fpsscale != right.fpsscale
+ || fpsrate != right.fpsrate
+ || height != right.height
+ || width != right.width
+ || stills != right.stills
+ || level != right.level
+ || profile != right.profile
+ || ptsinvalid != right.ptsinvalid
+ || forced_aspect != right.forced_aspect
+ || bitsperpixel != right.bitsperpixel
+ || bitdepth != right.bitdepth
+ || vfr != right.vfr
+ || colorSpace != right.colorSpace
+ || colorRange != right.colorRange
+ || colorPrimaries != right.colorPrimaries
+ || colorTransferCharacteristic != right.colorTransferCharacteristic
+ || stereo_mode != right.stereo_mode)
+ return false;
+ // clang-format on
+
+ if (masteringMetadata && right.masteringMetadata)
+ {
+ if (masteringMetadata->has_luminance != right.masteringMetadata->has_luminance
+ || masteringMetadata->has_primaries != right.masteringMetadata->has_primaries)
+ return false;
+
+ if (masteringMetadata->has_primaries)
+ {
+ for (unsigned int i(0); i < 3; ++i)
+ for (unsigned int j(0); j < 2; ++j)
+ if (av_cmp_q(masteringMetadata->display_primaries[i][j], right.masteringMetadata->display_primaries[i][j]))
+ return false;
+ for (unsigned int i(0); i < 2; ++i)
+ if (av_cmp_q(masteringMetadata->white_point[i], right.masteringMetadata->white_point[i]))
+ return false;
+ }
+
+ if (masteringMetadata->has_luminance)
+ {
+ if (av_cmp_q(masteringMetadata->min_luminance, right.masteringMetadata->min_luminance)
+ || av_cmp_q(masteringMetadata->max_luminance, right.masteringMetadata->max_luminance))
+ return false;
+ }
+ }
+ else if (masteringMetadata || right.masteringMetadata)
+ return false;
+
+ if (contentLightMetadata && right.contentLightMetadata)
+ {
+ if (contentLightMetadata->MaxCLL != right.contentLightMetadata->MaxCLL
+ || contentLightMetadata->MaxFALL != right.contentLightMetadata->MaxFALL)
+ return false;
+ }
+ else if (contentLightMetadata || right.contentLightMetadata)
+ return false;
+
+ // AUDIO
+ if( channels != right.channels
+ || samplerate != right.samplerate
+ || blockalign != right.blockalign
+ || bitrate != right.bitrate
+ || bitspersample != right.bitspersample
+ || channellayout != right.channellayout)
+ return false;
+
+ // SUBTITLE
+
+ // Crypto
+ if ((cryptoSession == nullptr) != (right.cryptoSession == nullptr))
+ return false;
+
+ if (cryptoSession && !(*cryptoSession == *right.cryptoSession))
+ return false;
+
+ return true;
+}
+
+bool CDVDStreamInfo::Equal(const CDemuxStream& right, bool withextradata)
+{
+ CDVDStreamInfo info;
+ info.Assign(right, withextradata);
+ return Equal(info, withextradata ? COMPARE_ALL : COMPARE_ALL & ~COMPARE_EXTRADATA);
+}
+
+
+// ASSIGNMENT
+void CDVDStreamInfo::Assign(const CDVDStreamInfo& right, bool withextradata)
+{
+ codec = right.codec;
+ type = right.type;
+ uniqueId = right.uniqueId;
+ demuxerId = right.demuxerId;
+ source = right.source;
+ codec_tag = right.codec_tag;
+ flags = right.flags;
+ filename = right.filename;
+ dvd = right.dvd;
+
+ if( extradata && extrasize ) free(extradata);
+
+ if( withextradata && right.extrasize )
+ {
+ extrasize = right.extrasize;
+ extradata = malloc(extrasize);
+ if (!extradata)
+ return;
+ memcpy(extradata, right.extradata, extrasize);
+ }
+ else
+ {
+ extrasize = 0;
+ extradata = 0;
+ }
+
+ cryptoSession = right.cryptoSession;
+ externalInterfaces = right.externalInterfaces;
+
+ // VIDEO
+ fpsscale = right.fpsscale;
+ fpsrate = right.fpsrate;
+ height = right.height;
+ width = right.width;
+ aspect = right.aspect;
+ stills = right.stills;
+ level = right.level;
+ profile = right.profile;
+ ptsinvalid = right.ptsinvalid;
+ forced_aspect = right.forced_aspect;
+ orientation = right.orientation;
+ bitsperpixel = right.bitsperpixel;
+ bitdepth = right.bitdepth;
+ vfr = right.vfr;
+ codecOptions = right.codecOptions;
+ colorSpace = right.colorSpace;
+ colorRange = right.colorRange;
+ colorPrimaries = right.colorPrimaries;
+ colorTransferCharacteristic = right.colorTransferCharacteristic;
+ masteringMetadata = right.masteringMetadata;
+ contentLightMetadata = right.contentLightMetadata;
+ stereo_mode = right.stereo_mode;
+
+ // AUDIO
+ channels = right.channels;
+ samplerate = right.samplerate;
+ blockalign = right.blockalign;
+ bitrate = right.bitrate;
+ bitspersample = right.bitspersample;
+ channellayout = right.channellayout;
+
+ // SUBTITLE
+}
+
+void CDVDStreamInfo::Assign(const CDemuxStream& right, bool withextradata)
+{
+ Clear();
+
+ codec = right.codec;
+ type = right.type;
+ uniqueId = right.uniqueId;
+ demuxerId = right.demuxerId;
+ source = right.source;
+ codec_tag = right.codec_fourcc;
+ profile = right.profile;
+ level = right.level;
+ flags = right.flags;
+
+ if (withextradata && right.ExtraSize)
+ {
+ extrasize = right.ExtraSize;
+ extradata = malloc(extrasize);
+ if (!extradata)
+ return;
+ memcpy(extradata, right.ExtraData.get(), extrasize);
+ }
+
+ cryptoSession = right.cryptoSession;
+ externalInterfaces = right.externalInterfaces;
+
+ if (right.type == STREAM_AUDIO)
+ {
+ const CDemuxStreamAudio *stream = static_cast<const CDemuxStreamAudio*>(&right);
+ channels = stream->iChannels;
+ samplerate = stream->iSampleRate;
+ blockalign = stream->iBlockAlign;
+ bitrate = stream->iBitRate;
+ bitspersample = stream->iBitsPerSample;
+ channellayout = stream->iChannelLayout;
+ }
+ else if (right.type == STREAM_VIDEO)
+ {
+ const CDemuxStreamVideo *stream = static_cast<const CDemuxStreamVideo*>(&right);
+ fpsscale = stream->iFpsScale;
+ fpsrate = stream->iFpsRate;
+ height = stream->iHeight;
+ width = stream->iWidth;
+ aspect = stream->fAspect;
+ vfr = stream->bVFR;
+ ptsinvalid = stream->bPTSInvalid;
+ forced_aspect = stream->bForcedAspect;
+ orientation = stream->iOrientation;
+ bitsperpixel = stream->iBitsPerPixel;
+ bitdepth = stream->bitDepth;
+ colorSpace = stream->colorSpace;
+ colorRange = stream->colorRange;
+ colorPrimaries = stream->colorPrimaries;
+ colorTransferCharacteristic = stream->colorTransferCharacteristic;
+ masteringMetadata = stream->masteringMetaData;
+ contentLightMetadata = stream->contentLightMetaData;
+ stereo_mode = stream->stereo_mode;
+ }
+ else if (right.type == STREAM_SUBTITLE)
+ {
+ }
+}