bf91a6aeacd5d357cf5416998f2db3854a7010c9
[openblackhole/openblackhole-enigma2.git] / 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/rawfile.h>
7 #include <lib/base/elock.h>
8 #include <lib/dvb/pmtparse.h>
9 #include <lib/dvb/idemux.h>
10
11 /*
12  * Note: we're interested in PTS values, not STC values.
13  * thus we're evaluating PES headers, not adaption fields.
14  */
15
16 typedef long long pts_t;
17
18 class eTSFileSectionReader: public iDVBSectionReader, public Object
19 {
20         DECLARE_REF(eTSFileSectionReader);
21         unsigned char sectionData[4096];
22         unsigned int sectionSize;
23         Signal1<void, const uint8_t*> read;
24
25 public:
26         eTSFileSectionReader(eMainloop *context);
27         virtual ~eTSFileSectionReader();
28         void data(unsigned char *packet, unsigned int size);
29         RESULT setBufferSize(int size) { return 0; }
30         RESULT start(const eDVBSectionFilterMask &mask);
31         RESULT stop();
32         RESULT connectRead(const Slot1<void,const uint8_t*> &read, ePtr<eConnection> &conn);
33 };
34
35 class eDVBTSTools : public eDVBPMTParser
36 {
37 public:
38         eDVBTSTools();
39         ~eDVBTSTools();
40
41         void setSource(ePtr<iTsSource> &source, const char *streaminfo_filename=NULL);
42         int openFile(const char *filename, int nostreaminfo = 0);
43
44         /* get (approximate) offset corresponding to PTS */
45         int getOffset(off_t &offset, pts_t &pts, int marg=0);
46         int getNextAccessPoint(pts_t &ts, const pts_t &start, int direction);
47                 /* this fixes up PTS to end up in a [0..len) range.
48                    discontinuities etc. are handled here.
49                   input:
50                     offset - approximate offset in file to resolve ambiguities
51                     pts - video-pts (i.e. current STC of video decoder)
52                   output:
53                     pts - zero-based PTS value
54                 */
55         int fixupPTS(const off_t &offset, pts_t &pts);
56         int calcLen(pts_t &len);
57         int calcBitrate(); /* in bits/sec */
58
59         enum {
60                 frametypeI = 1,
61                 frametypeP = 2,
62                 frametypeB = 4,
63                 frametypeAll = frametypeI | frametypeP | frametypeB
64         };
65         /** findFrame: finds a specific frame at a given position
66         findFrame will look for the specified frame type starting at the given position, moving forward
67         (when direction is >0) or backward (when direction is <0). (direction=0 is a special case and also moves
68         forward, but starts with the last frame.)
69         return values are the new offset, the length of the found frame (both unaligned), and the (signed)
70         number of frames skipped. */
71         int findFrame(off_t &offset, size_t &len, int &direction, int frame_types = frametypeI);
72         int findNextPicture(off_t &offset, size_t &len, int &distance, int frame_types = frametypeAll);
73
74         /* Retrieve PMT. Returns 0 on success. */
75         int findPMT(eDVBPMTParser::program &program);
76
77 protected:
78         void closeSource();
79
80                 /* get first PTS *after* the given offset. */
81                 /* pts values are zero-based. */
82         int getPTS(off_t &offset, pts_t &pts, int fixed=0);
83
84         void calcBegin();
85         void calcEnd();
86         void calcBeginAndEnd();
87
88         void takeSamples();
89         int takeSample(off_t off, pts_t &p);
90
91 private:
92         int m_pid;
93
94         ePtr<iTsSource> m_source;
95
96         int m_begin_valid, m_end_valid;
97         pts_t m_pts_begin, m_pts_end;
98         off_t m_offset_begin, m_offset_end;
99         pts_t m_pts_length;
100
101                 /* for simple linear interpolation */
102         std::map<pts_t, off_t> m_samples;
103         int m_samples_taken;
104
105         eMPEGStreamInformation m_streaminfo;
106         off_t m_last_filelength;
107         int m_futile;
108         program m_program;
109         bool m_pmtready;
110
111         void PMTready(int error);
112 };
113
114 #endif