1 #include <lib/dvb/decoder.h>
2 #include <linux/dvb/audio.h>
3 #include <linux/dvb/video.h>
4 #include <linux/dvb/dmx.h>
11 DEFINE_REF(eDVBAudio);
13 eDVBAudio::eDVBAudio(eDVBDemux *demux, int dev): ref(0), m_demux(demux)
16 sprintf(filename, "/dev/dvb/adapter%d/audio%d", demux->adapter, dev);
17 m_fd = ::open(filename, O_RDWR);
19 eWarning("%s: %m", filename);
20 sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
21 m_fd_demux = ::open(filename, O_RDWR);
23 eWarning("%s: %m", filename);
26 int eDVBAudio::startPid(int pid)
28 eDebug("setting audio pid to %x", pid);
29 if ((m_fd < 0) || (m_fd_demux < 0))
31 dmx_pes_filter_params pes;
34 pes.input = DMX_IN_FRONTEND;
35 pes.output = DMX_OUT_DECODER;
36 pes.pes_type = DMX_PES_AUDIO0;
38 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
40 eWarning("audio: DMX_SET_PES_FILTER: %m");
43 if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
45 eWarning("audio: DMX_START: %m");
49 if (::ioctl(m_fd, AUDIO_PLAY) < 0)
50 eWarning("audio: AUDIO_PLAY: %m");
54 void eDVBAudio::stop()
56 if (::ioctl(m_fd, AUDIO_STOP) < 0)
57 eWarning("audio: AUDIO_STOP: %m");
58 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
59 eWarning("audio: DMX_STOP: %m");
62 eDVBAudio::~eDVBAudio()
70 DEFINE_REF(eDVBVideo);
72 eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev): ref(0), m_demux(demux)
75 sprintf(filename, "/dev/dvb/adapter%d/video%d", demux->adapter, dev);
76 m_fd = ::open(filename, O_RDWR);
78 eWarning("%s: %m", filename);
79 sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
80 m_fd_demux = ::open(filename, O_RDWR);
82 eWarning("%s: %m", filename);
85 int eDVBVideo::startPid(int pid)
87 if ((m_fd < 0) || (m_fd_demux < 0))
89 dmx_pes_filter_params pes;
92 pes.input = DMX_IN_FRONTEND;
93 pes.output = DMX_OUT_DECODER;
94 pes.pes_type = DMX_PES_VIDEO0;
96 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
98 eWarning("video: DMX_SET_PES_FILTER: %m");
101 if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
103 eWarning("video: DMX_START: %m");
107 if (::ioctl(m_fd, VIDEO_PLAY) < 0)
108 eWarning("video: VIDEO_PLAY: %m");
114 void eDVBVideo::stop()
116 if (::ioctl(m_fd, VIDEO_STOP) < 0)
117 eWarning("video: VIDEO_STOP: %m");
118 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
119 eWarning("video: DMX_STOP: %m");
122 eDVBVideo::~eDVBVideo()
130 DEFINE_REF(eTSMPEGDecoder);
132 int eTSMPEGDecoder::setState()
135 eDebug("changed %x", m_changed);
136 if (m_changed & changeAudio)
141 m_audio = new eDVBAudio(m_demux, 0);
142 if (m_audio->startPid(m_apid))
144 eWarning("audio: startpid failed!");
147 m_changed &= ~changeAudio;
149 if (m_changed & changeVideo)
154 m_video = new eDVBVideo(m_demux, 0);
155 if (m_video->startPid(m_vpid))
157 eWarning("video: startpid failed!");
160 m_changed &= ~changeVideo;
165 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux)
169 eTSMPEGDecoder::~eTSMPEGDecoder()
171 m_vpid = m_apid = m_pcrpid = pidNone;
176 RESULT eTSMPEGDecoder::setVideoPID(int vpid)
180 m_changed |= changeVideo;
186 RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
188 if ((m_apid != apid) || (m_atype != type))
190 m_changed |= changeAudio;
197 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
199 if (m_pcrpid != pcrpid)
201 m_changed |= changeAudio;
207 RESULT eTSMPEGDecoder::setSyncMaster(int who)
212 RESULT eTSMPEGDecoder::start()
217 RESULT eTSMPEGDecoder::freeze(int cont)
222 RESULT eTSMPEGDecoder::unfreeze()
227 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
232 RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
237 RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
242 RESULT eTSMPEGDecoder::setZoom(int what)