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()
163 DEFINE_REF(eTSMPEGDecoder);
165 int eTSMPEGDecoder::setState()
168 eDebug("changed %x", m_changed);
169 if (m_changed & changeAudio)
174 m_audio = new eDVBAudio(m_demux, 0);
175 if (m_audio->startPid(m_apid))
177 eWarning("audio: startpid failed!");
180 m_changed &= ~changeAudio;
182 if (m_changed & changeVideo)
187 m_video = new eDVBVideo(m_demux, 0);
188 if (m_video->startPid(m_vpid))
190 eWarning("video: startpid failed!");
193 m_changed &= ~changeVideo;
198 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux)
202 eTSMPEGDecoder::~eTSMPEGDecoder()
204 m_vpid = m_apid = m_pcrpid = pidNone;
209 RESULT eTSMPEGDecoder::setVideoPID(int vpid)
213 m_changed |= changeVideo;
219 RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
221 if ((m_apid != apid) || (m_atype != type))
223 m_changed |= changeAudio;
230 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
232 if (m_pcrpid != pcrpid)
234 m_changed |= changeAudio;
240 RESULT eTSMPEGDecoder::setSyncMaster(int who)
245 RESULT eTSMPEGDecoder::start()
250 RESULT eTSMPEGDecoder::freeze(int cont)
255 RESULT eTSMPEGDecoder::unfreeze()
260 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
265 RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
270 RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
275 RESULT eTSMPEGDecoder::setZoom(int what)