4.5.1r9
[enigma2.git] / usr / include / enigma2 / lib / parser / stream / istream.h
1 #ifndef __lib_parser_stream_stream_h
2 #define __lib_parser_stream_stream_h
3
4 #include <string>
5 #include <vector>
6 #include <stdint.h>
7 #include <mutex>
8 #include <lib/base/ebase.h>
9 #include <lib/parser/container/sample.h>
10
11 struct VideoCodecInfo
12 {
13         std::string type; // h264, etc.
14         int width;
15         int height;
16         int bitrate;
17         double framerate;
18         double aspect;
19         std::vector<uint8_t> extraData;
20
21         std::vector<std::map<std::string, std::string>> protections;
22 };
23
24 struct AudioCodecInfo
25 {
26         std::string type;
27         int samplerate;
28         int channels;
29         int misc;
30         int bitrate;
31         int block_align;
32         std::vector<uint8_t> extraData;
33         std::string raw_format;
34         int mpeg_version;
35
36         std::vector<std::map<std::string, std::string>> protections;
37 };
38
39 struct SubtitleInfo
40 {
41         std::string codecs;
42         std::string role;
43         std::string url;
44 };
45
46 enum ContentType
47 {
48         UNKNOWN = -1,
49         VIDEO,
50         AUDIO,
51         TEXT,
52         MIXED = 100
53 };
54
55 struct StreamInfo
56 {
57         StreamInfo() :
58                 type(ContentType::UNKNOWN),
59                 activeIndex(0)
60         {}
61
62         ContentType type;
63         std::string mimeType;
64
65         std::string language;
66         int activeIndex;
67
68         std::vector<VideoCodecInfo> videoCodecInfo;
69         std::vector<AudioCodecInfo> audioCodecInfo;
70         std::vector<SubtitleInfo> subtitleInfo;
71 };
72
73 struct StreamRestrictions
74 {
75         unsigned maxWidth;
76         unsigned maxHeight;
77         unsigned maxBandwidth;
78 };
79
80 class iStream
81 {
82 public:
83         iStream() :     m_valid(false) {}
84         virtual ~iStream() {}
85
86         virtual void init() = 0;
87
88         virtual const std::vector<StreamInfo> &getStreams() const = 0;
89         virtual void deleteStream(int index) = 0;
90         virtual bool selectStream(int index, const StreamRestrictions &restrictions = StreamRestrictions()) = 0;
91
92         virtual bool isLive() const = 0;
93         virtual bool isReady() const = 0;
94         virtual void rebuffer() = 0;
95         virtual int64_t getDuration() const = 0;
96         virtual bool seek(int64_t pts, int index = -1) = 0;
97         virtual bool getVideoFrames(std::vector<RawData> &rawData) = 0;
98         virtual bool getAudioPackets(std::vector<RawData> &rawData) = 0;
99         bool valid() const { std::lock_guard<std::mutex> lk(m_mtx); return m_valid; }
100
101         eSignal0<void> initialized; // emit when meta data is ready
102         eSignal0<void> parsed; // emit when stream init data was parsed (MP4: init segment, TS: PAT/PMT)
103         eSignal0<void> ready; // emit when buffer is okay for the first time
104         eSignal1<void, int> seekDone;
105         eSignal0<void> videoEOS;
106         eSignal0<void> audioEOS;
107
108 protected:
109         mutable std::mutex m_mtx;
110         bool m_valid;
111 };
112
113 #endif