4.5.0r6
[enigma2.git] / usr / include / enigma2 / lib / dvb / pvrparse.h
1 #ifndef __include_lib_dvb_pvrparse_h
2 #define __include_lib_dvb_pvrparse_h
3
4 #include <lib/components/file_monitor.h>
5 #include <lib/dvb/idvb.h>
6 #include <map>
7 #include <set>
8
9         /* This module parses TS data and collects valuable information  */
10         /* about it, like PTS<->offset correlations and sequence starts. */
11
12 class eFileWatch;
13
14         /* At first, we define the collector class: */
15 class eMPEGStreamInformation
16 {
17         void fileWatchEventCB(eFileWatch *fw, eFileEvent evt);
18 public:
19         eMPEGStreamInformation();
20         ~eMPEGStreamInformation();
21
22         void closeWrite();
23         void closeRead();
24                 /* we order by uint64_t here, since the timestamp may */
25                 /* wrap around. */
26                 /* we only record sequence start's pts values here. */
27         std::map<uint64_t, pts_t> m_access_points;
28                 /* timestampDelta is in fact the difference between */
29                 /* the PTS in the stream and a real PTS from 0..max */
30         std::map<uint64_t, pts_t> m_timestamp_deltas;
31
32                 /* these are non-fixed up pts value (like m_access_points), just used to accelerate stuff. */
33         std::multimap<pts_t, uint64_t> m_pts_to_offset; 
34
35         int startSave(const char *filename);
36         int stopSave(void);
37         int load(const char *filename);
38         
39                 /* recalculates timestampDeltas */
40         void fixupDiscontinuties();
41         
42                 /* get delta at specific offset */
43         pts_t getDelta(uint64_t offset);
44         
45                 /* fixup timestamp near offset, i.e. convert to zero-based */
46         int fixupPTS(const uint64_t &offset, pts_t &ts);
47
48                 /* get PTS before offset */     
49         int getPTS(uint64_t &offset, pts_t &pts);
50         
51                 /* inter/extrapolate timestamp from offset */
52         pts_t getInterpolated(uint64_t offset);
53         
54         uint64_t getAccessPoint(pts_t ts, int marg=0);
55         
56         int getNextAccessPoint(pts_t &ts, const pts_t &start, int direction);
57
58         bool AccessPointsAvail();
59         bool StructureCacheAvail();
60         
61         typedef unsigned long long structure_data;
62                 /* this is usually:
63                         sc | (other_information << 8)
64                         but is really specific to the used video encoder.
65                 */
66         void writeStructureEntry(uint64_t offset, structure_data data);
67
68                 /* get a structure entry at given offset (or previous one, if no exact match was found).
69                    optionally, return next element. Offset will be returned. this allows you to easily
70                    get previous and next structure elements. */
71         int getStructureEntry(uint64_t &offset, uint64_t &data, int get_next);
72         int update_structure_cache(uint64_t offset);
73
74         std::string m_filename;
75
76         /* used for read */
77         int m_structure_cache_entries;
78         int m_structure_read_fd;
79         uint64_t *m_structure_read_mem;
80         off_t m_structure_read_size;
81         int m_structure_read_prev_result; // prev returned entry used for accel next search
82         eFileWatch *m_structure_file_watch;
83         bool m_structure_file_changed;
84
85         /* used for write */
86         int m_structure_wp;
87         int m_structure_write_fd;
88         uint64_t *m_structure_write_mem;
89 };
90
91         /* Now we define the parser's state: */
92 class eMPEGStreamParserTS
93 {
94 public:
95         eMPEGStreamParserTS(eMPEGStreamInformation &streaminfo);
96         void parseData(uint64_t offset, const void *data, unsigned int len);
97         void setPid(int pid, int streamtype);
98         int getLastPTS(pts_t &last_pts);
99         void setAccessPoints(bool on);
100 private:
101         eMPEGStreamInformation &m_streaminfo;
102         unsigned char m_pkt[188];
103         int m_pktptr;
104         int processPacket(const unsigned char *pkt, uint64_t offset);
105         inline int wantPacket(const unsigned char *hdr) const;
106         int m_pid, m_streamtype;
107         int m_need_next_packet;
108         int m_last_pts_valid;
109         pts_t m_last_pts;
110         bool m_collect_accesspoints;
111         unsigned char m_pkt2[188*2];
112         uint64_t m_last_sc_offset;
113         int m_last_sc_offset_valid;
114 };
115
116 #endif