diff --git a/plugins/channeltx/modatv/atvmod.cpp b/plugins/channeltx/modatv/atvmod.cpp index 84070a4af..73e4ece88 100644 --- a/plugins/channeltx/modatv/atvmod.cpp +++ b/plugins/channeltx/modatv/atvmod.cpp @@ -15,6 +15,7 @@ /////////////////////////////////////////////////////////////////////////////////// #include +#include #include "opencv2/imgproc/imgproc.hpp" @@ -282,6 +283,44 @@ void ATVMod::pullVideo(Real& sample) else if ((m_running.m_atvModInput == ATVModInputCamera) && (m_running.m_cameraPlay)) { ATVCamera& camera = m_cameras[m_cameraIndex]; // currently selected canera + + if (camera.m_videoFPS < 0.0f) // default frame rate when it could not be obtained via get + { + time_t start, end; + cv::Mat frame; + + MsgReportCameraData *report; + report = MsgReportCameraData::create( + camera.m_cameraNumber, + 0.0f, + camera.m_videoWidth, + camera.m_videoHeight, + 1); // open splash screen on GUI side + getOutputMessageQueue()->push(report); + + time(&start); + + for (int i = 0; i < 120; i++) { + camera.m_camera >> frame; + } + + time(&end); + + double seconds = difftime (end, start); + camera.m_videoFPS = (120 / seconds) * 0.95; // take a 5% guard + camera.m_videoFPSq = camera.m_videoFPS / m_fps; + camera.m_videoFPSCount = camera.m_videoFPSq; + camera.m_videoPrevFPSCount = 0; + + report = MsgReportCameraData::create( + camera.m_cameraNumber, + camera.m_videoFPS, + camera.m_videoWidth, + camera.m_videoHeight, + 2); // close splash screen on GUI side + getOutputMessageQueue()->push(report); + } + int grabOK; int fpsIncrement = (int) camera.m_videoFPSCount - camera.m_videoPrevFPSCount; @@ -445,7 +484,8 @@ bool ATVMod::handleMessage(const Message& cmd) m_cameras[m_cameraIndex].m_cameraNumber, m_cameras[m_cameraIndex].m_videoFPS, m_cameras[m_cameraIndex].m_videoWidth, - m_cameras[m_cameraIndex].m_videoHeight); + m_cameras[m_cameraIndex].m_videoHeight, + 0); getOutputMessageQueue()->push(report); } } @@ -714,7 +754,7 @@ void ATVMod::scanCameras() m_cameras.back().m_videoWidth = (int) m_cameras.back().m_camera.get(CV_CAP_PROP_FRAME_WIDTH); m_cameras.back().m_videoHeight = (int) m_cameras.back().m_camera.get(CV_CAP_PROP_FRAME_HEIGHT); - m_cameras.back().m_videoFPS = m_cameras.back().m_videoFPS < 0 ? 25.0f : m_cameras.back().m_videoFPS; + //m_cameras.back().m_videoFPS = m_cameras.back().m_videoFPS < 0 ? 16.3f : m_cameras.back().m_videoFPS; qDebug("ATVMod::scanCameras: [%d] FPS: %f %dx%d", i, @@ -757,7 +797,8 @@ void ATVMod::getCameraNumbers(std::vector& numbers) m_cameras[0].m_cameraNumber, m_cameras[0].m_videoFPS, m_cameras[0].m_videoWidth, - m_cameras[0].m_videoHeight); + m_cameras[0].m_videoHeight, + 0); getOutputMessageQueue()->push(report); } } diff --git a/plugins/channeltx/modatv/atvmod.h b/plugins/channeltx/modatv/atvmod.h index 0cae0b8ec..e775667e6 100644 --- a/plugins/channeltx/modatv/atvmod.h +++ b/plugins/channeltx/modatv/atvmod.h @@ -217,18 +217,21 @@ public: float getFPS() const { return m_fps; } int getWidth() const { return m_width; } int getHeight() const { return m_height; } + int getStatus() const { return m_status; } static MsgReportCameraData* create( int deviceNumber, - int fps, + float fps, int width, - int height) + int height, + int status) { return new MsgReportCameraData( deviceNumber, fps, width, - height); + height, + status); } protected: @@ -236,17 +239,20 @@ public: float m_fps; int m_width; int m_height; + int m_status; MsgReportCameraData( int deviceNumber, float fps, int width, - int height) : + int height, + int status) : Message(), m_deviceNumber(deviceNumber), m_fps(fps), m_width(width), - m_height(height) + m_height(height), + m_status(status) { } }; diff --git a/plugins/channeltx/modatv/atvmodgui.cpp b/plugins/channeltx/modatv/atvmodgui.cpp index 31641e325..b128c8f2c 100644 --- a/plugins/channeltx/modatv/atvmodgui.cpp +++ b/plugins/channeltx/modatv/atvmodgui.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include "device/devicesinkapi.h" #include "dsp/upchannelizer.h" @@ -168,6 +169,23 @@ bool ATVModGUI::handleMessage(const Message& message) ui->cameraDeviceNumber->setText(tr("#%1").arg(rpt.getdeviceNumber())); ui->camerFPS->setText(tr("%1 FPS").arg(rpt.getFPS(), 0, 'f', 2)); ui->cameraImageSize->setText(tr("%1x%2").arg(rpt.getWidth()).arg(rpt.getHeight())); + + int status = rpt.getStatus(); + + if (status == 1) // camera FPS scan is startng + { + m_camBusyFPSMessageBox = new QMessageBox(); + m_camBusyFPSMessageBox->setText("Computing camera FPS. Please wait…"); + m_camBusyFPSMessageBox->setStandardButtons(0); + m_camBusyFPSMessageBox->show(); + } + else if (status == 2) // camera FPS scan is finished + { + m_camBusyFPSMessageBox->close(); + if (m_camBusyFPSMessageBox) delete m_camBusyFPSMessageBox; + m_camBusyFPSMessageBox = 0; + } + return true; } else @@ -346,7 +364,8 @@ ATVModGUI::ATVModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* pa m_videoFrameRate(48000), m_frameCount(0), m_tickCount(0), - m_enableNavTime(false) + m_enableNavTime(false), + m_camBusyFPSMessageBox(0) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose, true); diff --git a/plugins/channeltx/modatv/atvmodgui.h b/plugins/channeltx/modatv/atvmodgui.h index abf6c325c..bb541825c 100644 --- a/plugins/channeltx/modatv/atvmodgui.h +++ b/plugins/channeltx/modatv/atvmodgui.h @@ -29,6 +29,7 @@ class DeviceSinkAPI; class ThreadedBasebandSampleSource; class UpChannelizer; class ATVMod; +class QMessageBox; namespace Ui { class ATVModGUI; @@ -103,6 +104,7 @@ private: int m_frameCount; std::size_t m_tickCount; bool m_enableNavTime; + QMessageBox *m_camBusyFPSMessageBox; explicit ATVModGUI(PluginAPI* pluginAPI, DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); virtual ~ATVModGUI();