- add python, missing gui
[enigma2.git] / lib / dvb / decoder.cpp
1 #include <lib/base/eerror.h>
2 #include <lib/dvb/decoder.h>
3 #include <linux/dvb/audio.h>
4 #include <linux/dvb/video.h>
5 #include <linux/dvb/dmx.h>
6
7 #include <unistd.h>
8 #include <fcntl.h>
9 #include <sys/ioctl.h>
10 #include <errno.h>
11
12 DEFINE_REF(eDVBAudio);
13
14 eDVBAudio::eDVBAudio(eDVBDemux *demux, int dev): m_demux(demux)
15 {
16         char filename[128];
17         sprintf(filename, "/dev/dvb/adapter%d/audio%d", demux->adapter, dev);
18         m_fd = ::open(filename, O_RDWR);
19         if (m_fd < 0)
20                 eWarning("%s: %m", filename);
21         sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
22         m_fd_demux = ::open(filename, O_RDWR);
23         if (m_fd_demux < 0)
24                 eWarning("%s: %m", filename);
25 }
26         
27 int eDVBAudio::startPid(int pid)
28 {       
29         eDebug("setting audio pid to %x", pid);
30         if ((m_fd < 0) || (m_fd_demux < 0))
31                 return -1;
32         dmx_pes_filter_params pes;
33         
34         pes.pid      = pid;
35         pes.input    = DMX_IN_FRONTEND;
36         pes.output   = DMX_OUT_DECODER;
37         pes.pes_type = DMX_PES_AUDIO0;
38         pes.flags    = 0;
39         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
40         {
41                 eWarning("audio: DMX_SET_PES_FILTER: %m");
42                 return -errno;
43         }
44         if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
45         {
46                 eWarning("audio: DMX_START: %m");
47                 return -errno;
48         }
49         
50         if (::ioctl(m_fd, AUDIO_PLAY) < 0)
51                 eWarning("audio: AUDIO_PLAY: %m");
52         return 0;
53 }
54         
55 void eDVBAudio::stop()
56 {
57         if (::ioctl(m_fd, AUDIO_STOP) < 0)
58                 eWarning("audio: AUDIO_STOP: %m");
59         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
60                 eWarning("audio: DMX_STOP: %m");
61 }
62         
63 eDVBAudio::~eDVBAudio()
64 {
65         if (m_fd >= 0)
66                 ::close(m_fd);
67         if (m_fd_demux >= 0)
68                 ::close(m_fd_demux);
69 }
70
71 DEFINE_REF(eDVBVideo);
72
73 eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev): m_demux(demux)
74 {
75         char filename[128];
76         sprintf(filename, "/dev/dvb/adapter%d/video%d", demux->adapter, dev);
77         m_fd = ::open(filename, O_RDWR);
78         if (m_fd < 0)
79                 eWarning("%s: %m", filename);
80         sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
81         m_fd_demux = ::open(filename, O_RDWR);
82         if (m_fd_demux < 0)
83                 eWarning("%s: %m", filename);
84 }
85         
86 int eDVBVideo::startPid(int pid)
87 {       
88         if ((m_fd < 0) || (m_fd_demux < 0))
89                 return -1;
90         dmx_pes_filter_params pes;
91         
92         pes.pid      = pid;
93         pes.input    = DMX_IN_FRONTEND;
94         pes.output   = DMX_OUT_DECODER;
95         pes.pes_type = DMX_PES_VIDEO0;
96         pes.flags    = 0;
97         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
98         {
99                 eWarning("video: DMX_SET_PES_FILTER: %m");
100                 return -errno;
101         }
102         if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
103         {
104                 eWarning("video: DMX_START: %m");
105                 return -errno;
106         }
107         
108         if (::ioctl(m_fd, VIDEO_PLAY) < 0)
109                 eWarning("video: VIDEO_PLAY: %m");
110         else
111                 eDebug("video ok");
112         return 0;
113 }
114         
115 void eDVBVideo::stop()
116 {
117         if (::ioctl(m_fd, VIDEO_STOP) < 0)
118                 eWarning("video: VIDEO_STOP: %m");
119         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
120                 eWarning("video: DMX_STOP: %m");
121 }
122         
123 eDVBVideo::~eDVBVideo()
124 {
125         if (m_fd >= 0)
126                 ::close(m_fd);
127         if (m_fd_demux >= 0)
128                 ::close(m_fd_demux);
129 }
130
131 DEFINE_REF(eTSMPEGDecoder);
132
133 int eTSMPEGDecoder::setState()
134 {
135         int res = 0;
136         eDebug("changed %x", m_changed);
137         if (m_changed & changeAudio)
138         {
139                 if (m_audio)
140                         m_audio->stop();
141                 m_audio = 0;
142                 m_audio = new eDVBAudio(m_demux, 0);
143                 if (m_audio->startPid(m_apid))
144                 {
145                         eWarning("audio: startpid failed!");
146                         res = -1;
147                 }
148                 m_changed &= ~changeAudio;
149         }
150         if (m_changed & changeVideo)
151         {
152                 if (m_video)
153                         m_video->stop();
154                 m_video = 0;
155                 m_video = new eDVBVideo(m_demux, 0);
156                 if (m_video->startPid(m_vpid))
157                 {
158                         eWarning("video: startpid failed!");
159                         res = -1;
160                 }
161                 m_changed &= ~changeVideo;
162         }
163         return res;
164 }
165
166 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux)
167 {
168 }
169
170 eTSMPEGDecoder::~eTSMPEGDecoder()
171 {
172         m_vpid = m_apid = m_pcrpid = pidNone;
173         m_changed = -1;
174         setState();
175 }
176
177 RESULT eTSMPEGDecoder::setVideoPID(int vpid)
178 {
179         if (m_vpid != vpid)
180         {
181                 m_changed |= changeVideo;
182                 m_vpid = vpid;
183         }
184         return 0;
185 }
186
187 RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
188 {
189         if ((m_apid != apid) || (m_atype != type))
190         {
191                 m_changed |= changeAudio;
192                 m_atype = type;
193                 m_apid = apid;
194         }
195         return 0;
196 }
197
198 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
199 {
200         if (m_pcrpid != pcrpid)
201         {
202                 m_changed |= changeAudio;
203                 m_pcrpid = pcrpid;
204         }
205         return -1;
206 }
207
208 RESULT eTSMPEGDecoder::setSyncMaster(int who)
209 {
210         return -1;
211 }
212
213 RESULT eTSMPEGDecoder::start()
214 {
215         return setState();
216 }
217
218 RESULT eTSMPEGDecoder::freeze(int cont)
219 {
220         return -1;
221 }
222
223 RESULT eTSMPEGDecoder::unfreeze()
224 {
225         return -1;
226 }
227
228 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
229 {
230         return -1;
231 }
232
233 RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
234 {
235         return -1;
236 }
237
238 RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
239 {
240         return -1;
241 }
242
243 RESULT eTSMPEGDecoder::setZoom(int what)
244 {
245         return -1;
246 }