1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
#ifndef __decoder_h
#define __decoder_h
#include <lib/base/object.h>
#include <lib/dvb/demux.h>
class eSocketNotifier;
class eDVBAudio: public iObject
{
DECLARE_REF(eDVBAudio);
private:
ePtr<eDVBDemux> m_demux;
int m_fd, m_fd_demux, m_dev, m_is_freezed;
public:
enum { aMPEG, aAC3, aDTS, aAAC };
eDVBAudio(eDVBDemux *demux, int dev);
enum { aMonoLeft, aStereo, aMonoRight };
void setChannel(int channel);
void stop();
#if HAVE_DVB_API_VERSION < 3
int setPid(int pid, int type);
int startPid();
int start();
int stopPid();
int setAVSync(int val);
#else
int startPid(int pid, int type);
#endif
void flush();
void freeze();
void unfreeze();
int getPTS(pts_t &now);
virtual ~eDVBAudio();
};
class eDVBVideo: public iObject, public Object
{
DECLARE_REF(eDVBVideo);
private:
ePtr<eDVBDemux> m_demux;
int m_fd, m_fd_demux, m_dev;
#if HAVE_DVB_API_VERSION < 3
m_fd_video;
#endif
int m_is_slow_motion, m_is_fast_forward, m_is_freezed;
ePtr<eSocketNotifier> m_sn;
void video_event(int what);
Signal1<void, struct iTSMPEGDecoder::videoEvent> m_event;
int m_width, m_height, m_framerate, m_aspect, m_progressive;
public:
enum { MPEG2, MPEG4_H264 };
eDVBVideo(eDVBDemux *demux, int dev);
void stop();
#if HAVE_DVB_API_VERSION < 3
int setPid(int pid);
int startPid();
int start();
int stopPid();
#else
int startPid(int pid, int type=MPEG2);
#endif
void flush();
void freeze();
int setSlowMotion(int repeat);
int setFastForward(int skip);
void unfreeze();
int getPTS(pts_t &now);
virtual ~eDVBVideo();
RESULT connectEvent(const Slot1<void, struct iTSMPEGDecoder::videoEvent> &event, ePtr<eConnection> &conn);
int getWidth();
int getHeight();
int getProgressive();
int getFrameRate();
int getAspect();
};
class eDVBPCR: public iObject
{
DECLARE_REF(eDVBPCR);
private:
ePtr<eDVBDemux> m_demux;
int m_fd_demux;
public:
eDVBPCR(eDVBDemux *demux);
#if HAVE_DVB_API_VERSION < 3
int setPid(int pid);
int startPid();
#else
int startPid(int pid);
#endif
void stop();
virtual ~eDVBPCR();
};
class eDVBTText: public iObject
{
DECLARE_REF(eDVBTText);
private:
ePtr<eDVBDemux> m_demux;
int m_fd_demux;
public:
eDVBTText(eDVBDemux *demux);
int startPid(int pid);
void stop();
virtual ~eDVBTText();
};
class eTSMPEGDecoder: public Object, public iTSMPEGDecoder
{
DECLARE_REF(eTSMPEGDecoder);
private:
static int m_pcm_delay;
static int m_ac3_delay;
static int m_audio_channel;
std::string m_radio_pic;
ePtr<eDVBDemux> m_demux;
ePtr<eDVBAudio> m_audio;
ePtr<eDVBVideo> m_video;
ePtr<eDVBPCR> m_pcr;
ePtr<eDVBTText> m_text;
int m_vpid, m_vtype, m_apid, m_atype, m_pcrpid, m_textpid;
enum
{
changeVideo = 1,
changeAudio = 2,
changePCR = 4,
changeText = 8
};
int m_changed, m_decoder;
int m_is_ff, m_is_sm, m_is_trickmode;
int setState();
ePtr<eConnection> m_demux_event_conn;
ePtr<eConnection> m_video_event_conn;
void demux_event(int event);
void video_event(struct videoEvent);
Signal1<void, struct videoEvent> m_video_event;
int m_video_clip_fd;
ePtr<eTimer> m_showSinglePicTimer;
void finishShowSinglePic(); // called by timer
public:
enum { pidNone = -1 };
eTSMPEGDecoder(eDVBDemux *demux, int decoder);
virtual ~eTSMPEGDecoder();
RESULT setVideoPID(int vpid, int type);
RESULT setAudioPID(int apid, int type);
RESULT setAudioChannel(int channel);
int getAudioChannel();
RESULT setPCMDelay(int delay);
int getPCMDelay() { return m_pcm_delay; }
RESULT setAC3Delay(int delay);
int getAC3Delay() { return m_ac3_delay; }
RESULT setSyncPCR(int pcrpid);
RESULT setTextPID(int textpid);
RESULT setSyncMaster(int who);
RESULT start();
RESULT preroll();
RESULT freeze(int cont);
RESULT unfreeze();
RESULT setSinglePictureMode(int when);
RESULT setPictureSkipMode(int what);
RESULT setFastForward(int frames_to_skip);
RESULT setSlowMotion(int repeat);
RESULT setZoom(int what);
RESULT flush();
RESULT setTrickmode(int what);
RESULT showSinglePic(const char *filename);
RESULT setRadioPic(const std::string &filename);
/* what 0=auto, 1=video, 2=audio. */
RESULT getPTS(int what, pts_t &pts);
RESULT connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &connection);
int getVideoWidth();
int getVideoHeight();
int getVideoProgressive();
int getVideoFrameRate();
int getVideoAspect();
};
#endif
|