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, int type)
54 if ((m_fd < 0) || (m_fd_demux < 0))
56 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");
91 if (::ioctl(m_fd, AUDIO_SET_BYPASS_MODE, bypass) < 0)
92 eWarning("audio: AUDIO_SET_BYPASS_MODE: %m");
94 if (::ioctl(m_fd, AUDIO_PLAY) < 0)
95 eWarning("audio: AUDIO_PLAY: %m");
99 void eDVBAudio::stop()
101 if (::ioctl(m_fd, AUDIO_STOP) < 0)
102 eWarning("audio: AUDIO_STOP: %m");
103 #if HAVE_DVB_API_VERSION > 2
104 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
105 eWarning("audio: DMX_STOP: %m");
109 #if HAVE_DVB_API_VERSION < 3
110 void eDVBAudio::stopPid()
112 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
113 eWarning("audio: DMX_STOP: %m");
117 void eDVBAudio::flush()
119 if (::ioctl(m_fd, AUDIO_CLEAR_BUFFER) < 0)
120 eDebug("audio: AUDIO_CLEAR_BUFFER: %m");
123 void eDVBAudio::freeze()
125 if (::ioctl(m_fd, AUDIO_PAUSE) < 0)
126 eDebug("video: AUDIO_PAUSE: %m");
129 void eDVBAudio::unfreeze()
131 if (::ioctl(m_fd, AUDIO_CONTINUE) < 0)
132 eDebug("video: AUDIO_CONTINUE: %m");
135 eDVBAudio::~eDVBAudio()
143 DEFINE_REF(eDVBVideo);
145 eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev): m_demux(demux)
148 #if HAVE_DVB_API_VERSION < 3
149 sprintf(filename, "/dev/dvb/card%d/video%d", demux->adapter, dev);
151 sprintf(filename, "/dev/dvb/adapter%d/video%d", demux->adapter, dev);
153 m_fd = ::open(filename, O_RDWR);
155 eWarning("%s: %m", filename);
156 #if HAVE_DVB_API_VERSION < 3
157 sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
159 sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
161 m_fd_demux = ::open(filename, O_RDWR);
163 eWarning("%s: %m", filename);
166 int eDVBVideo::startPid(int pid)
168 if ((m_fd < 0) || (m_fd_demux < 0))
170 dmx_pes_filter_params pes;
173 pes.input = DMX_IN_FRONTEND;
174 pes.output = DMX_OUT_DECODER;
175 pes.pes_type = DMX_PES_VIDEO;
177 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
179 eWarning("video: DMX_SET_PES_FILTER: %m");
182 if (::ioctl(m_fd_demux, DMX_START) < 0)
184 eWarning("video: DMX_START: %m");
187 if (::ioctl(m_fd, VIDEO_PLAY) < 0)
188 eWarning("video: VIDEO_PLAY: %m");
192 void eDVBVideo::stop()
194 #if HAVE_DVB_API_VERSION > 2
195 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
196 eWarning("video: DMX_STOP: %m");
198 eDebug("VIDEO_STOP");
199 if (::ioctl(m_fd, VIDEO_STOP, 1) < 0)
200 eWarning("video: VIDEO_STOP: %m");
203 #if HAVE_DVB_API_VERSION < 3
204 void eDVBVideo::stopPid()
206 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
207 eWarning("video: DMX_STOP: %m");
211 void eDVBVideo::flush()
213 if (::ioctl(m_fd, VIDEO_CLEAR_BUFFER) < 0)
214 eDebug("video: VIDEO_CLEAR_BUFFER: %m");
217 void eDVBVideo::freeze()
219 if (::ioctl(m_fd, VIDEO_FREEZE) < 0)
220 eDebug("video: VIDEO_FREEZE: %m");
223 void eDVBVideo::unfreeze()
225 if (::ioctl(m_fd, VIDEO_CONTINUE) < 0)
226 eDebug("video: VIDEO_CONTINUE: %m");
229 int eDVBVideo::setSlowMotion(int repeat)
231 m_is_slow_motion = repeat;
232 return ::ioctl(m_fd, VIDEO_SLOWMOTION, repeat);
235 int eDVBVideo::setFastForward(int skip)
237 m_is_fast_forward = skip;
238 return ::ioctl(m_fd, VIDEO_FAST_FORWARD, skip);
241 eDVBVideo::~eDVBVideo()
243 if (m_is_slow_motion)
245 if (m_is_fast_forward)
255 eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux)
258 #if HAVE_DVB_API_VERSION < 3
259 sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
261 sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
263 m_fd_demux = ::open(filename, O_RDWR);
265 eWarning("%s: %m", filename);
268 int eDVBPCR::startPid(int pid)
272 dmx_pes_filter_params pes;
275 pes.input = DMX_IN_FRONTEND;
276 pes.output = DMX_OUT_DECODER;
277 pes.pes_type = DMX_PES_PCR;
279 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
281 eWarning("video: DMX_SET_PES_FILTER: %m");
284 if (::ioctl(m_fd_demux, DMX_START) < 0)
286 eWarning("video: DMX_START: %m");
294 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
295 eWarning("video: DMX_STOP: %m");
304 DEFINE_REF(eDVBTText);
306 eDVBTText::eDVBTText(eDVBDemux *demux): m_demux(demux)
309 #if HAVE_DVB_API_VERSION < 3
310 sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
312 sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
314 m_fd_demux = ::open(filename, O_RDWR);
316 eWarning("%s: %m", filename);
319 int eDVBTText::startPid(int pid)
323 dmx_pes_filter_params pes;
326 pes.input = DMX_IN_FRONTEND;
327 pes.output = DMX_OUT_DECODER;
328 pes.pes_type = DMX_PES_TELETEXT;
330 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
332 eWarning("video: DMX_SET_PES_FILTER: %m");
335 if (::ioctl(m_fd_demux, DMX_START) < 0)
337 eWarning("video: DMX_START: %m");
343 void eDVBTText::stop()
345 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
346 eWarning("video: DMX_STOP: %m");
349 eDVBTText::~eDVBTText()
355 DEFINE_REF(eTSMPEGDecoder);
357 int eTSMPEGDecoder::setState()
361 int noaudio = m_is_sm || m_is_ff || m_is_trickmode;
362 int nott = noaudio; /* actually same conditions */
364 if ((noaudio && m_audio) || (!m_audio && !noaudio))
365 m_changed |= changeAudio;
367 if ((nott && m_text) || (!m_text && !nott))
368 m_changed |= changeText;
370 #if HAVE_DVB_API_VERSION < 3
371 if (m_changed & changeAudio && m_audio)
373 if (m_changed & changeVideo && m_video)
375 if (m_changed & changePCR && m_pcr)
380 if (m_changed & changeAudio && m_audio)
385 if (m_changed & changeVideo && m_video)
390 if (m_changed & changePCR)
392 m_pcr = new eDVBPCR(m_demux);
393 if (m_pcr->startPid(m_pcrpid))
395 eWarning("pcr: startpid failed!");
398 m_changed &= ~changePCR;
400 if (m_changed & changeVideo)
402 m_video = new eDVBVideo(m_demux, 0);
403 if (m_video->startPid(m_vpid))
405 eWarning("video: startpid failed!");
408 m_changed &= ~changeVideo;
410 if (m_changed & changeAudio)
412 m_audio = new eDVBAudio(m_demux, 0);
413 if (m_audio->startPid(m_apid, m_atype))
415 eWarning("audio: startpid failed!");
418 m_changed &= ~changeAudio;
421 if (m_changed & changePCR)
426 if ((m_pcrpid >= 0) && (m_pcrpid < 0x1FFF))
428 m_pcr = new eDVBPCR(m_demux);
429 if (m_pcr->startPid(m_pcrpid))
431 eWarning("pcr: startpid failed!");
435 m_changed &= ~changePCR;
437 if (m_changed & changeVideo)
439 eDebug("VIDEO CHANGED (to %04x)", m_vpid);
446 if ((m_vpid >= 0) && (m_vpid < 0x1FFF))
449 m_video = new eDVBVideo(m_demux, 0);
450 if (m_video->startPid(m_vpid))
452 eWarning("video: startpid failed!");
456 m_changed &= ~changeVideo;
458 if (m_changed & changeAudio)
463 if ((m_apid >= 0) && (m_apid < 0x1FFF) && !noaudio)
465 m_audio = new eDVBAudio(m_demux, 0);
466 if (m_audio->startPid(m_apid, m_atype))
468 eWarning("audio: startpid failed!");
472 m_changed &= ~changeAudio;
474 if (m_changed & changeText)
479 if ((m_textpid >= 0) && (m_textpid < 0x1FFF) && !nott)
481 m_text = new eDVBTText(m_demux);
482 if (m_text->startPid(m_textpid))
484 eWarning("text: startpid failed!");
488 m_changed &= ~changeText;
494 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux), m_changed(0)
496 demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event);
497 m_is_ff = m_is_sm = m_is_trickmode = 0;
500 eTSMPEGDecoder::~eTSMPEGDecoder()
502 m_vpid = m_apid = m_pcrpid = pidNone;
507 RESULT eTSMPEGDecoder::setVideoPID(int vpid)
511 m_changed |= changeVideo;
517 RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
519 if ((m_apid != apid) || (m_atype != type))
521 m_changed |= changeAudio;
528 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
530 if (m_pcrpid != pcrpid)
532 m_changed |= changePCR;
538 RESULT eTSMPEGDecoder::setTextPID(int textpid)
540 if (m_textpid != textpid)
542 m_changed |= changeText;
548 RESULT eTSMPEGDecoder::setSyncMaster(int who)
553 RESULT eTSMPEGDecoder::start()
558 RESULT eTSMPEGDecoder::freeze(int cont)
569 RESULT eTSMPEGDecoder::unfreeze()
580 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
585 RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
590 RESULT eTSMPEGDecoder::setFastForward(int frames_to_skip)
592 m_is_ff = frames_to_skip != 0;
597 return m_video->setFastForward(frames_to_skip);
602 RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
604 m_is_sm = repeat != 0;
609 return m_video->setSlowMotion(repeat);
614 RESULT eTSMPEGDecoder::setZoom(int what)
619 RESULT eTSMPEGDecoder::flush()
628 void eTSMPEGDecoder::demux_event(int event)
632 case eDVBDemux::evtFlush:
640 RESULT eTSMPEGDecoder::setTrickmode(int what)
642 m_is_trickmode = what;