ATV Modulator: open video file

This commit is contained in:
f4exb 2017-03-09 02:09:31 +01:00
parent a392ccb50f
commit f52f382a24
5 changed files with 103 additions and 19 deletions

View File

@ -23,6 +23,7 @@
MESSAGE_CLASS_DEFINITION(ATVMod::MsgConfigureATVMod, Message) MESSAGE_CLASS_DEFINITION(ATVMod::MsgConfigureATVMod, Message)
MESSAGE_CLASS_DEFINITION(ATVMod::MsgConfigureImageFileName, Message) MESSAGE_CLASS_DEFINITION(ATVMod::MsgConfigureImageFileName, Message)
MESSAGE_CLASS_DEFINITION(ATVMod::MsgConfigureVideoFileName, Message)
const float ATVMod::m_blackLevel = 0.3f; const float ATVMod::m_blackLevel = 0.3f;
const float ATVMod::m_spanLevel = 0.7f; const float ATVMod::m_spanLevel = 0.7f;
@ -251,8 +252,12 @@ bool ATVMod::handleMessage(const Message& cmd)
{ {
MsgConfigureImageFileName& conf = (MsgConfigureImageFileName&) cmd; MsgConfigureImageFileName& conf = (MsgConfigureImageFileName&) cmd;
openImage(conf.getFileName()); openImage(conf.getFileName());
// m_fileName = conf.getFileName(); // TODO return true;
// openFileStream(); }
else if (MsgConfigureVideoFileName::match(cmd))
{
MsgConfigureVideoFileName& conf = (MsgConfigureVideoFileName&) cmd;
openVideo(conf.getFileName());
return true; return true;
} }
else else
@ -343,6 +348,7 @@ void ATVMod::applyStandard()
m_linesPerVBar = m_nbImageLines2 / m_nbBars; m_linesPerVBar = m_nbImageLines2 / m_nbBars;
m_hBarIncrement = m_spanLevel / (float) m_nbBars; m_hBarIncrement = m_spanLevel / (float) m_nbBars;
m_vBarIncrement = m_spanLevel / (float) m_nbBars; m_vBarIncrement = m_spanLevel / (float) m_nbBars;
m_fps = 30.0f;
break; break;
case ATVStdPAL625: // Follows PAL-B/G/H standard case ATVStdPAL625: // Follows PAL-B/G/H standard
default: default:
@ -364,6 +370,7 @@ void ATVMod::applyStandard()
m_linesPerVBar = m_nbImageLines2 / m_nbBars; m_linesPerVBar = m_nbImageLines2 / m_nbBars;
m_hBarIncrement = m_spanLevel / (float) m_nbBars; m_hBarIncrement = m_spanLevel / (float) m_nbBars;
m_vBarIncrement = m_spanLevel / (float) m_nbBars; m_vBarIncrement = m_spanLevel / (float) m_nbBars;
m_fps = 25.0f;
} }
if (m_imageOK) if (m_imageOK)
@ -383,6 +390,19 @@ void ATVMod::openImage(const QString& fileName)
} }
} }
void ATVMod::openVideo(const QString& fileName)
{
m_videoOK = m_video.open(qPrintable(fileName));
if (m_videoOK)
{
m_videoFPS = m_video.get(CV_CAP_PROP_FPS);
m_videoWidth = (int) m_video.get(CV_CAP_PROP_FRAME_WIDTH);
m_videoHeight = (int) m_video.get(CV_CAP_PROP_FRAME_HEIGHT);
qDebug("ATVMod::openVideo(: FPS: %f size: %d x %d", m_videoFPS, m_videoWidth, m_videoHeight);
}
}
void ATVMod::resizeImage() void ATVMod::resizeImage()
{ {
float fy = (m_nbImageLines - 2*m_nbBlankLines) / (float) m_imageOriginal.rows; float fy = (m_nbImageLines - 2*m_nbBlankLines) / (float) m_imageOriginal.rows;

View File

@ -80,6 +80,27 @@ public:
{ } { }
}; };
class MsgConfigureVideoFileName : public Message
{
MESSAGE_CLASS_DECLARATION
public:
const QString& getFileName() const { return m_fileName; }
static MsgConfigureVideoFileName* create(const QString& fileName)
{
return new MsgConfigureVideoFileName(fileName);
}
private:
QString m_fileName;
MsgConfigureVideoFileName(const QString& fileName) :
Message(),
m_fileName(fileName)
{ }
};
ATVMod(); ATVMod();
~ATVMod(); ~ATVMod();
@ -207,6 +228,7 @@ private:
QMutex m_settingsMutex; QMutex m_settingsMutex;
int m_horizontalCount; //!< current point index on line int m_horizontalCount; //!< current point index on line
int m_lineCount; //!< current line index in frame int m_lineCount; //!< current line index in frame
float m_fps; //!< resulting frames per second
MovingAverage<Real> m_movingAverage; MovingAverage<Real> m_movingAverage;
quint32 m_levelCalcCount; quint32 m_levelCalcCount;
@ -217,6 +239,13 @@ private:
cv::Mat m_image; //!< resized image for transmission at given rate cv::Mat m_image; //!< resized image for transmission at given rate
bool m_imageOK; bool m_imageOK;
cv::VideoCapture m_video; //!< current video capture
cv::Mat m_frame; //!< current frame
float m_videoFPS;
int m_videoWidth;
int m_videoHeight;
bool m_videoOK;
static const float m_blackLevel; static const float m_blackLevel;
static const float m_spanLevel; static const float m_spanLevel;
static const int m_levelNbSamples; static const int m_levelNbSamples;
@ -229,6 +258,7 @@ private:
void modulateSample(); void modulateSample();
void applyStandard(); void applyStandard();
void openImage(const QString& fileName); void openImage(const QString& fileName);
void openVideo(const QString& fileName);
void resizeImage(); void resizeImage();
inline void pullImageLine(Real& sample) inline void pullImageLine(Real& sample)

View File

@ -235,11 +235,24 @@ void ATVModGUI::on_imageFileDialog_clicked(bool checked)
if (fileName != "") if (fileName != "")
{ {
m_imageFileName = fileName; m_imageFileName = fileName;
ui->recordFileText->setText(m_imageFileName); ui->imageFileText->setText(m_imageFileName);
configureImageFileName(); configureImageFileName();
} }
} }
void ATVModGUI::on_videoFileDialog_clicked(bool checked)
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open video file"), ".", tr("Video Files (*.avi *.mpg *.mp4 *.mov *.m4v)"));
if (fileName != "")
{
m_videoFileName = fileName;
ui->videoFileText->setText(m_videoFileName);
configureVideoFileName();
}
}
void ATVModGUI::configureImageFileName() void ATVModGUI::configureImageFileName()
{ {
qDebug() << "ATVModGUI::configureImageFileName: " << m_imageFileName.toStdString().c_str(); qDebug() << "ATVModGUI::configureImageFileName: " << m_imageFileName.toStdString().c_str();
@ -247,6 +260,13 @@ void ATVModGUI::configureImageFileName()
m_atvMod->getInputMessageQueue()->push(message); m_atvMod->getInputMessageQueue()->push(message);
} }
void ATVModGUI::configureVideoFileName()
{
qDebug() << "ATVModGUI::configureVideoFileName: " << m_videoFileName.toStdString().c_str();
ATVMod::MsgConfigureVideoFileName* message = ATVMod::MsgConfigureVideoFileName::create(m_videoFileName);
m_atvMod->getInputMessageQueue()->push(message);
}
void ATVModGUI::onWidgetRolled(QWidget* widget, bool rollDown) void ATVModGUI::onWidgetRolled(QWidget* widget, bool rollDown)
{ {
} }

View File

@ -67,11 +67,13 @@ private slots:
void on_volume_valueChanged(int value); void on_volume_valueChanged(int value);
void on_channelMute_toggled(bool checked); void on_channelMute_toggled(bool checked);
void on_imageFileDialog_clicked(bool checked); void on_imageFileDialog_clicked(bool checked);
void on_videoFileDialog_clicked(bool checked);
void onWidgetRolled(QWidget* widget, bool rollDown); void onWidgetRolled(QWidget* widget, bool rollDown);
void onMenuDoubleClicked(); void onMenuDoubleClicked();
void configureImageFileName(); void configureImageFileName();
void configureVideoFileName();
void tick(); void tick();
private: private:
@ -88,6 +90,7 @@ private:
MovingAverage<Real> m_channelPowerDbAvg; MovingAverage<Real> m_channelPowerDbAvg;
QString m_imageFileName; QString m_imageFileName;
QString m_videoFileName;
quint32 m_recordLength; quint32 m_recordLength;
int m_recordSampleRate; int m_recordSampleRate;
int m_samplesCount; int m_samplesCount;

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>342</width> <width>342</width>
<height>363</height> <height>366</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -466,18 +466,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="fileNameLayout"> <layout class="QHBoxLayout" name="imagFileLayout">
<item>
<widget class="QLabel" name="recordFileText">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="playControllLayout">
<item> <item>
<widget class="QPushButton" name="imageFileDialog"> <widget class="QPushButton" name="imageFileDialog">
<property name="minimumSize"> <property name="minimumSize">
@ -505,12 +494,23 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="Line" name="line_5"> <widget class="QLabel" name="imageFileText">
<property name="orientation"> <property name="text">
<enum>Qt::Vertical</enum> <string>...</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout>
</item>
<item>
<widget class="Line" name="line_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="videoFileLayout">
<item> <item>
<widget class="QPushButton" name="videoFileDialog"> <widget class="QPushButton" name="videoFileDialog">
<property name="minimumSize"> <property name="minimumSize">
@ -537,6 +537,17 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QLabel" name="videoFileText">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="playControllLayout">
<item> <item>
<widget class="ButtonSwitch" name="playLoop"> <widget class="ButtonSwitch" name="playLoop">
<property name="toolTip"> <property name="toolTip">