1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-08-02 22:12:26 -04:00

Demod DATV: improve UDP TS output detection

This commit is contained in:
f4exb 2025-05-03 17:16:19 +02:00
parent ce007419e8
commit 002f5e8af3
2 changed files with 43 additions and 9 deletions

View File

@ -37,7 +37,7 @@ const unsigned int DATVDemodSink::m_rfFilterFftLength = 512;
DATVDemodSink::DATVDemodSink() : DATVDemodSink::DATVDemodSink() :
m_blnNeedConfigUpdate(false), m_blnNeedConfigUpdate(false),
m_tvScreen(nullptr), m_tvScreen(nullptr),
#ifndef SERVER_MODE #ifndef SERVER_MODE
m_videoRender(nullptr), m_videoRender(nullptr),
#endif #endif
m_videoStream(new DATVideostream()), m_videoStream(new DATVideostream()),
@ -95,7 +95,7 @@ void DATVDemodSink::setTVScreen(TVScreen *tvScreen)
void DATVDemodSink::SetVideoRender(DATVideoRender *screen) void DATVDemodSink::SetVideoRender(DATVideoRender *screen)
{ {
#ifndef SERVER_MODE #ifndef SERVER_MODE
m_videoRender = screen; m_videoRender = screen;
m_videoRender->setAudioFIFO(&m_audioFifo); m_videoRender->setAudioFIFO(&m_audioFifo);
m_videoThread = new DATVideoRenderThread(m_videoRender, m_videoStream); m_videoThread = new DATVideoRenderThread(m_videoRender, m_videoStream);
@ -162,7 +162,6 @@ bool DATVDemodSink::udpRunning()
} }
bool udpRunning = r_videoplayer->isUDPRunning(); bool udpRunning = r_videoplayer->isUDPRunning();
r_videoplayer->resetUDPRunning();
return udpRunning; return udpRunning;
} }
@ -526,7 +525,7 @@ void DATVDemodSink::ResetDATVFrameworkPointers()
r_videoplayer = nullptr; r_videoplayer = nullptr;
//CONSTELLATION //CONSTELLATION
#ifndef SERVER_MODE #ifndef SERVER_MODE
r_scope_symbols = nullptr; r_scope_symbols = nullptr;
#endif #endif
@ -543,7 +542,7 @@ void DATVDemodSink::ResetDATVFrameworkPointers()
r_fecdecsoft = nullptr; r_fecdecsoft = nullptr;
r_fecdechelper = nullptr; r_fecdechelper = nullptr;
p_deframer = nullptr; p_deframer = nullptr;
#ifndef SERVER_MODE #ifndef SERVER_MODE
r_scope_symbols_dvbs2 = nullptr; r_scope_symbols_dvbs2 = nullptr;
#endif #endif
} }
@ -879,6 +878,7 @@ void DATVDemodSink::InitDATVFramework()
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, nullptr, &m_udpStream); r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, nullptr, &m_udpStream);
} }
r_videoplayer->setSymbolRate(m_settings.m_symbolRate);
m_blnDVBInitialized = true; m_blnDVBInitialized = true;
} }
@ -1212,6 +1212,7 @@ void DATVDemodSink::InitDATVS2Framework()
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, nullptr, &m_udpStream); r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, nullptr, &m_udpStream);
} }
r_videoplayer->setSymbolRate(m_settings.m_symbolRate);
m_blnDVBInitialized = true; m_blnDVBInitialized = true;
} }
@ -1228,7 +1229,7 @@ void DATVDemodSink::feed(const SampleVector::const_iterator& begin, const Sample
qDebug("DATVDemodSink::feed: change by MODCOD detected"); qDebug("DATVDemodSink::feed: change by MODCOD detected");
// Update constellation // Update constellation
#ifndef SERVER_MODE #ifndef SERVER_MODE
if (r_scope_symbols_dvbs2) { if (r_scope_symbols_dvbs2) {
r_scope_symbols_dvbs2->calculate_cstln_points(); 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); 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); 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) { if ((m_settings.m_udpTSAddress != settings.m_udpTSAddress) || force) {

View File

@ -42,7 +42,9 @@ template<typename T> struct datvvideoplayer: runnable
in(_in), in(_in),
m_videoStream(videoStream), m_videoStream(videoStream),
m_udpStream(udpStream), m_udpStream(udpStream),
m_atomicUDPRunning(0) m_atomicUDPRunning(0),
m_count(0),
m_sr(1500000)
{ {
} }
@ -50,7 +52,18 @@ template<typename T> struct datvvideoplayer: runnable
{ {
int size = in.readable() * sizeof(T); 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; return;
} }
@ -62,6 +75,8 @@ template<typename T> struct datvvideoplayer: runnable
#else #else
m_atomicUDPRunning.store(m_udpStream->isActive() && (size > 0) ? 1 : 0); m_atomicUDPRunning.store(m_udpStream->isActive() && (size > 0) ? 1 : 0);
#endif #endif
m_count = m_sr / 10000;
if (m_videoStream) if (m_videoStream)
{ {
nw = m_videoStream->pushData((const char *) in.rd(), size); nw = m_videoStream->pushData((const char *) in.rd(), size);
@ -114,11 +129,18 @@ template<typename T> struct datvvideoplayer: runnable
#endif #endif
} }
void setSymbolRate(unsigned int sr)
{
m_sr = sr;
}
private: private:
pipereader<T> in; pipereader<T> in;
DATVideostream *m_videoStream; DATVideostream *m_videoStream;
DATVUDPStream *m_udpStream; DATVUDPStream *m_udpStream;
QAtomicInt m_atomicUDPRunning; QAtomicInt m_atomicUDPRunning;
unsigned int m_count;
unsigned int m_sr; // Symbol rate in S/s used for UDP running detection
}; };
} }