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>
12 DEFINE_REF(eDVBAudio);
14 eDVBAudio::eDVBAudio(eDVBDemux *demux, int dev): m_demux(demux)
17 sprintf(filename, "/dev/dvb/adapter%d/audio%d", demux->adapter, dev);
18 m_fd = ::open(filename, O_RDWR);
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);
24 eWarning("%s: %m", filename);
27 int eDVBAudio::startPid(int pid)
29 eDebug("setting audio pid to %x", pid);
30 if ((m_fd < 0) || (m_fd_demux < 0))
32 dmx_pes_filter_params pes;
35 pes.input = DMX_IN_FRONTEND;
36 pes.output = DMX_OUT_DECODER;
37 pes.pes_type = DMX_PES_AUDIO0;
39 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
41 eWarning("audio: DMX_SET_PES_FILTER: %m");
44 if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
46 eWarning("audio: DMX_START: %m");
50 if (::ioctl(m_fd, AUDIO_PLAY) < 0)
51 eWarning("audio: AUDIO_PLAY: %m");
55 void eDVBAudio::stop()
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");
63 eDVBAudio::~eDVBAudio()
71 DEFINE_REF(eDVBVideo);
73 eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev): m_demux(demux)
76 sprintf(filename, "/dev/dvb/adapter%d/video%d", demux->adapter, dev);
77 m_fd = ::open(filename, O_RDWR);
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);
83 eWarning("%s: %m", filename);
86 int eDVBVideo::startPid(int pid)
88 if ((m_fd < 0) || (m_fd_demux < 0))
90 dmx_pes_filter_params pes;
93 pes.input = DMX_IN_FRONTEND;
94 pes.output = DMX_OUT_DECODER;
95 pes.pes_type = DMX_PES_VIDEO0;
97 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
99 eWarning("video: DMX_SET_PES_FILTER: %m");
102 if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
104 eWarning("video: DMX_START: %m");
108 if (::ioctl(m_fd, VIDEO_PLAY) < 0)
109 eWarning("video: VIDEO_PLAY: %m");
115 void eDVBVideo::stop()
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");
123 eDVBVideo::~eDVBVideo()
131 DEFINE_REF(eTSMPEGDecoder);
133 int eTSMPEGDecoder::setState()
136 eDebug("changed %x", m_changed);
137 if (m_changed & changeAudio)
142 m_audio = new eDVBAudio(m_demux, 0);
143 if (m_audio->startPid(m_apid))
145 eWarning("audio: startpid failed!");
148 m_changed &= ~changeAudio;
150 if (m_changed & changeVideo)
155 m_video = new eDVBVideo(m_demux, 0);
156 if (m_video->startPid(m_vpid))
158 eWarning("video: startpid failed!");
161 m_changed &= ~changeVideo;
166 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux)
170 eTSMPEGDecoder::~eTSMPEGDecoder()
172 m_vpid = m_apid = m_pcrpid = pidNone;
177 RESULT eTSMPEGDecoder::setVideoPID(int vpid)
181 m_changed |= changeVideo;
187 RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
189 if ((m_apid != apid) || (m_atype != type))
191 m_changed |= changeAudio;
198 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
200 if (m_pcrpid != pcrpid)
202 m_changed |= changeAudio;
208 RESULT eTSMPEGDecoder::setSyncMaster(int who)
213 RESULT eTSMPEGDecoder::start()
218 RESULT eTSMPEGDecoder::freeze(int cont)
223 RESULT eTSMPEGDecoder::unfreeze()
228 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
233 RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
238 RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
243 RESULT eTSMPEGDecoder::setZoom(int what)