4.2.1r3
[enigma2.git] / usr / include / enigma2 / lib / dvb / tstools.h
1 #ifndef __lib_dvb_tstools_h
2 #define __lib_dvb_tstools_h
3
4 #include <sys/types.h>
5 #include <lib/dvb/pvrparse.h>
6 #include <lib/base/itssource.h>
7 #include <lib/base/elock.h>
8 #include <inttypes.h>
9
10 /*
11  * Note: we're interested in PTS values, not STC values.
12  * thus we're evaluating PES headers, not adaption fields.
13  */
14
15 typedef long long pts_t;
16
17 class eDVBTSTools
18 {
19 public:
20         eDVBTSTools();
21         ~eDVBTSTools();
22
23         void setSource(ePtr<iTsSource> &source, const char *streaminfo_filename=NULL);
24         void closeSource();
25
26         int openFile(const char *filename, int nostreaminfo = 0);
27         void closeFile();
28
29         void setSyncPID(int pid);
30         void setSearchRange(int maxrange);
31         
32                 /* get first PTS *after* the given offset. */
33                 /* pts values are zero-based. */
34         int getPTS(uint64_t &offset, pts_t &pts, int fixed=0);
35         
36                 /* this fixes up PTS to end up in a [0..len) range.
37                    discontinuities etc. are handled here.
38                 
39                   input:        
40                     offset - approximate offset in file to resolve ambiguities
41                     pts - video-pts (i.e. current STC of video decoder)
42                   output:
43                     pts - zero-based PTS value
44                 */
45         int fixupPTS(const uint64_t &offset, pts_t &pts);
46         
47                 /* get (approximate) offset corresponding to PTS */
48         int getOffset(uint64_t &offset, pts_t &pts, int marg=0);
49         
50         int getNextAccessPoint(pts_t &ts, const pts_t &start, int direction);
51         
52         void calcBegin();
53         void calcEnd();
54         
55         int calcLen(pts_t &len);
56         
57         int calcBitrate(); /* in bits/sec */
58         
59         void takeSamples();
60         int takeSample(uint64_t off, pts_t &p);
61         
62         int findPMT(int &pmt_pid, int &service_id);
63         
64         enum { 
65                 frametypeI = 1, 
66                 frametypeP = 2, 
67                 frametypeB = 4, 
68                 frametypeAll = frametypeI | frametypeP | frametypeB
69         };
70         /** findFrame: finds a specific frame at a given position
71         
72         findFrame will look for the specified frame type starting at the given position, moving forward
73         (when direction is >0) or backward (when direction is <0). (direction=0 is a special case and also moves
74         forward, but starts with the last frame.)
75         
76         return values are the new offset, the length of the found frame (both unaligned), and the (signed)
77         number of frames skipped. */
78         int findFrame(uint64_t &offset, size_t &len, int &direction, int frame_types = frametypeI);
79         int findNextPicture(uint64_t &offset, size_t &len, int &distance, int frame_types = frametypeAll);
80
81         /** search backwards from offset to the prev seq header
82         returns the number of frames skipped. */
83         int setSeqHeader(uint64_t &offset);
84
85         uint64_t byteLen() const { return m_last_filelength; }
86
87 private:
88         int m_pid;
89         int m_maxrange;
90
91         ePtr<iTsSource> m_source;
92
93         int m_begin_valid, m_end_valid;
94         pts_t m_pts_begin, m_pts_end;
95         uint64_t m_offset_begin, m_offset_end;
96         
97                 /* for simple linear interpolation */
98         std::map<pts_t, uint64_t> m_samples;
99         int m_samples_taken;
100         
101         eMPEGStreamInformation m_streaminfo;
102         int m_use_streaminfo;
103         uint64_t m_last_filelength;
104         int m_futile;
105 };
106
107 #endif