From cecf7ae682b02e792bb781391674a7a383630f72 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 4 May 2009 20:52:04 +0200 Subject: fix pid changes on pmt updates (this fixes local windows on some german local regional services) need to be rechecked by tmbinc! --- lib/dvb/decoder.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'lib/dvb/decoder.cpp') diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index eb5258d3..bc6e0603 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -203,8 +203,7 @@ int eDVBAudio::startPid(int pid, int type) eDebug("failed (%m)"); else eDebug("ok"); - freeze(); - + freeze(); // why freeze here?!? this is a problem when only a pid change is requested... because of the unfreeze logic in Decoder::setState eDebugNoNewLine("AUDIO_PLAY - "); if (::ioctl(m_fd, AUDIO_PLAY) < 0) eDebug("failed (%m)"); @@ -285,7 +284,7 @@ int eDVBAudio::getPTS(pts_t &now) eDVBAudio::~eDVBAudio() { - unfreeze(); + unfreeze(); // why unfreeze here... but not unfreeze video in ~eDVBVideo ?!? if (m_fd >= 0) ::close(m_fd); if (m_fd_demux >= 0) @@ -448,7 +447,7 @@ int eDVBVideo::startPid(int pid, int type) return -errno; } eDebug("ok"); - freeze(); + freeze(); // why freeze here?!? this is a problem when only a pid change is requested... because of the unfreeze logic in Decoder::setState eDebugNoNewLine("VIDEO_PLAY - "); if (::ioctl(m_fd, VIDEO_PLAY) < 0) eDebug("failed (%m)"); @@ -1093,7 +1092,7 @@ eTSMPEGDecoder::~eTSMPEGDecoder() RESULT eTSMPEGDecoder::setVideoPID(int vpid, int type) { - if (m_vpid != vpid) + if ((m_vpid != vpid) || (m_vtype != type)) { m_changed |= changeVideo; m_vpid = vpid; @@ -1174,7 +1173,9 @@ RESULT eTSMPEGDecoder::play() if (!m_changed) return 0; } - else +// else +/* commented out because the changeState is needed to unfreeze decoders in decoder::setState... needed by normal pmt changes +tmbinc please recheck this! */ { m_state = statePlay; m_changed |= changeState; -- cgit v1.2.3 From 9ac64b2a26a4a6e50f5d80fc8e80de32951f3c0d Mon Sep 17 00:00:00 2001 From: ghost Date: Wed, 6 May 2009 20:11:00 +0200 Subject: fix debug output --- lib/dvb/decoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/dvb/decoder.cpp') diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index bc6e0603..bd52ea03 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -814,7 +814,7 @@ int eDVBTText::startPid(int pid) return -errno; } eDebug("ok"); - eDebugNoNewLine("DEMUX_START - pcr - "); + eDebugNoNewLine("DEMUX_START - ttx - "); if (::ioctl(m_fd_demux, DMX_START) < 0) { eDebug("failed(%m)"); -- cgit v1.2.3 From 09d90704f6cae05c67e08d10a46f28b2e2b0b1c7 Mon Sep 17 00:00:00 2001 From: ghost Date: Thu, 7 May 2009 09:35:45 +0200 Subject: add support for 2nd PCR, add support for 2nd ttx pid --- lib/dvb/decoder.cpp | 15 +++++++++------ lib/dvb/decoder.h | 8 ++++---- lib/service/servicedvb.cpp | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) (limited to 'lib/dvb/decoder.cpp') diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index bd52ea03..92652a4b 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -12,8 +12,10 @@ #define dmxPesFilterParams dmx_pes_filter_params #define DMX_PES_VIDEO0 DMX_PES_VIDEO #define DMX_PES_AUDIO0 DMX_PES_AUDIO +#define DMX_PES_PCR0 DMX_PES_PCR #define DMX_PES_VIDEO1 DMX_PES_VIDEO #define DMX_PES_AUDIO1 DMX_PES_AUDIO +#define DMX_PES_PCR1 DMX_PES_PCR #include #include #include @@ -686,7 +688,7 @@ int eDVBVideo::getFrameRate() DEFINE_REF(eDVBPCR); -eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux) +eDVBPCR::eDVBPCR(eDVBDemux *demux, int dev): m_demux(demux), m_dev(dev) { char filename[128]; #if HAVE_DVB_API_VERSION < 3 @@ -745,7 +747,7 @@ int eDVBPCR::startPid(int pid) pes.pid = pid; pes.input = DMX_IN_FRONTEND; pes.output = DMX_OUT_DECODER; - pes.pes_type = DMX_PES_PCR; + pes.pes_type = m_dev ? DMX_PES_PCR1 : DMX_PES_PCR0; /* FIXME */ pes.flags = 0; eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - pcr - ", pid); if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0) @@ -782,7 +784,8 @@ eDVBPCR::~eDVBPCR() DEFINE_REF(eDVBTText); -eDVBTText::eDVBTText(eDVBDemux *demux): m_demux(demux) +eDVBTText::eDVBTText(eDVBDemux *demux, int dev) + :m_demux(demux), m_dev(dev) { char filename[128]; #if HAVE_DVB_API_VERSION < 3 @@ -804,7 +807,7 @@ int eDVBTText::startPid(int pid) pes.pid = pid; pes.input = DMX_IN_FRONTEND; pes.output = DMX_OUT_DECODER; - pes.pes_type = DMX_PES_TELETEXT; + pes.pes_type = m_dev ? DMX_PES_TELETEXT1 : DMX_PES_TELETEXT0; // FIXME pes.flags = 0; eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - ttx - ", pid); @@ -960,7 +963,7 @@ int eTSMPEGDecoder::setState() { if ((m_pcrpid >= 0) && (m_pcrpid < 0x1FFF)) { - m_pcr = new eDVBPCR(m_demux); + m_pcr = new eDVBPCR(m_demux, m_decoder); if (m_pcr->startPid(m_pcrpid)) res = -1; } @@ -991,7 +994,7 @@ int eTSMPEGDecoder::setState() { if ((m_textpid >= 0) && (m_textpid < 0x1FFF) && !nott) { - m_text = new eDVBTText(m_demux); + m_text = new eDVBTText(m_demux, m_decoder); if (m_text->startPid(m_textpid)) res = -1; } diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h index 51be5141..3bfc70cb 100644 --- a/lib/dvb/decoder.h +++ b/lib/dvb/decoder.h @@ -80,9 +80,9 @@ class eDVBPCR: public iObject DECLARE_REF(eDVBPCR); private: ePtr m_demux; - int m_fd_demux; + int m_fd_demux, m_dev; public: - eDVBPCR(eDVBDemux *demux); + eDVBPCR(eDVBDemux *demux, int dev); #if HAVE_DVB_API_VERSION < 3 int setPid(int pid); int startPid(); @@ -98,9 +98,9 @@ class eDVBTText: public iObject DECLARE_REF(eDVBTText); private: ePtr m_demux; - int m_fd_demux; + int m_fd_demux, m_dev; public: - eDVBTText(eDVBDemux *demux); + eDVBTText(eDVBDemux *demux, int dev); int startPid(int pid); void stop(); virtual ~eDVBTText(); diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index c8442161..baebcde8 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -2370,7 +2370,7 @@ void eDVBServicePlay::updateDecoder() m_decoder->setVideoPID(vpid, vpidtype); selectAudioStream(); - if (!(m_is_pvr || m_timeshift_active || !m_is_primary)) + if (!(m_is_pvr || m_timeshift_active /*|| !m_is_primary*/)) m_decoder->setSyncPCR(pcrpid); else m_decoder->setSyncPCR(-1); -- cgit v1.2.3