kodi
DVDInputStream.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 "FileItem.h"
12 #include "URL.h"
13 #include "cores/MenuType.h"
14 #include "filesystem/IFileTypes.h"
15 #include "utils/BitstreamStats.h"
16 #include "utils/Geometry.h"
17 
18 #include <string>
19 #include <vector>
20 
21 enum DVDStreamType
22 {
23  DVDSTREAM_TYPE_NONE = -1,
24  DVDSTREAM_TYPE_FILE = 1,
25  DVDSTREAM_TYPE_DVD = 2,
26  DVDSTREAM_TYPE_HTTP = 3,
27  DVDSTREAM_TYPE_MEMORY = 4,
28  DVDSTREAM_TYPE_FFMPEG = 5,
29  DVDSTREAM_TYPE_TV = 6,
30  DVDSTREAM_TYPE_MPLS = 10,
31  DVDSTREAM_TYPE_BLURAY = 11,
32  DVDSTREAM_TYPE_PVRMANAGER = 12,
33  DVDSTREAM_TYPE_MULTIFILES = 13,
34  DVDSTREAM_TYPE_ADDON = 14
35 };
36 
37 #define SEEK_POSSIBLE 0x10 // flag used to check if protocol allows seeks
38 
39 #define DVDSTREAM_BLOCK_SIZE_FILE (2048 * 16)
40 #define DVDSTREAM_BLOCK_SIZE_DVD 2048
41 
42 namespace XFILE
43 {
44  class CFile;
45 }
46 
47 struct DemuxPacket;
48 class CDemuxStream;
49 
51 {
52 public:
53 
55  {
56  public:
57  virtual ~IDisplayTime() = default;
58  virtual int GetTotalTime() = 0;
59  virtual int GetTime() = 0;
60  };
61 
62  class ITimes
63  {
64  public:
65  struct Times
66  {
67  time_t startTime;
68  double ptsStart;
69  double ptsBegin;
70  double ptsEnd;
71  };
72  virtual ~ITimes() = default;
73  virtual bool GetTimes(Times &times) = 0;
74  };
75 
76  class IPosTime
77  {
78  public:
79  virtual ~IPosTime() = default;
80  virtual bool PosTime(int ms) = 0;
81  };
82 
83  class IChapter
84  {
85  public:
86  virtual ~IChapter() = default;
87  virtual int GetChapter() = 0;
88  virtual int GetChapterCount() = 0;
89  virtual void GetChapterName(std::string& name, int ch=-1) = 0;
90  virtual int64_t GetChapterPos(int ch=-1) = 0;
91  virtual bool SeekChapter(int ch) = 0;
92  };
93 
94  class IMenus
95  {
96  public:
97  virtual ~IMenus() = default;
98  virtual void ActivateButton() = 0;
99  virtual void SelectButton(int iButton) = 0;
100  virtual int GetCurrentButton() = 0;
101  virtual int GetTotalButtons() = 0;
102  virtual void OnUp() = 0;
103  virtual void OnDown() = 0;
104  virtual void OnLeft() = 0;
105  virtual void OnRight() = 0;
106 
110  virtual bool OnMenu() = 0;
111  virtual void OnBack() = 0;
112  virtual void OnNext() = 0;
113  virtual void OnPrevious() = 0;
114  virtual bool OnMouseMove(const CPoint &point) = 0;
115  virtual bool OnMouseClick(const CPoint &point) = 0;
116 
121  virtual MenuType GetSupportedMenuType() = 0;
122 
123  virtual bool IsInMenu() = 0;
124  virtual void SkipStill() = 0;
125  virtual double GetTimeStampCorrection() { return 0.0; }
126  virtual bool GetState(std::string &xmlstate) = 0;
127  virtual bool SetState(const std::string &xmlstate) = 0;
128  virtual bool CanSeek() { return !IsInMenu(); }
129  };
130 
131  class IDemux
132  {
133  public:
134  virtual ~IDemux() = default;
135  virtual bool OpenDemux() = 0;
136  virtual DemuxPacket* ReadDemux() = 0;
137  virtual CDemuxStream* GetStream(int iStreamId) const = 0;
138  virtual std::vector<CDemuxStream*> GetStreams() const = 0;
139  virtual void EnableStream(int iStreamId, bool enable) {}
140  virtual bool OpenStream(int iStreamId) { return false; }
141  virtual int GetNrOfStreams() const = 0;
142  virtual void SetSpeed(int iSpeed) = 0;
143  virtual void FillBuffer(bool mode) {}
144  virtual bool SeekTime(double time, bool backward = false, double* startpts = NULL) = 0;
145  virtual void AbortDemux() = 0;
146  virtual void FlushDemux() = 0;
147  virtual void SetVideoResolution(unsigned int width,
148  unsigned int height,
149  unsigned int maxWidth,
150  unsigned int maxHeight)
151  {
152  }
153  };
154 
155  enum ENextStream
156  {
157  NEXTSTREAM_NONE,
158  NEXTSTREAM_OPEN,
159  NEXTSTREAM_RETRY,
160  };
161 
162  CDVDInputStream(DVDStreamType m_streamType, const CFileItem& fileitem);
163  virtual ~CDVDInputStream();
164  virtual bool Open();
165  virtual void Close();
166  virtual int Read(uint8_t* buf, int buf_size) = 0;
167  virtual int64_t Seek(int64_t offset, int whence) = 0;
168  virtual int64_t GetLength() = 0;
169  virtual std::string& GetContent() { return m_content; }
170  virtual std::string GetFileName();
171  virtual CURL GetURL();
172  virtual ENextStream NextStream() { return NEXTSTREAM_NONE; }
173  virtual void Abort() {}
174  virtual int GetBlockSize() { return 0; }
175  virtual bool CanSeek() { return true; }
176  virtual bool CanPause() { return false; }
177 
182  virtual void SetReadRate(uint32_t rate) {}
183 
187  virtual bool GetCacheStatus(XFILE::SCacheStatus *status) { return false; }
188 
189  bool IsStreamType(DVDStreamType type) const { return m_streamType == type; }
190  virtual bool IsEOF() = 0;
191  virtual BitstreamStats GetBitstreamStats() const { return m_stats; }
192 
193  bool ContentLookup() { return m_contentLookup; }
194 
195  virtual bool IsRealtime() { return m_realtime; }
196 
197  void SetRealtime(bool realtime) { m_realtime = realtime; }
198 
199  // interfaces
200  virtual IDemux* GetIDemux() { return nullptr; }
201  virtual IPosTime* GetIPosTime() { return nullptr; }
202  virtual IDisplayTime* GetIDisplayTime() { return nullptr; }
203  virtual ITimes* GetITimes() { return nullptr; }
204  virtual IChapter* GetIChapter() { return nullptr; }
205 
206  const CVariant& GetProperty(const std::string& key) { return m_item.GetProperty(key); }
207 
208 protected:
209  DVDStreamType m_streamType;
210  BitstreamStats m_stats;
211  std::string m_content;
212  CFileItem m_item;
213  bool m_contentLookup;
214  bool m_realtime;
215 };
virtual bool GetCacheStatus(XFILE::SCacheStatus *status)
Get the cache status.
Definition: DVDInputStream.h:187
Definition: Scraper.h:41
Definition: DVDInputStream.h:50
virtual void SetReadRate(uint32_t rate)
Indicate expected read rate in bytes per second. This could be used to throttle caching rate...
Definition: DVDInputStream.h:182
Definition: URL.h:21
Definition: DVDInputStream.h:131
Definition: DVDInputStream.h:54
Definition: DVDInputStream.h:83
Definition: BitstreamStats.h:13
Definition: IFileTypes.h:49
Definition: Variant.h:31
Definition: SimpleFS.h:27
Definition: DVDInputStream.h:65
Definition: DVDInputStream.h:62
Definition: DVDInputStream.h:94
Definition: DVDDemux.h:72
Definition: DemuxPacket.h:22
Definition: DVDInputStream.h:76
virtual bool CanPause()
Definition: DVDInputStream.h:176
Represents a file on a share.
Definition: FileItem.h:102