2 #include <lib/base/eerror.h>
3 #include <lib/dvb/decoder.h>
4 #if HAVE_DVB_API_VERSION < 3
5 #define audioStatus audio_status
6 #define videoStatus video_status
7 #define pesType pes_type
8 #define playState play_state
9 #define audioStreamSource_t audio_stream_source_t
10 #define videoStreamSource_t video_stream_source_t
11 #define streamSource stream_source
12 #define dmxPesFilterParams dmx_pes_filter_params
13 #define DMX_PES_VIDEO DMX_PES_VIDEO0
14 #define DMX_PES_AUDIO DMX_PES_AUDIO0
16 #include <ost/video.h>
17 #include <ost/audio.h>
19 #include <linux/dvb/audio.h>
20 #include <linux/dvb/video.h>
21 #include <linux/dvb/dmx.h>
26 #include <sys/ioctl.h>
29 DEFINE_REF(eDVBAudio);
31 eDVBAudio::eDVBAudio(eDVBDemux *demux, int dev): m_demux(demux)
34 #if HAVE_DVB_API_VERSION < 3
35 sprintf(filename, "/dev/dvb/card%d/audio%d", demux->adapter, dev);
37 sprintf(filename, "/dev/dvb/adapter%d/audio%d", demux->adapter, dev);
39 m_fd = ::open(filename, O_RDWR);
41 eWarning("%s: %m", filename);
42 #if HAVE_DVB_API_VERSION < 3
43 sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
45 sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
47 m_fd_demux = ::open(filename, O_RDWR);
49 eWarning("%s: %m", filename);
52 int eDVBAudio::startPid(int pid)
54 eDebug("setting audio pid to %x", pid);
55 if ((m_fd < 0) || (m_fd_demux < 0))
57 dmx_pes_filter_params pes;
59 pes.input = DMX_IN_FRONTEND;
60 pes.output = DMX_OUT_DECODER;
61 pes.pes_type = DMX_PES_AUDIO; // DMX_PES_AUDIO0
63 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
65 eWarning("audio: DMX_SET_PES_FILTER: %m");
68 if (::ioctl(m_fd_demux, DMX_START) < 0)
70 eWarning("audio: DMX_START: %m");
73 if (::ioctl(m_fd, AUDIO_PLAY) < 0)
74 eWarning("audio: AUDIO_PLAY: %m");
78 void eDVBAudio::stop()
80 if (::ioctl(m_fd, AUDIO_STOP) < 0)
81 eWarning("audio: AUDIO_STOP: %m");
82 #if HAVE_DVB_API_VERSION > 2
83 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
84 eWarning("audio: DMX_STOP: %m");
88 #if HAVE_DVB_API_VERSION < 3
89 void eDVBAudio::stopPid()
91 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
92 eWarning("audio: DMX_STOP: %m");
96 void eDVBAudio::flush()
98 if (::ioctl(m_fd, AUDIO_CLEAR_BUFFER) < 0)
99 eDebug("audio: AUDIO_CLEAR_BUFFER: %m");
102 eDVBAudio::~eDVBAudio()
110 DEFINE_REF(eDVBVideo);
112 eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev): m_demux(demux)
115 #if HAVE_DVB_API_VERSION < 3
116 sprintf(filename, "/dev/dvb/card%d/video%d", demux->adapter, dev);
118 sprintf(filename, "/dev/dvb/adapter%d/video%d", demux->adapter, dev);
120 m_fd = ::open(filename, O_RDWR);
122 eWarning("%s: %m", filename);
123 #if HAVE_DVB_API_VERSION < 3
124 sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
126 sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
128 m_fd_demux = ::open(filename, O_RDWR);
130 eWarning("%s: %m", filename);
133 int eDVBVideo::startPid(int pid)
135 eDebug("setting video pid to %x", pid);
136 if ((m_fd < 0) || (m_fd_demux < 0))
138 dmx_pes_filter_params pes;
141 pes.input = DMX_IN_FRONTEND;
142 pes.output = DMX_OUT_DECODER;
143 pes.pes_type = DMX_PES_VIDEO;
145 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
147 eWarning("video: DMX_SET_PES_FILTER: %m");
150 if (::ioctl(m_fd_demux, DMX_START) < 0)
152 eWarning("video: DMX_START: %m");
155 if (::ioctl(m_fd, VIDEO_PLAY) < 0)
156 eWarning("video: VIDEO_PLAY: %m");
162 void eDVBVideo::stop()
164 if (::ioctl(m_fd, VIDEO_STOP) < 0)
165 eWarning("video: VIDEO_STOP: %m");
166 #if HAVE_DVB_API_VERSION > 2
167 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
168 eWarning("video: DMX_STOP: %m");
172 #if HAVE_DVB_API_VERSION < 3
173 void eDVBVideo::stopPid()
175 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
176 eWarning("video: DMX_STOP: %m");
180 void eDVBVideo::flush()
182 if (::ioctl(m_fd, VIDEO_CLEAR_BUFFER) < 0)
183 eDebug("video: VIDEO_CLEAR_BUFFER: %m");
186 void eDVBVideo::freeze()
188 if (::ioctl(m_fd, VIDEO_FREEZE) < 0)
189 eDebug("video: VIDEO_FREEZE: %m");
192 void eDVBVideo::unfreeze()
194 if (::ioctl(m_fd, VIDEO_CONTINUE) < 0)
195 eDebug("video: VIDEO_CONTINUE: %m");
198 eDVBVideo::~eDVBVideo()
208 eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux)
211 #if HAVE_DVB_API_VERSION < 3
212 sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
214 sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
216 m_fd_demux = ::open(filename, O_RDWR);
218 eWarning("%s: %m", filename);
221 int eDVBPCR::startPid(int pid)
223 eDebug("setting pcr pid to %x", pid);
226 dmx_pes_filter_params pes;
229 pes.input = DMX_IN_FRONTEND;
230 pes.output = DMX_OUT_DECODER;
231 pes.pes_type = DMX_PES_PCR;
233 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
235 eWarning("video: DMX_SET_PES_FILTER: %m");
238 if (::ioctl(m_fd_demux, DMX_START) < 0)
240 eWarning("video: DMX_START: %m");
248 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
249 eWarning("video: DMX_STOP: %m");
258 DEFINE_REF(eTSMPEGDecoder);
260 int eTSMPEGDecoder::setState()
263 eDebug("changed %x", m_changed);
264 #if HAVE_DVB_API_VERSION < 3
265 if (m_changed & changeAudio && m_audio)
267 if (m_changed & changeVideo && m_video)
269 if (m_changed & changePCR && m_pcr)
274 if (m_changed & changeAudio && m_audio)
279 if (m_changed & changeVideo && m_video)
284 if (m_changed & changePCR)
286 m_pcr = new eDVBPCR(m_demux);
287 if (m_pcr->startPid(m_pcrpid))
289 eWarning("video: startpid failed!");
292 m_changed &= ~changePCR;
294 if (m_changed & changeVideo)
296 m_video = new eDVBVideo(m_demux, 0);
297 if (m_video->startPid(m_vpid))
299 eWarning("video: startpid failed!");
302 m_changed &= ~changeVideo;
304 if (m_changed & changeAudio)
306 m_audio = new eDVBAudio(m_demux, 0);
307 if (m_audio->startPid(m_apid))
309 eWarning("audio: startpid failed!");
312 m_changed &= ~changeAudio;
315 if (m_changed & changePCR)
320 if ((m_pcrpid >= 0) && (m_pcrpid < 0x1FFF))
322 m_pcr = new eDVBPCR(m_demux);
323 if (m_pcr->startPid(m_pcrpid))
325 eWarning("video: startpid failed!");
329 m_changed &= ~changePCR;
331 if (m_changed & changeVideo)
336 if ((m_vpid >= 0) && (m_vpid < 0x1FFF))
338 m_video = new eDVBVideo(m_demux, 0);
339 if (m_video->startPid(m_vpid))
341 eWarning("video: startpid failed!");
345 m_changed &= ~changeVideo;
347 if (m_changed & changeAudio)
352 if ((m_apid >= 0) && (m_apid < 0x1FFF))
354 m_audio = new eDVBAudio(m_demux, 0);
355 if (m_audio->startPid(m_apid))
357 eWarning("audio: startpid failed!");
361 m_changed &= ~changeAudio;
367 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux), m_changed(0)
369 demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event);
372 eTSMPEGDecoder::~eTSMPEGDecoder()
374 m_vpid = m_apid = m_pcrpid = pidNone;
379 RESULT eTSMPEGDecoder::setVideoPID(int vpid)
383 m_changed |= changeVideo;
389 RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
391 if ((m_apid != apid) || (m_atype != type))
393 m_changed |= changeAudio;
400 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
402 if (m_pcrpid != pcrpid)
404 m_changed |= changePCR;
410 RESULT eTSMPEGDecoder::setSyncMaster(int who)
415 RESULT eTSMPEGDecoder::start()
420 RESULT eTSMPEGDecoder::freeze(int cont)
429 RESULT eTSMPEGDecoder::unfreeze()
438 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
443 RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
448 RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
453 RESULT eTSMPEGDecoder::setZoom(int what)
458 RESULT eTSMPEGDecoder::flush()
467 void eTSMPEGDecoder::demux_event(int event)
471 case eDVBDemux::evtFlush: