int eDVBAudio::getPTS(pts_t &now)
{
- eDebugNoNewLine("AUDIO_GET_PTS - ");
if (::ioctl(m_fd, AUDIO_GET_PTS, &now) < 0)
- eDebug("failed (%m)");
- else
- eDebug("ok");
+ eDebug("AUDIO_GET_PTS failed (%m)");
return 0;
}
eWarning("%s: %m", filename);
else
{
- m_sn = new eSocketNotifier(eApp, m_fd, eSocketNotifier::Priority);
+ m_sn = eSocketNotifier::create(eApp, m_fd, eSocketNotifier::Priority);
CONNECT(m_sn->activated, eDVBVideo::video_event);
}
eDebug("Video Device: %s", filename);
eDVBVideo::~eDVBVideo()
{
- if (m_sn)
- delete m_sn;
if (m_is_slow_motion)
setSlowMotion(0);
if (m_is_fast_forward)
event.width = evt.u.size.w;
/* emit */ m_event(event);
}
+ else if (evt.type == VIDEO_EVENT_FRAME_RATE_CHANGED)
+ {
+ struct iTSMPEGDecoder::videoEvent event;
+ event.type = iTSMPEGDecoder::videoEvent::eventFrameRateChanged;
+ event.framerate = evt.u.frame_rate;
+ /* emit */ m_event(event);
+ }
+ else if (evt.type == 16 /*VIDEO_EVENT_PROGRESSIVE_CHANGED*/)
+ {
+ struct iTSMPEGDecoder::videoEvent event;
+ event.type = iTSMPEGDecoder::videoEvent::eventProgressiveChanged;
+ event.progressive = evt.u.frame_rate;
+ /* emit */ m_event(event);
+ }
else
eDebug("unhandled DVBAPI Video Event %d", evt.type);
}
if (m_pcr)
m_pcr->stop();
m_pcr = 0;
- if ((m_pcrpid >= 0) && (m_pcrpid < 0x1FFF))
- {
- m_pcr = new eDVBPCR(m_demux);
- if (m_pcr->startPid(m_pcrpid))
- res = -1;
- }
- m_changed &= ~changePCR;
}
if (m_changed & changeVideo)
{
- eDebug("VIDEO CHANGED (to %04x)", m_vpid);
if (m_video)
{
m_video->stop();
m_video = 0;
m_video_event_conn = 0;
}
- if ((m_vpid >= 0) && (m_vpid < 0x1FFF))
- {
- m_video = new eDVBVideo(m_demux, m_decoder);
- m_video->connectEvent(slot(*this, &eTSMPEGDecoder::video_event), m_video_event_conn);
- if (m_video->startPid(m_vpid, m_vtype))
- res = -1;
- }
- m_changed &= ~changeVideo;
}
if (m_changed & changeAudio)
{
if (m_audio)
m_audio->stop();
m_audio = 0;
+ }
+ if (m_changed & changeText)
+ {
+ if (m_text)
+ m_text->stop();
+ m_text = 0;
+ }
+ if (m_changed & changePCR)
+ {
+ if ((m_pcrpid >= 0) && (m_pcrpid < 0x1FFF))
+ {
+ m_pcr = new eDVBPCR(m_demux);
+ if (m_pcr->startPid(m_pcrpid))
+ res = -1;
+ }
+ m_changed &= ~changePCR;
+ }
+ if (m_changed & changeAudio)
+ {
if ((m_apid >= 0) && (m_apid < 0x1FFF) && !noaudio)
{
m_audio = new eDVBAudio(m_demux, m_decoder);
}
m_changed &= ~changeAudio;
}
+ if (m_changed & changeVideo)
+ {
+ if ((m_vpid >= 0) && (m_vpid < 0x1FFF))
+ {
+ m_video = new eDVBVideo(m_demux, m_decoder);
+ m_video->connectEvent(slot(*this, &eTSMPEGDecoder::video_event), m_video_event_conn);
+ if (m_video->startPid(m_vpid, m_vtype))
+ res = -1;
+ }
+ m_changed &= ~changeVideo;
+ }
if (m_changed & changeText)
{
- if (m_text)
- m_text->stop();
- m_text = 0;
if ((m_textpid >= 0) && (m_textpid < 0x1FFF) && !nott)
{
m_text = new eDVBTText(m_demux);
}
eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder)
- :m_demux(demux), m_changed(0), m_decoder(decoder), m_video_clip_fd(-1), m_showSinglePicTimer(eApp)
+ :m_demux(demux), m_changed(0), m_decoder(decoder), m_video_clip_fd(-1), m_showSinglePicTimer(eTimer::create(eApp))
{
demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event_conn);
- CONNECT(m_showSinglePicTimer.timeout, eTSMPEGDecoder::finishShowSinglePic);
+ CONNECT(m_showSinglePicTimer->timeout, eTSMPEGDecoder::finishShowSinglePic);
m_is_ff = m_is_sm = m_is_trickmode = 0;
}
eTSMPEGDecoder::~eTSMPEGDecoder()
{
- if (m_video_clip_fd >= 0)
- {
- if (ioctl(m_video_clip_fd, VIDEO_STOP, 1) < 0)
- eDebug("VIDEO_STOP failed (%m)");
- if (ioctl(m_video_clip_fd, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX) < 0)
- eDebug("VIDEO_SELECT_SOURCE DEMUX failed (%m)");
- close(m_video_clip_fd);
- m_video_clip_fd = -1;
- }
+ finishShowSinglePic();
m_vpid = m_apid = m_pcrpid = m_textpid = pidNone;
m_changed = -1;
setState();
m_is_ff = frames_to_skip != 0;
setState();
+ unfreeze(); // audio might be restarted and still in preroll (freezed) state.
if (m_video)
return m_video->setFastForward(frames_to_skip);
m_is_sm = repeat != 0;
setState();
+ unfreeze(); // audio might be restarted and still in preroll (freezed) state.
if (m_video)
return m_video->setSlowMotion(repeat);
{
eDebug("showSinglePic %s", filename);
int f = open(filename, O_RDONLY);
- if (f)
+ if (f >= 0)
{
struct stat s;
fstat(f, &s);
++pos;
if ((iframe[3] >> 4) != 0xE) // no pes header
write(m_video_clip_fd, pes_header, sizeof(pes_header));
+ else
+ iframe[4] = iframe[5] = 0x00;
write(m_video_clip_fd, iframe, s.st_size);
if (!seq_end_avail)
write(m_video_clip_fd, seq_end, sizeof(seq_end));
write(m_video_clip_fd, stuffing, 8192);
- m_showSinglePicTimer.start(150, true);
+ m_showSinglePicTimer->start(150, true);
}
close(f);
}