1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 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;
};
|