mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-05-24 11:12:27 -04:00
DATV demod: added UDP transport stream output
This commit is contained in:
parent
1466883c38
commit
2f5b50d206
@ -7,6 +7,7 @@ set(datv_SOURCES
|
|||||||
datvdemodplugin.cpp
|
datvdemodplugin.cpp
|
||||||
datvdemodsettings.cpp
|
datvdemodsettings.cpp
|
||||||
datvideostream.cpp
|
datvideostream.cpp
|
||||||
|
datvudpstream.cpp
|
||||||
datvideorender.cpp
|
datvideorender.cpp
|
||||||
leansdr/dvb.cpp
|
leansdr/dvb.cpp
|
||||||
leansdr/filtergen.cpp
|
leansdr/filtergen.cpp
|
||||||
@ -23,6 +24,7 @@ set(datv_HEADERS
|
|||||||
datvdemodplugin.h
|
datvdemodplugin.h
|
||||||
datvdemodsettings.h
|
datvdemodsettings.h
|
||||||
datvideostream.h
|
datvideostream.h
|
||||||
|
datvudpstream.h
|
||||||
datvideorender.h
|
datvideorender.h
|
||||||
datvconstellation.h
|
datvconstellation.h
|
||||||
datvdvbs2constellation.h
|
datvdvbs2constellation.h
|
||||||
|
@ -46,6 +46,7 @@ DATVDemod::DATVDemod(DeviceAPI *deviceAPI) :
|
|||||||
m_objRegisteredTVScreen(0),
|
m_objRegisteredTVScreen(0),
|
||||||
m_objRegisteredVideoRender(0),
|
m_objRegisteredVideoRender(0),
|
||||||
m_objVideoStream(nullptr),
|
m_objVideoStream(nullptr),
|
||||||
|
m_udpStream(leansdr::tspacket::SIZE),
|
||||||
m_objRenderThread(nullptr),
|
m_objRenderThread(nullptr),
|
||||||
m_audioFifo(48000),
|
m_audioFifo(48000),
|
||||||
m_blnRenderingVideo(false),
|
m_blnRenderingVideo(false),
|
||||||
@ -859,7 +860,7 @@ void DATVDemod::InitDATVFramework()
|
|||||||
r_derand = new leansdr::derandomizer(m_objScheduler, *p_rtspackets, *p_tspackets);
|
r_derand = new leansdr::derandomizer(m_objScheduler, *p_rtspackets, *p_tspackets);
|
||||||
|
|
||||||
// OUTPUT
|
// OUTPUT
|
||||||
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_objVideoStream);
|
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_objVideoStream, &m_udpStream);
|
||||||
|
|
||||||
m_blnDVBInitialized = true;
|
m_blnDVBInitialized = true;
|
||||||
}
|
}
|
||||||
@ -1144,7 +1145,7 @@ void DATVDemod::InitDATVS2Framework()
|
|||||||
//**********************************************
|
//**********************************************
|
||||||
|
|
||||||
// OUTPUT
|
// OUTPUT
|
||||||
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_objVideoStream);
|
r_videoplayer = new leansdr::datvvideoplayer<leansdr::tspacket>(m_objScheduler, *p_tspackets, m_objVideoStream, &m_udpStream);
|
||||||
|
|
||||||
m_blnDVBInitialized = true;
|
m_blnDVBInitialized = true;
|
||||||
}
|
}
|
||||||
@ -1358,29 +1359,31 @@ void DATVDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffs
|
|||||||
<< " inputSampleRate: " << inputSampleRate
|
<< " inputSampleRate: " << inputSampleRate
|
||||||
<< " inputFrequencyOffset: " << inputFrequencyOffset;
|
<< " inputFrequencyOffset: " << inputFrequencyOffset;
|
||||||
|
|
||||||
|
bool callApplySettings = false;
|
||||||
|
|
||||||
if ((m_settings.m_centerFrequency != inputFrequencyOffset) ||
|
if ((m_settings.m_centerFrequency != inputFrequencyOffset) ||
|
||||||
(m_sampleRate != inputSampleRate) || force)
|
(m_sampleRate != inputSampleRate) || force)
|
||||||
{
|
{
|
||||||
m_objNCO.setFreq(-(float) inputFrequencyOffset, (float) inputSampleRate);
|
m_objNCO.setFreq(-(float) inputFrequencyOffset, (float) inputSampleRate);
|
||||||
qDebug("DATVDemod::applyChannelSettings: NCO: IF: %d <> TF: %d ISR: %d",
|
qDebug("DATVDemod::applyChannelSettings: NCO: IF: %d <> TF: %d ISR: %d",
|
||||||
inputFrequencyOffset, m_settings.m_centerFrequency, inputSampleRate);
|
inputFrequencyOffset, m_settings.m_centerFrequency, inputSampleRate);
|
||||||
|
callApplySettings = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_sampleRate != inputSampleRate) || force)
|
if ((m_sampleRate != inputSampleRate) || force)
|
||||||
{
|
{
|
||||||
//m_objSettingsMutex.lock();
|
|
||||||
//Bandpass filter shaping
|
//Bandpass filter shaping
|
||||||
Real fltLowCut = -((float) m_settings.m_rfBandwidth / 2.0) / (float) inputSampleRate;
|
Real fltLowCut = -((float) m_settings.m_rfBandwidth / 2.0) / (float) inputSampleRate;
|
||||||
Real fltHiCut = ((float) m_settings.m_rfBandwidth / 2.0) / (float) inputSampleRate;
|
Real fltHiCut = ((float) m_settings.m_rfBandwidth / 2.0) / (float) inputSampleRate;
|
||||||
m_objRFFilter->create_filter(fltLowCut, fltHiCut);
|
m_objRFFilter->create_filter(fltLowCut, fltHiCut);
|
||||||
//m_blnNeedConfigUpdate = true;
|
|
||||||
//applySettings(m_settings,true);
|
|
||||||
//m_objSettingsMutex.unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_sampleRate = inputSampleRate;
|
m_sampleRate = inputSampleRate;
|
||||||
m_settings.m_centerFrequency = inputFrequencyOffset;
|
m_settings.m_centerFrequency = inputFrequencyOffset;
|
||||||
applySettings(m_settings,true);
|
|
||||||
|
if (callApplySettings) {
|
||||||
|
applySettings(m_settings, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
|
void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
|
||||||
@ -1443,6 +1446,18 @@ void DATVDemod::applySettings(const DATVDemodSettings& settings, bool force)
|
|||||||
m_objNCO.setFreq(-(float) settings.m_centerFrequency, (float) m_sampleRate);
|
m_objNCO.setFreq(-(float) settings.m_centerFrequency, (float) m_sampleRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((m_settings.m_udpTS != settings.m_udpTS) || force) {
|
||||||
|
m_udpStream.setActive(settings.m_udpTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((m_settings.m_udpTSAddress != settings.m_udpTSAddress) || force) {
|
||||||
|
m_udpStream.setAddress(settings.m_udpTSAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((m_settings.m_udpTSPort != settings.m_udpTSPort) || force) {
|
||||||
|
m_udpStream.setPort(settings.m_udpTSPort);
|
||||||
|
}
|
||||||
|
|
||||||
if (m_settings.isDifferent(settings) || force)
|
if (m_settings.isDifferent(settings) || force)
|
||||||
{
|
{
|
||||||
m_blnNeedConfigUpdate = true;
|
m_blnNeedConfigUpdate = true;
|
||||||
|
@ -39,6 +39,7 @@ class DownChannelizer;
|
|||||||
#include "datvdvbs2constellation.h"
|
#include "datvdvbs2constellation.h"
|
||||||
#include "datvvideoplayer.h"
|
#include "datvvideoplayer.h"
|
||||||
#include "datvideostream.h"
|
#include "datvideostream.h"
|
||||||
|
#include "datvudpstream.h"
|
||||||
#include "datvideorender.h"
|
#include "datvideorender.h"
|
||||||
#include "datvdemodsettings.h"
|
#include "datvdemodsettings.h"
|
||||||
|
|
||||||
@ -404,6 +405,7 @@ private:
|
|||||||
TVScreen *m_objRegisteredTVScreen;
|
TVScreen *m_objRegisteredTVScreen;
|
||||||
DATVideoRender *m_objRegisteredVideoRender;
|
DATVideoRender *m_objRegisteredVideoRender;
|
||||||
DATVideostream *m_objVideoStream;
|
DATVideostream *m_objVideoStream;
|
||||||
|
DATVUDPStream m_udpStream;
|
||||||
DATVideoRenderThread *m_objRenderThread;
|
DATVideoRenderThread *m_objRenderThread;
|
||||||
|
|
||||||
// Audio
|
// Audio
|
||||||
|
@ -243,6 +243,7 @@ void DATVDemodGUI::displaySettings()
|
|||||||
blockApplySettings(true);
|
blockApplySettings(true);
|
||||||
|
|
||||||
m_objChannelMarker.setCenterFrequency(m_settings.m_centerFrequency);
|
m_objChannelMarker.setCenterFrequency(m_settings.m_centerFrequency);
|
||||||
|
m_objChannelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
||||||
ui->deltaFrequency->setValue(m_settings.m_centerFrequency);
|
ui->deltaFrequency->setValue(m_settings.m_centerFrequency);
|
||||||
m_objChannelMarker.setColor(m_settings.m_rgbColor);
|
m_objChannelMarker.setColor(m_settings.m_rgbColor);
|
||||||
|
|
||||||
@ -292,6 +293,9 @@ void DATVDemodGUI::displaySettings()
|
|||||||
ui->audioVolume->setValue(m_settings.m_audioVolume);
|
ui->audioVolume->setValue(m_settings.m_audioVolume);
|
||||||
ui->audioVolumeText->setText(tr("%1").arg(m_settings.m_audioVolume));
|
ui->audioVolumeText->setText(tr("%1").arg(m_settings.m_audioVolume));
|
||||||
ui->videoMute->setChecked(m_settings.m_videoMute);
|
ui->videoMute->setChecked(m_settings.m_videoMute);
|
||||||
|
ui->udpTS->setChecked(m_settings.m_udpTS);
|
||||||
|
ui->udpTSAddress->setText(m_settings.m_udpTSAddress);
|
||||||
|
ui->udpTSPort->setText(tr("%1").arg(m_settings.m_udpTSPort));
|
||||||
|
|
||||||
blockApplySettings(false);
|
blockApplySettings(false);
|
||||||
m_objChannelMarker.blockSignals(false);
|
m_objChannelMarker.blockSignals(false);
|
||||||
@ -347,38 +351,12 @@ void DATVDemodGUI::applySettings(bool force)
|
|||||||
{
|
{
|
||||||
qDebug("DATVDemodGUI::applySettings");
|
qDebug("DATVDemodGUI::applySettings");
|
||||||
|
|
||||||
//Bandwidth and center frequency
|
|
||||||
m_objChannelMarker.setCenterFrequency(ui->deltaFrequency->getValueNew());
|
|
||||||
m_objChannelMarker.setBandwidth(ui->rfBandwidth->getValueNew());
|
|
||||||
|
|
||||||
DATVDemod::MsgConfigureChannelizer *msgChan = DATVDemod::MsgConfigureChannelizer::create(m_objChannelMarker.getCenterFrequency());
|
DATVDemod::MsgConfigureChannelizer *msgChan = DATVDemod::MsgConfigureChannelizer::create(m_objChannelMarker.getCenterFrequency());
|
||||||
m_objDATVDemod->getInputMessageQueue()->push(msgChan);
|
m_objDATVDemod->getInputMessageQueue()->push(msgChan);
|
||||||
|
|
||||||
setTitleColor(m_objChannelMarker.getColor());
|
setTitleColor(m_objChannelMarker.getColor());
|
||||||
|
|
||||||
if (ui->cmbFilter->currentIndex() == 0) {
|
QString msg = tr("DATVDemodGUI::applySettings: force: %1").arg(force ? "true" : "false");
|
||||||
m_settings.m_filter = DATVDemodSettings::SAMP_LINEAR;
|
|
||||||
} else if (ui->cmbFilter->currentIndex() == 1) {
|
|
||||||
m_settings.m_filter = DATVDemodSettings::SAMP_NEAREST;
|
|
||||||
} else {
|
|
||||||
m_settings.m_filter = DATVDemodSettings::SAMP_RRC;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_settings.m_rfBandwidth = m_objChannelMarker.getBandwidth();
|
|
||||||
m_settings.m_centerFrequency = m_objChannelMarker.getCenterFrequency();
|
|
||||||
m_settings.m_symbolRate = ui->spiSymbolRate->value();
|
|
||||||
m_settings.m_notchFilters = ui->spiNotchFilters->value();
|
|
||||||
m_settings.m_allowDrift = ui->chkAllowDrift->isChecked();
|
|
||||||
m_settings.m_fastLock = ui->chkFastlock->isChecked();
|
|
||||||
m_settings.m_hardMetric = ui->chkHardMetric->isChecked();
|
|
||||||
m_settings.m_rollOff = ((float)ui->spiRollOff->value()) / 100.0f;
|
|
||||||
m_settings.m_viterbi = ui->chkViterbi->isChecked();
|
|
||||||
m_settings.m_excursion = ui->spiExcursion->value();
|
|
||||||
m_settings.m_audioMute = ui->audioMute->isChecked();
|
|
||||||
m_settings.m_audioVolume = ui->audioVolume->value();
|
|
||||||
m_settings.m_videoMute = ui->videoMute->isChecked();
|
|
||||||
|
|
||||||
QString msg = tr("DATVDemodGUI::applySettings: force: %1").arg(force);
|
|
||||||
m_settings.debug(msg);
|
m_settings.debug(msg);
|
||||||
|
|
||||||
DATVDemod::MsgConfigureDATVDemod* message = DATVDemod::MsgConfigureDATVDemod::create(m_settings, force);
|
DATVDemod::MsgConfigureDATVDemod* message = DATVDemod::MsgConfigureDATVDemod::create(m_settings, force);
|
||||||
@ -548,11 +526,13 @@ void DATVDemodGUI::on_cmbFEC_currentIndexChanged(const QString &arg1)
|
|||||||
|
|
||||||
void DATVDemodGUI::on_chkViterbi_clicked()
|
void DATVDemodGUI::on_chkViterbi_clicked()
|
||||||
{
|
{
|
||||||
|
m_settings.m_viterbi = ui->chkViterbi->isChecked();
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_chkHardMetric_clicked()
|
void DATVDemodGUI::on_chkHardMetric_clicked()
|
||||||
{
|
{
|
||||||
|
m_settings.m_hardMetric = ui->chkHardMetric->isChecked();
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -561,21 +541,22 @@ void DATVDemodGUI::on_resetDefaults_clicked()
|
|||||||
resetToDefaults();
|
resetToDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_spiSymbolRate_valueChanged(int arg1)
|
void DATVDemodGUI::on_spiSymbolRate_valueChanged(int value)
|
||||||
{
|
{
|
||||||
(void) arg1;
|
m_settings.m_symbolRate = value;
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_spiNotchFilters_valueChanged(int arg1)
|
void DATVDemodGUI::on_spiNotchFilters_valueChanged(int value)
|
||||||
{
|
{
|
||||||
(void) arg1;
|
m_settings.m_notchFilters = value;
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_chkAllowDrift_clicked()
|
void DATVDemodGUI::on_chkAllowDrift_clicked()
|
||||||
{
|
{
|
||||||
applySettings();
|
m_settings.m_allowDrift = ui->chkAllowDrift->isChecked();
|
||||||
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_fullScreen_clicked()
|
void DATVDemodGUI::on_fullScreen_clicked()
|
||||||
@ -619,36 +600,46 @@ void DATVDemodGUI::on_StreamDataAvailable(int *intPackets, int *intBytes, int *i
|
|||||||
|
|
||||||
void DATVDemodGUI::on_deltaFrequency_changed(qint64 value)
|
void DATVDemodGUI::on_deltaFrequency_changed(qint64 value)
|
||||||
{
|
{
|
||||||
(void) value;
|
m_objChannelMarker.setCenterFrequency(value);
|
||||||
|
m_settings.m_centerFrequency = m_objChannelMarker.getCenterFrequency();
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_rfBandwidth_changed(qint64 value)
|
void DATVDemodGUI::on_rfBandwidth_changed(qint64 value)
|
||||||
{
|
{
|
||||||
(void) value;
|
m_objChannelMarker.setBandwidth(value);
|
||||||
|
m_settings.m_rfBandwidth = m_objChannelMarker.getBandwidth();
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_chkFastlock_clicked()
|
void DATVDemodGUI::on_chkFastlock_clicked()
|
||||||
{
|
{
|
||||||
|
m_settings.m_fastLock = ui->chkFastlock->isChecked();
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_audioMute_toggled(bool checked)
|
void DATVDemodGUI::on_audioMute_toggled(bool checked)
|
||||||
{
|
{
|
||||||
(void) checked;
|
m_settings.m_audioMute = checked;
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_videoMute_toggled(bool checked)
|
void DATVDemodGUI::on_videoMute_toggled(bool checked)
|
||||||
{
|
{
|
||||||
(void) checked;
|
m_settings.m_videoMute = checked;
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_audioVolume_valueChanged(int value)
|
void DATVDemodGUI::on_audioVolume_valueChanged(int value)
|
||||||
{
|
{
|
||||||
ui->audioVolumeText->setText(tr("%1").arg(value));
|
ui->audioVolumeText->setText(tr("%1").arg(value));
|
||||||
|
m_settings.m_audioVolume = value;
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DATVDemodGUI::on_udpTS_clicked(bool checked)
|
||||||
|
{
|
||||||
|
m_settings.m_udpTS = checked;
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -669,7 +660,7 @@ void DATVDemodGUI::on_StreamMetaDataChanged(DataTSMetaData2 *objMetaData)
|
|||||||
objMetaData->CodecDescription.toStdString().c_str());
|
objMetaData->CodecDescription.toStdString().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
ui->textEdit->setText(strMetaData);
|
ui->streamInfo->setText(strMetaData);
|
||||||
ui->chkData->setChecked(objMetaData->OK_Data);
|
ui->chkData->setChecked(objMetaData->OK_Data);
|
||||||
ui->chkTS->setChecked(objMetaData->OK_TransportStream);
|
ui->chkTS->setChecked(objMetaData->OK_TransportStream);
|
||||||
ui->chkVS->setChecked(objMetaData->OK_VideoStream);
|
ui->chkVS->setChecked(objMetaData->OK_VideoStream);
|
||||||
@ -691,19 +682,46 @@ void DATVDemodGUI::displayRRCParameters(bool blnVisible)
|
|||||||
|
|
||||||
void DATVDemodGUI::on_cmbFilter_currentIndexChanged(int index)
|
void DATVDemodGUI::on_cmbFilter_currentIndexChanged(int index)
|
||||||
{
|
{
|
||||||
(void) index;
|
if (index == 0) {
|
||||||
displayRRCParameters((ui->cmbFilter->currentIndex() == 2));
|
m_settings.m_filter = DATVDemodSettings::SAMP_LINEAR;
|
||||||
|
} else if (index == 1) {
|
||||||
|
m_settings.m_filter = DATVDemodSettings::SAMP_NEAREST;
|
||||||
|
} else {
|
||||||
|
m_settings.m_filter = DATVDemodSettings::SAMP_RRC;
|
||||||
|
}
|
||||||
|
|
||||||
|
displayRRCParameters(index == 2);
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_spiRollOff_valueChanged(int arg1)
|
void DATVDemodGUI::on_spiRollOff_valueChanged(int value)
|
||||||
{
|
{
|
||||||
(void) arg1;
|
m_settings.m_rollOff = ((float) value) / 100.0f;
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DATVDemodGUI::on_spiExcursion_valueChanged(int arg1)
|
void DATVDemodGUI::on_spiExcursion_valueChanged(int value)
|
||||||
{
|
{
|
||||||
(void) arg1;
|
m_settings.m_excursion = value;
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DATVDemodGUI::on_udpTSAddress_editingFinished()
|
||||||
|
{
|
||||||
|
m_settings.m_udpTSAddress = ui->udpTSAddress->text();
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DATVDemodGUI::on_udpTSPort_editingFinished()
|
||||||
|
{
|
||||||
|
bool ok;
|
||||||
|
quint16 udpPort = ui->udpTSPort->text().toInt(&ok);
|
||||||
|
|
||||||
|
if((!ok) || (udpPort < 1024)) {
|
||||||
|
udpPort = 8882;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_settings.m_udpTSPort = udpPort;
|
||||||
|
ui->udpTSPort->setText(tr("%1").arg(udpPort));
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
@ -94,6 +94,9 @@ private slots:
|
|||||||
void on_audioMute_toggled(bool checked);
|
void on_audioMute_toggled(bool checked);
|
||||||
void on_audioVolume_valueChanged(int value);
|
void on_audioVolume_valueChanged(int value);
|
||||||
void on_videoMute_toggled(bool checked);
|
void on_videoMute_toggled(bool checked);
|
||||||
|
void on_udpTS_clicked(bool checked);
|
||||||
|
void on_udpTSAddress_editingFinished();
|
||||||
|
void on_udpTSPort_editingFinished();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::DATVDemodGUI* ui;
|
Ui::DATVDemodGUI* ui;
|
||||||
|
@ -732,6 +732,99 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QWidget" name="horizontalLayoutWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>10</x>
|
||||||
|
<y>260</y>
|
||||||
|
<width>481</width>
|
||||||
|
<height>25</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" name="udpLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="ButtonSwitch" name="udpTS">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Copy transport stream to UDP</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>UDP</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="udpTSAddressLabel">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Addr</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="udpTSAddress">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>140</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Destination UDP address</string>
|
||||||
|
</property>
|
||||||
|
<property name="inputMask">
|
||||||
|
<string>000.000.000.000</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>127.0.0.1</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="udpTSPortLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Port</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="udpTSPort">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>60</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Destination UDP port</string>
|
||||||
|
</property>
|
||||||
|
<property name="inputMask">
|
||||||
|
<string>00000</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>9998</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="videoTab">
|
<widget class="QWidget" name="videoTab">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
@ -752,7 +845,7 @@
|
|||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QTextEdit" name="textEdit">
|
<widget class="QTextEdit" name="streamInfo">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>2</x>
|
<x>2</x>
|
||||||
@ -1030,6 +1123,11 @@
|
|||||||
<header>gui/tvscreen.h</header>
|
<header>gui/tvscreen.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>ButtonSwitch</class>
|
||||||
|
<extends>QToolButton</extends>
|
||||||
|
<header>gui/buttonswitch.h</header>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../../../sdrgui/resources/res.qrc"/>
|
<include location="../../../sdrgui/resources/res.qrc"/>
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
const PluginDescriptor DATVDemodPlugin::m_ptrPluginDescriptor =
|
const PluginDescriptor DATVDemodPlugin::m_ptrPluginDescriptor =
|
||||||
{
|
{
|
||||||
QString("DATV Demodulator"),
|
QString("DATV Demodulator"),
|
||||||
QString("4.11.3"),
|
QString("4.11.4"),
|
||||||
QString("(c) F4HKW for SDRAngel using LeanSDR framework (c) F4DAV"),
|
QString("(c) F4HKW for SDRAngel using LeanSDR framework (c) F4DAV"),
|
||||||
QString("https://github.com/f4exb/sdrangel"),
|
QString("https://github.com/f4exb/sdrangel"),
|
||||||
true,
|
true,
|
||||||
|
@ -52,6 +52,9 @@ void DATVDemodSettings::resetToDefaults()
|
|||||||
m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName;
|
m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName;
|
||||||
m_audioVolume = 0;
|
m_audioVolume = 0;
|
||||||
m_videoMute = false;
|
m_videoMute = false;
|
||||||
|
m_udpTSAddress = "127.0.0.1";
|
||||||
|
m_udpTSPort = 8882;
|
||||||
|
m_udpTS = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray DATVDemodSettings::serialize() const
|
QByteArray DATVDemodSettings::serialize() const
|
||||||
@ -82,6 +85,9 @@ QByteArray DATVDemodSettings::serialize() const
|
|||||||
s.writeString(20, m_audioDeviceName);
|
s.writeString(20, m_audioDeviceName);
|
||||||
s.writeS32(21, m_audioVolume);
|
s.writeS32(21, m_audioVolume);
|
||||||
s.writeBool(22, m_videoMute);
|
s.writeBool(22, m_videoMute);
|
||||||
|
s.writeString(23, m_udpTSAddress);
|
||||||
|
s.writeU32(24, m_udpTSPort);
|
||||||
|
s.writeBool(25, m_udpTS);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
@ -100,6 +106,7 @@ bool DATVDemodSettings::deserialize(const QByteArray& data)
|
|||||||
{
|
{
|
||||||
QByteArray bytetmp;
|
QByteArray bytetmp;
|
||||||
qint32 tmp;
|
qint32 tmp;
|
||||||
|
quint32 utmp;
|
||||||
QString strtmp;
|
QString strtmp;
|
||||||
|
|
||||||
d.readS32(2, &m_rfBandwidth, 512000);
|
d.readS32(2, &m_rfBandwidth, 512000);
|
||||||
@ -143,6 +150,10 @@ bool DATVDemodSettings::deserialize(const QByteArray& data)
|
|||||||
d.readString(20, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName);
|
d.readString(20, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName);
|
||||||
d.readS32(21, &m_audioVolume, 0);
|
d.readS32(21, &m_audioVolume, 0);
|
||||||
d.readBool(22, &m_videoMute, false);
|
d.readBool(22, &m_videoMute, false);
|
||||||
|
d.readString(23, &m_udpTSAddress, "127.0.0.1");
|
||||||
|
d.readU32(24, &utmp, 8882);
|
||||||
|
m_udpTSPort = utmp < 1024 ? 1024 : utmp > 65536 ? 65535 : utmp;
|
||||||
|
d.readBool(25, &m_udpTS, false);
|
||||||
|
|
||||||
validateSystemConfiguration();
|
validateSystemConfiguration();
|
||||||
|
|
||||||
|
@ -93,6 +93,9 @@ struct DATVDemodSettings
|
|||||||
int m_excursion;
|
int m_excursion;
|
||||||
int m_audioVolume;
|
int m_audioVolume;
|
||||||
bool m_videoMute;
|
bool m_videoMute;
|
||||||
|
QString m_udpTSAddress;
|
||||||
|
quint32 m_udpTSPort;
|
||||||
|
bool m_udpTS;
|
||||||
|
|
||||||
DATVDemodSettings();
|
DATVDemodSettings();
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
|
@ -208,7 +208,7 @@ bool DATVideoRender::PreprocessStream()
|
|||||||
{
|
{
|
||||||
avformat_close_input(&m_formatCtx);
|
avformat_close_input(&m_formatCtx);
|
||||||
m_formatCtx = nullptr;
|
m_formatCtx = nullptr;
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream cannot find stream info";
|
qDebug() << "DATVideoRender::PreprocessStream cannot find stream info";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,7 +218,7 @@ bool DATVideoRender::PreprocessStream()
|
|||||||
if (intRet < 0)
|
if (intRet < 0)
|
||||||
{
|
{
|
||||||
avformat_close_input(&m_formatCtx);
|
avformat_close_input(&m_formatCtx);
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream cannot find video stream";
|
qDebug() << "DATVideoRender::PreprocessStream cannot find video stream";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,7 +229,7 @@ bool DATVideoRender::PreprocessStream()
|
|||||||
|
|
||||||
if (intRet < 0)
|
if (intRet < 0)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream cannot find audio stream";
|
qDebug() << "DATVideoRender::PreprocessStream cannot find audio stream";
|
||||||
}
|
}
|
||||||
|
|
||||||
m_audioStreamIndex = intRet;
|
m_audioStreamIndex = intRet;
|
||||||
@ -285,12 +285,12 @@ bool DATVideoRender::PreprocessStream()
|
|||||||
avformat_close_input(&m_formatCtx);
|
avformat_close_input(&m_formatCtx);
|
||||||
m_formatCtx = nullptr;
|
m_formatCtx = nullptr;
|
||||||
|
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream cannot find associated video CODEC";
|
qDebug() << "DATVideoRender::PreprocessStream cannot find associated video CODEC";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream: video CODEC found: " << videoCodec->name;
|
qDebug() << "DATVideoRender::PreprocessStream: video CODEC found: " << videoCodec->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_dict_set(&opts, "refcounted_frames", "1", 0);
|
av_dict_set(&opts, "refcounted_frames", "1", 0);
|
||||||
@ -300,7 +300,7 @@ bool DATVideoRender::PreprocessStream()
|
|||||||
avformat_close_input(&m_formatCtx);
|
avformat_close_input(&m_formatCtx);
|
||||||
m_formatCtx = nullptr;
|
m_formatCtx = nullptr;
|
||||||
|
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream cannot open associated video CODEC";
|
qDebug() << "DATVideoRender::PreprocessStream cannot open associated video CODEC";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,7 +312,7 @@ bool DATVideoRender::PreprocessStream()
|
|||||||
avformat_close_input(&m_formatCtx);
|
avformat_close_input(&m_formatCtx);
|
||||||
m_formatCtx = nullptr;
|
m_formatCtx = nullptr;
|
||||||
|
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream cannot allocate frame";
|
qDebug() << "DATVideoRender::PreprocessStream cannot allocate frame";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -336,12 +336,12 @@ bool DATVideoRender::PreprocessStream()
|
|||||||
avcodec_free_context(&m_audioDecoderCtx);
|
avcodec_free_context(&m_audioDecoderCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_audioDecoderCtx = avcodec_alloc_context3(NULL);
|
m_audioDecoderCtx = avcodec_alloc_context3(nullptr);
|
||||||
avcodec_parameters_to_context(m_audioDecoderCtx, parms);
|
avcodec_parameters_to_context(m_audioDecoderCtx, parms);
|
||||||
|
|
||||||
//m_audioDecoderCtx = m_formatCtx->streams[m_audioStreamIndex]->codec; // old style
|
//m_audioDecoderCtx = m_formatCtx->streams[m_audioStreamIndex]->codec; // old style
|
||||||
|
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream: audio: "
|
qDebug() << "DATVideoRender::PreprocessStream: audio: "
|
||||||
<< " channels: " << m_audioDecoderCtx->channels
|
<< " channels: " << m_audioDecoderCtx->channels
|
||||||
<< " channel_layout: " << m_audioDecoderCtx->channel_layout
|
<< " channel_layout: " << m_audioDecoderCtx->channel_layout
|
||||||
<< " sample_rate: " << m_audioDecoderCtx->sample_rate
|
<< " sample_rate: " << m_audioDecoderCtx->sample_rate
|
||||||
@ -352,16 +352,16 @@ bool DATVideoRender::PreprocessStream()
|
|||||||
|
|
||||||
if (audioCodec == nullptr)
|
if (audioCodec == nullptr)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream cannot find associated audio CODEC";
|
qDebug() << "DATVideoRender::PreprocessStream cannot find associated audio CODEC";
|
||||||
m_audioStreamIndex = -1; // invalidate audio
|
m_audioStreamIndex = -1; // invalidate audio
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream: audio CODEC found: " << audioCodec->name;
|
qDebug() << "DATVideoRender::PreprocessStream: audio CODEC found: " << audioCodec->name;
|
||||||
|
|
||||||
if (avcodec_open2(m_audioDecoderCtx, audioCodec, nullptr) < 0)
|
if (avcodec_open2(m_audioDecoderCtx, audioCodec, nullptr) < 0)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::PreprocessStream cannot open associated audio CODEC";
|
qDebug() << "DATVideoRender::PreprocessStream cannot open associated audio CODEC";
|
||||||
m_audioStreamIndex = -1; // invalidate audio
|
m_audioStreamIndex = -1; // invalidate audio
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -388,19 +388,19 @@ bool DATVideoRender::OpenStream(DATVideostream *device)
|
|||||||
|
|
||||||
if (device == nullptr)
|
if (device == nullptr)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::OpenStream QIODevice is nullptr";
|
qDebug() << "DATVideoRender::OpenStream QIODevice is nullptr";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_isOpen)
|
if (m_isOpen)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::OpenStream already open";
|
qDebug() << "DATVideoRender::OpenStream already open";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device->bytesAvailable() <= 0)
|
if (device->bytesAvailable() <= 0)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::OpenStream no data available";
|
qDebug() << "DATVideoRender::OpenStream no data available";
|
||||||
MetaData.OK_Data = false;
|
MetaData.OK_Data = false;
|
||||||
emit onMetaDataChanged(&MetaData);
|
emit onMetaDataChanged(&MetaData);
|
||||||
return false;
|
return false;
|
||||||
@ -416,14 +416,14 @@ bool DATVideoRender::OpenStream(DATVideostream *device)
|
|||||||
|
|
||||||
if (!m_isFFMPEGInitialized)
|
if (!m_isFFMPEGInitialized)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::OpenStream FFMPEG not initialized";
|
qDebug() << "DATVideoRender::OpenStream FFMPEG not initialized";
|
||||||
m_running = false;
|
m_running = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!device->open(QIODevice::ReadOnly))
|
if (!device->open(QIODevice::ReadOnly))
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::OpenStream cannot open QIODevice";
|
qDebug() << "DATVideoRender::OpenStream cannot open QIODevice";
|
||||||
m_running = false;
|
m_running = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -434,7 +434,7 @@ bool DATVideoRender::OpenStream(DATVideostream *device)
|
|||||||
|
|
||||||
if (m_formatCtx == nullptr)
|
if (m_formatCtx == nullptr)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::OpenStream cannot alloc format FFMPEG context";
|
qDebug() << "DATVideoRender::OpenStream cannot alloc format FFMPEG context";
|
||||||
m_running = false;
|
m_running = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -454,7 +454,7 @@ bool DATVideoRender::OpenStream(DATVideostream *device)
|
|||||||
|
|
||||||
if (avformat_open_input(&m_formatCtx, nullptr, nullptr, nullptr) < 0)
|
if (avformat_open_input(&m_formatCtx, nullptr, nullptr, nullptr) < 0)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::OpenStream cannot open stream";
|
qDebug() << "DATVideoRender::OpenStream cannot open stream";
|
||||||
m_running = false;
|
m_running = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -479,7 +479,7 @@ bool DATVideoRender::RenderStream()
|
|||||||
|
|
||||||
if (!m_isOpen)
|
if (!m_isOpen)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::RenderStream Stream not open";
|
qDebug() << "DATVideoRender::RenderStream Stream not open";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -495,7 +495,7 @@ bool DATVideoRender::RenderStream()
|
|||||||
|
|
||||||
if (av_read_frame(m_formatCtx, &packet) < 0)
|
if (av_read_frame(m_formatCtx, &packet) < 0)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::RenderStream reading packet error";
|
qDebug() << "DATVideoRender::RenderStream reading packet error";
|
||||||
m_running = false;
|
m_running = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -546,7 +546,7 @@ bool DATVideoRender::RenderStream()
|
|||||||
|
|
||||||
if (sws_init_context(m_swsCtx, nullptr, nullptr) < 0)
|
if (sws_init_context(m_swsCtx, nullptr, nullptr) < 0)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::RenderStream cannont init video data converter";
|
qDebug() << "DATVideoRender::RenderStream cannont init video data converter";
|
||||||
m_swsCtx = nullptr;
|
m_swsCtx = nullptr;
|
||||||
m_running = false;
|
m_running = false;
|
||||||
return false;
|
return false;
|
||||||
@ -560,7 +560,7 @@ bool DATVideoRender::RenderStream()
|
|||||||
|
|
||||||
if (av_image_alloc(m_pbytDecodedData, m_pintDecodedLineSize, m_frame->width, m_frame->height, AV_PIX_FMT_RGB24, 1) < 0)
|
if (av_image_alloc(m_pbytDecodedData, m_pintDecodedLineSize, m_frame->width, m_frame->height, AV_PIX_FMT_RGB24, 1) < 0)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::RenderStream cannont init video image buffer";
|
qDebug() << "DATVideoRender::RenderStream cannont init video image buffer";
|
||||||
sws_freeContext(m_swsCtx);
|
sws_freeContext(m_swsCtx);
|
||||||
m_swsCtx = nullptr;
|
m_swsCtx = nullptr;
|
||||||
m_running = false;
|
m_running = false;
|
||||||
@ -586,7 +586,7 @@ bool DATVideoRender::RenderStream()
|
|||||||
|
|
||||||
if (sws_scale(m_swsCtx, m_frame->data, m_frame->linesize, 0, m_frame->height, m_pbytDecodedData, m_pintDecodedLineSize) < 0)
|
if (sws_scale(m_swsCtx, m_frame->data, m_frame->linesize, 0, m_frame->height, m_pbytDecodedData, m_pintDecodedLineSize) < 0)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::RenderStream error converting video frame to RGB";
|
qDebug() << "DATVideoRender::RenderStream error converting video frame to RGB";
|
||||||
m_running = false;
|
m_running = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -599,7 +599,7 @@ bool DATVideoRender::RenderStream()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_videoDecodeOK = false;
|
m_videoDecodeOK = false;
|
||||||
// qDebug() << "DATVideoProcess::RenderStream video decode error";
|
// qDebug() << "DATVideoRender::RenderStream video decode error";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Audio channel
|
// Audio channel
|
||||||
@ -722,19 +722,19 @@ bool DATVideoRender::CloseStream(QIODevice *device)
|
|||||||
|
|
||||||
if (!device)
|
if (!device)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::CloseStream QIODevice is nullptr";
|
qDebug() << "DATVideoRender::CloseStream QIODevice is nullptr";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_isOpen)
|
if (!m_isOpen)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::CloseStream Stream not open";
|
qDebug() << "DATVideoRender::CloseStream Stream not open";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_formatCtx)
|
if (!m_formatCtx)
|
||||||
{
|
{
|
||||||
qDebug() << "DATVideoProcess::CloseStream FFMEG Context is not initialized";
|
qDebug() << "DATVideoRender::CloseStream FFMEG Context is not initialized";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
58
plugins/channelrx/demoddatv/datvudpstream.cpp
Normal file
58
plugins/channelrx/demoddatv/datvudpstream.cpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2019 F4EXB //
|
||||||
|
// written by Edouard Griffiths //
|
||||||
|
// //
|
||||||
|
// This program is free software; you can redistribute it and/or modify //
|
||||||
|
// it under the terms of the GNU General Public License as published by //
|
||||||
|
// the Free Software Foundation as version 3 of the License, or //
|
||||||
|
// (at your option) any later version. //
|
||||||
|
// //
|
||||||
|
// This program is distributed in the hope that it will be useful, //
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
||||||
|
// GNU General Public License V3 for more details. //
|
||||||
|
// //
|
||||||
|
// You should have received a copy of the GNU General Public License //
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include "datvudpstream.h"
|
||||||
|
|
||||||
|
const int DATVUDPStream::m_tsBlocksPerFrame = 7; // The usual value
|
||||||
|
|
||||||
|
DATVUDPStream::DATVUDPStream(int tsBlockSize) :
|
||||||
|
m_active(false),
|
||||||
|
m_address(QHostAddress::LocalHost),
|
||||||
|
m_port(8882),
|
||||||
|
m_tsBlockSize(tsBlockSize),
|
||||||
|
m_tsBlockIndex(0)
|
||||||
|
{
|
||||||
|
m_tsBuffer = new char[m_tsBlocksPerFrame*m_tsBlockSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
DATVUDPStream::~DATVUDPStream()
|
||||||
|
{
|
||||||
|
delete[] m_tsBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DATVUDPStream::pushData(const char *chrData, int nbTSBlocks)
|
||||||
|
{
|
||||||
|
if (!m_active) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < nbTSBlocks; i++)
|
||||||
|
{
|
||||||
|
if (m_tsBlockIndex < m_tsBlocksPerFrame)
|
||||||
|
{
|
||||||
|
std::copy(chrData + i*m_tsBlockSize, chrData + (i+1)*m_tsBlockSize, m_tsBuffer + m_tsBlockIndex*m_tsBlockSize);
|
||||||
|
m_tsBlockIndex++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_udpSocket.writeDatagram(m_tsBuffer, m_tsBlocksPerFrame*m_tsBlockSize, m_address, m_port);
|
||||||
|
m_tsBlockIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
51
plugins/channelrx/demoddatv/datvudpstream.h
Normal file
51
plugins/channelrx/demoddatv/datvudpstream.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2019 F4EXB //
|
||||||
|
// written by Edouard Griffiths //
|
||||||
|
// //
|
||||||
|
// This program is free software; you can redistribute it and/or modify //
|
||||||
|
// it under the terms of the GNU General Public License as published by //
|
||||||
|
// the Free Software Foundation as version 3 of the License, or //
|
||||||
|
// (at your option) any later version. //
|
||||||
|
// //
|
||||||
|
// This program is distributed in the hope that it will be useful, //
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
||||||
|
// GNU General Public License V3 for more details. //
|
||||||
|
// //
|
||||||
|
// You should have received a copy of the GNU General Public License //
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef DATVUDPSTREAM_H
|
||||||
|
#define DATVUDPSTREAM_H
|
||||||
|
|
||||||
|
#include <QUdpSocket>
|
||||||
|
#include <QHostAddress>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class QString;
|
||||||
|
|
||||||
|
class DATVUDPStream
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DATVUDPStream(int tsBlockSize);
|
||||||
|
~DATVUDPStream();
|
||||||
|
|
||||||
|
void pushData(const char *chrData, int nbTSBlocks);
|
||||||
|
void setActive(bool active) { m_active = active; }
|
||||||
|
bool setAddress(const QString& address) { return m_address.setAddress(address); }
|
||||||
|
void setPort(quint16 port) { m_port = port; }
|
||||||
|
|
||||||
|
static const int m_tsBlocksPerFrame;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_active;
|
||||||
|
QUdpSocket m_udpSocket;
|
||||||
|
QHostAddress m_address;
|
||||||
|
quint16 m_port;
|
||||||
|
int m_tsBlockSize;
|
||||||
|
int m_tsBlockIndex;
|
||||||
|
char *m_tsBuffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DATVUDPSTREAM_H
|
@ -21,14 +21,22 @@
|
|||||||
|
|
||||||
#include "leansdr/framework.h"
|
#include "leansdr/framework.h"
|
||||||
#include "datvideostream.h"
|
#include "datvideostream.h"
|
||||||
|
#include "datvudpstream.h"
|
||||||
|
|
||||||
namespace leansdr
|
namespace leansdr
|
||||||
{
|
{
|
||||||
|
|
||||||
template<typename T> struct datvvideoplayer: runnable
|
template<typename T> struct datvvideoplayer: runnable
|
||||||
{
|
{
|
||||||
datvvideoplayer(scheduler *sch, pipebuf<T> &_in, DATVideostream * objVideoStream) :
|
datvvideoplayer(
|
||||||
runnable(sch, _in.name), in(_in), m_objVideoStream(objVideoStream)
|
scheduler *sch,
|
||||||
|
pipebuf<T> &_in,
|
||||||
|
DATVideostream *objVideoStream,
|
||||||
|
DATVUDPStream *udpStream) :
|
||||||
|
runnable(sch, _in.name),
|
||||||
|
in(_in),
|
||||||
|
m_objVideoStream(objVideoStream),
|
||||||
|
m_udpStream(udpStream)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,6 +48,7 @@ template<typename T> struct datvvideoplayer: runnable
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_udpStream->pushData((const char *) in.rd(), in.readable());
|
||||||
int nw = m_objVideoStream->pushData((const char *) in.rd(), size);
|
int nw = m_objVideoStream->pushData((const char *) in.rd(), size);
|
||||||
|
|
||||||
if (!nw)
|
if (!nw)
|
||||||
@ -60,12 +69,17 @@ template<typename T> struct datvvideoplayer: runnable
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nw != size) {
|
||||||
|
fprintf(stderr, "leansdr::datvvideoplayer::run: nw: %d size: %d\n", nw, size);
|
||||||
|
}
|
||||||
|
|
||||||
in.read(nw / sizeof(T));
|
in.read(nw / sizeof(T));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
pipereader<T> in;
|
pipereader<T> in;
|
||||||
DATVideostream * m_objVideoStream;
|
DATVideostream *m_objVideoStream;
|
||||||
|
DATVUDPStream *m_udpStream;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user