diff --git a/plugins/channelrx/demoddatv/datvdemodsink.cpp b/plugins/channelrx/demoddatv/datvdemodsink.cpp index cb396726d..25ded47ac 100644 --- a/plugins/channelrx/demoddatv/datvdemodsink.cpp +++ b/plugins/channelrx/demoddatv/datvdemodsink.cpp @@ -37,7 +37,7 @@ const unsigned int DATVDemodSink::m_rfFilterFftLength = 512; DATVDemodSink::DATVDemodSink() : m_blnNeedConfigUpdate(false), m_tvScreen(nullptr), -#ifndef SERVER_MODE +#ifndef SERVER_MODE m_videoRender(nullptr), #endif m_videoStream(new DATVideostream()), @@ -95,7 +95,7 @@ void DATVDemodSink::setTVScreen(TVScreen *tvScreen) void DATVDemodSink::SetVideoRender(DATVideoRender *screen) { -#ifndef SERVER_MODE +#ifndef SERVER_MODE m_videoRender = screen; m_videoRender->setAudioFIFO(&m_audioFifo); m_videoThread = new DATVideoRenderThread(m_videoRender, m_videoStream); @@ -162,7 +162,6 @@ bool DATVDemodSink::udpRunning() } bool udpRunning = r_videoplayer->isUDPRunning(); - r_videoplayer->resetUDPRunning(); return udpRunning; } @@ -526,7 +525,7 @@ void DATVDemodSink::ResetDATVFrameworkPointers() r_videoplayer = nullptr; //CONSTELLATION -#ifndef SERVER_MODE +#ifndef SERVER_MODE r_scope_symbols = nullptr; #endif @@ -543,7 +542,7 @@ void DATVDemodSink::ResetDATVFrameworkPointers() r_fecdecsoft = nullptr; r_fecdechelper = nullptr; p_deframer = nullptr; -#ifndef SERVER_MODE +#ifndef SERVER_MODE r_scope_symbols_dvbs2 = nullptr; #endif } @@ -879,6 +878,7 @@ void DATVDemodSink::InitDATVFramework() r_videoplayer = new leansdr::datvvideoplayer(m_objScheduler, *p_tspackets, nullptr, &m_udpStream); } + r_videoplayer->setSymbolRate(m_settings.m_symbolRate); m_blnDVBInitialized = true; } @@ -1212,6 +1212,7 @@ void DATVDemodSink::InitDATVS2Framework() r_videoplayer = new leansdr::datvvideoplayer(m_objScheduler, *p_tspackets, nullptr, &m_udpStream); } + r_videoplayer->setSymbolRate(m_settings.m_symbolRate); m_blnDVBInitialized = true; } @@ -1228,7 +1229,7 @@ void DATVDemodSink::feed(const SampleVector::const_iterator& begin, const Sample qDebug("DATVDemodSink::feed: change by MODCOD detected"); // Update constellation -#ifndef SERVER_MODE +#ifndef SERVER_MODE if (r_scope_symbols_dvbs2) { r_scope_symbols_dvbs2->calculate_cstln_points(); } @@ -1419,8 +1420,19 @@ void DATVDemodSink::applySettings(const DATVDemodSettings& settings, bool force) m_nco.setFreq(-(float) settings.m_centerFrequency, (float) m_channelSampleRate); } - if ((m_settings.m_udpTS != settings.m_udpTS) || force) { + if ((m_settings.m_udpTS != settings.m_udpTS) || force) + { m_udpStream.setActive(settings.m_udpTS); + + if (r_videoplayer && !settings.m_udpTS) { + r_videoplayer->resetUDPRunning(); + } + } + + if ((m_settings.m_symbolRate != settings.m_symbolRate) || force) { + if (r_videoplayer) { + r_videoplayer->setSymbolRate(settings.m_symbolRate); + } } if ((m_settings.m_udpTSAddress != settings.m_udpTSAddress) || force) { diff --git a/plugins/channelrx/demoddatv/datvvideoplayer.h b/plugins/channelrx/demoddatv/datvvideoplayer.h index 199bfd6d0..d4cf6502d 100644 --- a/plugins/channelrx/demoddatv/datvvideoplayer.h +++ b/plugins/channelrx/demoddatv/datvvideoplayer.h @@ -42,7 +42,9 @@ template struct datvvideoplayer: runnable in(_in), m_videoStream(videoStream), m_udpStream(udpStream), - m_atomicUDPRunning(0) + m_atomicUDPRunning(0), + m_count(0), + m_sr(1500000) { } @@ -50,7 +52,18 @@ template struct datvvideoplayer: runnable { int size = in.readable() * sizeof(T); - if (!size) { + if (!size) + { + if (m_count == 0) + { + #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + m_atomicUDPRunning.storeRelaxed(0); + #else + m_atomicUDPRunning.store(0); + #endif + } else { + m_count--; + } return; } @@ -62,6 +75,8 @@ template struct datvvideoplayer: runnable #else m_atomicUDPRunning.store(m_udpStream->isActive() && (size > 0) ? 1 : 0); #endif + m_count = m_sr / 10000; + if (m_videoStream) { nw = m_videoStream->pushData((const char *) in.rd(), size); @@ -114,11 +129,18 @@ template struct datvvideoplayer: runnable #endif } + void setSymbolRate(unsigned int sr) + { + m_sr = sr; + } + private: pipereader in; DATVideostream *m_videoStream; DATVUDPStream *m_udpStream; QAtomicInt m_atomicUDPRunning; + unsigned int m_count; + unsigned int m_sr; // Symbol rate in S/s used for UDP running detection }; }