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