1 /* 2 * Copyright (C) 2005-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 "ISerializable.h" 12 #include "utils/IArchivable.h" 13 14 #include <memory> 15 #include <string> 16 #include <vector> 17 18 class CStreamDetails; 19 class CVariant; 20 struct VideoStreamInfo; 21 struct AudioStreamInfo; 22 struct SubtitleStreamInfo; 23 24 class CStreamDetail : public IArchivable, public ISerializable 25 { 26 public: 27 enum StreamType { 28 VIDEO, 29 AUDIO, 30 SUBTITLE 31 }; 32 CStreamDetail(StreamType type)33 explicit CStreamDetail(StreamType type) : m_eType(type), m_pParent(NULL) {}; 34 virtual ~CStreamDetail() = default; 35 virtual bool IsWorseThan(const CStreamDetail &that) const = 0; 36 37 const StreamType m_eType; 38 39 protected: 40 CStreamDetails *m_pParent; 41 friend class CStreamDetails; 42 }; 43 44 class CStreamDetailVideo final : public CStreamDetail 45 { 46 public: 47 CStreamDetailVideo(); 48 CStreamDetailVideo(const VideoStreamInfo &info, int duration = 0); 49 void Archive(CArchive& ar) override; 50 void Serialize(CVariant& value) const override; 51 bool IsWorseThan(const CStreamDetail &that) const override; 52 53 int m_iWidth = 0; 54 int m_iHeight = 0; 55 float m_fAspect = 0.0; 56 int m_iDuration = 0; 57 std::string m_strCodec; 58 std::string m_strStereoMode; 59 std::string m_strLanguage; 60 }; 61 62 class CStreamDetailAudio final : public CStreamDetail 63 { 64 public: 65 CStreamDetailAudio(); 66 CStreamDetailAudio(const AudioStreamInfo &info); 67 void Archive(CArchive& ar) override; 68 void Serialize(CVariant& value) const override; 69 bool IsWorseThan(const CStreamDetail &that) const override; 70 71 int m_iChannels = -1; 72 std::string m_strCodec; 73 std::string m_strLanguage; 74 }; 75 76 class CStreamDetailSubtitle final : public CStreamDetail 77 { 78 public: 79 CStreamDetailSubtitle(); 80 CStreamDetailSubtitle(const SubtitleStreamInfo &info); 81 CStreamDetailSubtitle& operator=(const CStreamDetailSubtitle &that); 82 void Archive(CArchive& ar) override; 83 void Serialize(CVariant& value) const override; 84 bool IsWorseThan(const CStreamDetail &that) const override; 85 86 std::string m_strLanguage; 87 }; 88 89 class CStreamDetails final : public IArchivable, public ISerializable 90 { 91 public: CStreamDetails()92 CStreamDetails() { Reset(); }; 93 CStreamDetails(const CStreamDetails &that); 94 CStreamDetails& operator=(const CStreamDetails &that); 95 bool operator ==(const CStreamDetails &that) const; 96 bool operator !=(const CStreamDetails &that) const; 97 98 static std::string VideoDimsToResolutionDescription(int iWidth, int iHeight); 99 static std::string VideoAspectToAspectDescription(float fAspect); 100 HasItems(void)101 bool HasItems(void) const { return m_vecItems.size() > 0; }; 102 int GetStreamCount(CStreamDetail::StreamType type) const; 103 int GetVideoStreamCount(void) const; 104 int GetAudioStreamCount(void) const; 105 int GetSubtitleStreamCount(void) const; 106 const CStreamDetail* GetNthStream(CStreamDetail::StreamType type, int idx) const; 107 108 std::string GetVideoCodec(int idx = 0) const; 109 float GetVideoAspect(int idx = 0) const; 110 int GetVideoWidth(int idx = 0) const; 111 int GetVideoHeight(int idx = 0) const; 112 int GetVideoDuration(int idx = 0) const; 113 void SetVideoDuration(int idx, const int duration); 114 std::string GetStereoMode(int idx = 0) const; 115 std::string GetVideoLanguage(int idx = 0) const; 116 117 std::string GetAudioCodec(int idx = 0) const; 118 std::string GetAudioLanguage(int idx = 0) const; 119 int GetAudioChannels(int idx = 0) const; 120 121 std::string GetSubtitleLanguage(int idx = 0) const; 122 123 void AddStream(CStreamDetail *item); 124 void Reset(void); 125 void DetermineBestStreams(void); 126 127 void Archive(CArchive& ar) override; 128 void Serialize(CVariant& value) const override; 129 130 bool SetStreams(const VideoStreamInfo& videoInfo, int videoDuration, const AudioStreamInfo& audioInfo, const SubtitleStreamInfo& subtitleInfo); 131 private: 132 CStreamDetail *NewStream(CStreamDetail::StreamType type); 133 std::vector<std::unique_ptr<CStreamDetail>> m_vecItems; 134 const CStreamDetailVideo *m_pBestVideo; 135 const CStreamDetailAudio *m_pBestAudio; 136 const CStreamDetailSubtitle *m_pBestSubtitle; 137 }; 138