diff options
Diffstat (limited to 'xbmc/utils/StreamDetails.h')
-rw-r--r-- | xbmc/utils/StreamDetails.h | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/xbmc/utils/StreamDetails.h b/xbmc/utils/StreamDetails.h new file mode 100644 index 0000000..bc3aacd --- /dev/null +++ b/xbmc/utils/StreamDetails.h @@ -0,0 +1,142 @@ +/* + * 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. + */ + +#pragma once + +#include "ISerializable.h" +#include "cores/VideoPlayer/Interface/StreamInfo.h" +#include "utils/IArchivable.h" + +#include <memory> +#include <string> +#include <vector> + +class CStreamDetails; +class CVariant; +struct VideoStreamInfo; +struct AudioStreamInfo; +struct SubtitleStreamInfo; + +class CStreamDetail : public IArchivable, public ISerializable +{ +public: + enum StreamType { + VIDEO, + AUDIO, + SUBTITLE + }; + + explicit CStreamDetail(StreamType type) : m_eType(type), m_pParent(NULL) {} + virtual ~CStreamDetail() = default; + virtual bool IsWorseThan(const CStreamDetail &that) const = 0; + + const StreamType m_eType; + +protected: + CStreamDetails *m_pParent; + friend class CStreamDetails; +}; + +class CStreamDetailVideo final : public CStreamDetail +{ +public: + CStreamDetailVideo(); + CStreamDetailVideo(const VideoStreamInfo &info, int duration = 0); + void Archive(CArchive& ar) override; + void Serialize(CVariant& value) const override; + bool IsWorseThan(const CStreamDetail &that) const override; + + int m_iWidth = 0; + int m_iHeight = 0; + float m_fAspect = 0.0; + int m_iDuration = 0; + std::string m_strCodec; + std::string m_strStereoMode; + std::string m_strLanguage; + std::string m_strHdrType; +}; + +class CStreamDetailAudio final : public CStreamDetail +{ +public: + CStreamDetailAudio(); + CStreamDetailAudio(const AudioStreamInfo &info); + void Archive(CArchive& ar) override; + void Serialize(CVariant& value) const override; + bool IsWorseThan(const CStreamDetail &that) const override; + + int m_iChannels = -1; + std::string m_strCodec; + std::string m_strLanguage; +}; + +class CStreamDetailSubtitle final : public CStreamDetail +{ +public: + CStreamDetailSubtitle(); + CStreamDetailSubtitle(const SubtitleStreamInfo &info); + CStreamDetailSubtitle(const CStreamDetailSubtitle&) = default; + CStreamDetailSubtitle& operator=(const CStreamDetailSubtitle &that); + void Archive(CArchive& ar) override; + void Serialize(CVariant& value) const override; + bool IsWorseThan(const CStreamDetail &that) const override; + + std::string m_strLanguage; +}; + +class CStreamDetails final : public IArchivable, public ISerializable +{ +public: + CStreamDetails() { Reset(); } + CStreamDetails(const CStreamDetails &that); + CStreamDetails& operator=(const CStreamDetails &that); + bool operator ==(const CStreamDetails &that) const; + bool operator !=(const CStreamDetails &that) const; + + static std::string VideoDimsToResolutionDescription(int iWidth, int iHeight); + static std::string VideoAspectToAspectDescription(float fAspect); + + bool HasItems(void) const { return m_vecItems.size() > 0; } + int GetStreamCount(CStreamDetail::StreamType type) const; + int GetVideoStreamCount(void) const; + int GetAudioStreamCount(void) const; + int GetSubtitleStreamCount(void) const; + static std::string HdrTypeToString(StreamHdrType hdrType); + const CStreamDetail* GetNthStream(CStreamDetail::StreamType type, int idx) const; + + std::string GetVideoCodec(int idx = 0) const; + float GetVideoAspect(int idx = 0) const; + int GetVideoWidth(int idx = 0) const; + int GetVideoHeight(int idx = 0) const; + std::string GetVideoHdrType (int idx = 0) const; + int GetVideoDuration(int idx = 0) const; + void SetVideoDuration(int idx, const int duration); + std::string GetStereoMode(int idx = 0) const; + std::string GetVideoLanguage(int idx = 0) const; + + std::string GetAudioCodec(int idx = 0) const; + std::string GetAudioLanguage(int idx = 0) const; + int GetAudioChannels(int idx = 0) const; + + std::string GetSubtitleLanguage(int idx = 0) const; + + void AddStream(CStreamDetail *item); + void Reset(void); + void DetermineBestStreams(void); + + void Archive(CArchive& ar) override; + void Serialize(CVariant& value) const override; + + bool SetStreams(const VideoStreamInfo& videoInfo, int videoDuration, const AudioStreamInfo& audioInfo, const SubtitleStreamInfo& subtitleInfo); +private: + CStreamDetail *NewStream(CStreamDetail::StreamType type); + std::vector<std::unique_ptr<CStreamDetail>> m_vecItems; + const CStreamDetailVideo *m_pBestVideo; + const CStreamDetailAudio *m_pBestAudio; + const CStreamDetailSubtitle *m_pBestSubtitle; +}; |