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, &pes) < 0)
70 eWarning("audio: DMX_START: %m");
74 if (::ioctl(m_fd, AUDIO_PLAY) < 0)
75 eWarning("audio: AUDIO_PLAY: %m");
79 void eDVBAudio::stop()
81 if (::ioctl(m_fd, AUDIO_STOP) < 0)
82 eWarning("audio: AUDIO_STOP: %m");
83 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
84 eWarning("audio: DMX_STOP: %m");
87 eDVBAudio::~eDVBAudio()
95 DEFINE_REF(eDVBVideo);
97 eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev): m_demux(demux)
100 #if HAVE_DVB_API_VERSION < 3
101 sprintf(filename, "/dev/dvb/card%d/video%d", demux->adapter, dev);
103 sprintf(filename, "/dev/dvb/adapter%d/video%d", demux->adapter, dev);
105 m_fd = ::open(filename, O_RDWR);
107 eWarning("%s: %m", filename);
108 #if HAVE_DVB_API_VERSION < 3
109 sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
111 sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
113 m_fd_demux = ::open(filename, O_RDWR);
115 eWarning("%s: %m", filename);
118 int eDVBVideo::startPid(int pid)
120 if ((m_fd < 0) || (m_fd_demux < 0))
122 dmx_pes_filter_params pes;
125 pes.input = DMX_IN_FRONTEND;
126 pes.output = DMX_OUT_DECODER;
127 pes.pes_type = DMX_PES_VIDEO;
129 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
131 eWarning("video: DMX_SET_PES_FILTER: %m");
134 if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
136 eWarning("video: DMX_START: %m");
140 if (::ioctl(m_fd, VIDEO_PLAY) < 0)
141 eWarning("video: VIDEO_PLAY: %m");
147 void eDVBVideo::stop()
149 if (::ioctl(m_fd, VIDEO_STOP) < 0)
150 eWarning("video: VIDEO_STOP: %m");
151 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
152 eWarning("video: DMX_STOP: %m");
155 eDVBVideo::~eDVBVideo()
165 eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux)
168 #if HAVE_DVB_API_VERSION < 3
169 sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
171 sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
173 m_fd_demux = ::open(filename, O_RDWR);
175 eWarning("%s: %m", filename);
178 int eDVBPCR::startPid(int pid)
182 dmx_pes_filter_params pes;
185 pes.input = DMX_IN_FRONTEND;
186 pes.output = DMX_OUT_DECODER;
187 pes.pes_type = DMX_PES_PCR;
189 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
191 eWarning("video: DMX_SET_PES_FILTER: %m");
194 if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
196 eWarning("video: DMX_START: %m");
204 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
205 eWarning("video: DMX_STOP: %m");
214 DEFINE_REF(eTSMPEGDecoder);
216 int eTSMPEGDecoder::setState()
219 eDebug("changed %x", m_changed);
221 if (m_changed & changePCR)
226 m_pcr = new eDVBPCR(m_demux);
227 if (m_pcr->startPid(m_pcrpid))
229 eWarning("video: startpid failed!");
232 m_changed &= ~changePCR;
234 if (m_changed & changeVideo)
239 m_video = new eDVBVideo(m_demux, 0);
240 if (m_video->startPid(m_vpid))
242 eWarning("video: startpid failed!");
245 m_changed &= ~changeVideo;
247 if (m_changed & changeAudio)
252 m_audio = new eDVBAudio(m_demux, 0);
253 if (m_audio->startPid(m_apid))
255 eWarning("audio: startpid failed!");
258 m_changed &= ~changeAudio;
263 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux)
267 eTSMPEGDecoder::~eTSMPEGDecoder()
269 m_vpid = m_apid = m_pcrpid = pidNone;
274 RESULT eTSMPEGDecoder::setVideoPID(int vpid)
278 m_changed |= changeVideo;
284 RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
286 if ((m_apid != apid) || (m_atype != type))
288 m_changed |= changeAudio;
295 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
297 if (m_pcrpid != pcrpid)
299 m_changed |= changePCR;
305 RESULT eTSMPEGDecoder::setSyncMaster(int who)
310 RESULT eTSMPEGDecoder::start()
315 RESULT eTSMPEGDecoder::freeze(int cont)
320 RESULT eTSMPEGDecoder::unfreeze()
325 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
330 RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
335 RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
340 RESULT eTSMPEGDecoder::setZoom(int what)