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;
130 if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
132 eWarning("video: DMX_SET_PES_FILTER: %m");
135 if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
137 eWarning("video: DMX_START: %m");
141 if (::ioctl(m_fd, VIDEO_PLAY) < 0)
142 eWarning("video: VIDEO_PLAY: %m");
148 void eDVBVideo::stop()
150 if (::ioctl(m_fd, VIDEO_STOP) < 0)
151 eWarning("video: VIDEO_STOP: %m");
152 if (::ioctl(m_fd_demux, DMX_STOP) < 0)
153 eWarning("video: DMX_STOP: %m");
156 eDVBVideo::~eDVBVideo()
164 DEFINE_REF(eTSMPEGDecoder);
166 int eTSMPEGDecoder::setState()
169 eDebug("changed %x", m_changed);
170 if (m_changed & changeAudio)
175 m_audio = new eDVBAudio(m_demux, 0);
176 if (m_audio->startPid(m_apid))
178 eWarning("audio: startpid failed!");
181 m_changed &= ~changeAudio;
183 if (m_changed & changeVideo)
188 m_video = new eDVBVideo(m_demux, 0);
189 if (m_video->startPid(m_vpid))
191 eWarning("video: startpid failed!");
194 m_changed &= ~changeVideo;
199 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux)
203 eTSMPEGDecoder::~eTSMPEGDecoder()
205 m_vpid = m_apid = m_pcrpid = pidNone;
210 RESULT eTSMPEGDecoder::setVideoPID(int vpid)
214 m_changed |= changeVideo;
220 RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
222 if ((m_apid != apid) || (m_atype != type))
224 m_changed |= changeAudio;
231 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
233 if (m_pcrpid != pcrpid)
235 m_changed |= changeAudio;
241 RESULT eTSMPEGDecoder::setSyncMaster(int who)
246 RESULT eTSMPEGDecoder::start()
251 RESULT eTSMPEGDecoder::freeze(int cont)
256 RESULT eTSMPEGDecoder::unfreeze()
261 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
266 RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
271 RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
276 RESULT eTSMPEGDecoder::setZoom(int what)