1 /*
2  *  Copyright (C) 2012-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 "DVDInputStream.h"
12 
13 #include <map>
14 #include <memory>
15 #include <vector>
16 
17 class CFileItem;
18 class IDemux;
19 class IVideoPlayer;
20 struct PVR_STREAM_PROPERTIES;
21 
22 namespace PVR
23 {
24   class CPVRClient;
25 }
26 
27 class CInputStreamPVRBase
28   : public CDVDInputStream
29   , public CDVDInputStream::ITimes
30   , public CDVDInputStream::IDemux
31 {
32 public:
33   CInputStreamPVRBase(IVideoPlayer* pPlayer, const CFileItem& fileitem);
34   ~CInputStreamPVRBase() override;
35   bool Open() override;
36   void Close() override;
37   int Read(uint8_t* buf, int buf_size) override;
38   int64_t Seek(int64_t offset, int whence) override;
39   bool IsEOF() override;
40   int64_t GetLength() override;
41   int GetBlockSize() override;
42 
43   ENextStream NextStream() override;
44   bool IsRealtime() override;
45 
GetITimes()46   CDVDInputStream::ITimes* GetITimes() override { return this; }
47   bool GetTimes(Times &times) override;
48 
49   bool CanSeek() override; //! @todo drop this
50   bool CanPause() override;
51   void Pause(bool bPaused);
52 
53   // Demux interface
GetIDemux()54   CDVDInputStream::IDemux* GetIDemux() override { return nullptr; };
55   bool OpenDemux() override;
56   DemuxPacket* ReadDemux() override;
57   CDemuxStream* GetStream(int iStreamId) const override;
58   std::vector<CDemuxStream*> GetStreams() const override;
59   int GetNrOfStreams() const override;
60   void SetSpeed(int iSpeed) override;
61   void FillBuffer(bool mode) override;
62   bool SeekTime(double time, bool backward = false, double* startpts = NULL) override;
63   void AbortDemux() override;
64   void FlushDemux() override;
65 
66 protected:
67   void UpdateStreamMap();
68   std::shared_ptr<CDemuxStream> GetStreamInternal(int iStreamId);
69 
70   virtual bool OpenPVRStream() = 0;
71   virtual void ClosePVRStream() = 0;
72   virtual int ReadPVRStream(uint8_t* buf, int buf_size) = 0;
73   virtual int64_t SeekPVRStream(int64_t offset, int whence) = 0;
74   virtual int64_t GetPVRStreamLength() = 0;
75   virtual ENextStream NextPVRStream() = 0;
76   virtual bool CanPausePVRStream() = 0;
77   virtual bool CanSeekPVRStream() = 0;
78 
79   bool m_eof;
80   std::shared_ptr<PVR_STREAM_PROPERTIES> m_StreamProps;
81   std::map<int, std::shared_ptr<CDemuxStream>> m_streamMap;
82   std::shared_ptr<PVR::CPVRClient> m_client;
83 };
84