[libcamera-devel,v4,5/6] qcam: Update window title with FPS

Message ID 20190704145942.17879-6-kieran.bingham@ideasonboard.com
State Accepted
Headers show
Series
  • Automatic Version Generation ++
Related show

Commit Message

Kieran Bingham July 4, 2019, 2:59 p.m. UTC
Provide an average FPS in the QCam title bar to show the current rate of
frame processing.

The QCam compilation is updated to process the QT MoC headers to support
signals and slots accordingly.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

---
v4
 - Start and stop title timer with the stream
---
 src/qcam/main_window.cpp | 23 +++++++++++++++++++++++
 src/qcam/main_window.h   | 15 +++++++++++++++
 src/qcam/meson.build     | 11 +++++++++--
 3 files changed, 47 insertions(+), 2 deletions(-)

Comments

Laurent Pinchart July 4, 2019, 8:33 p.m. UTC | #1
Hi Kieran,

Thank you for the patch.

On Thu, Jul 04, 2019 at 03:59:41PM +0100, Kieran Bingham wrote:
> Provide an average FPS in the QCam title bar to show the current rate of
> frame processing.
> 
> The QCam compilation is updated to process the QT MoC headers to support

s/QT/Qt/

> signals and slots accordingly.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> 
> ---
> v4
>  - Start and stop title timer with the stream
> ---
>  src/qcam/main_window.cpp | 23 +++++++++++++++++++++++
>  src/qcam/main_window.h   | 15 +++++++++++++++
>  src/qcam/meson.build     | 11 +++++++++--
>  3 files changed, 47 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index d61369109d66..5693b9256a08 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -28,6 +28,7 @@ MainWindow::MainWindow(const OptionsParser::Options &options)
>  
>  	title_ = "QCam " + QString::fromStdString(libcamera::version);
>  	setWindowTitle(title_);
> +	connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
>  
>  	viewfinder_ = new ViewFinder(this);
>  	setCentralWidget(viewfinder_);
> @@ -54,6 +55,19 @@ MainWindow::~MainWindow()
>  	CameraManager::instance()->stop();
>  }
>  
> +void MainWindow::updateTitle()
> +{
> +	unsigned int duration = frameRateInterval_.elapsed();
> +	unsigned int frames = framesCaptured_ - previousFrames_;
> +	double fps = frames * 1000.0 / duration;
> +
> +	/* Restart counters */

s/counters/counters./

> +	frameRateInterval_.start();
> +	previousFrames_ = framesCaptured_;
> +
> +	setWindowTitle(title_ + " : " + QString::number(fps, 'f', 2) + " fps");
> +}
> +
>  int MainWindow::openCamera()
>  {
>  	CameraManager *cm = CameraManager::instance();
> @@ -148,6 +162,10 @@ int MainWindow::startCapture()
>  		requests.push_back(request);
>  	}
>  
> +	titleTimer_.start(2000);
> +	frameRateInterval_.start();
> +	previousFrames_ = 0;
> +	framesCaptured_ = 0;
>  	lastBufferTime_ = 0;
>  
>  	ret = camera_->start();
> @@ -188,6 +206,9 @@ void MainWindow::stopCapture()
>  	isCapturing_ = false;
>  
>  	config_.reset();
> +
> +	titleTimer_.stop();
> +	setWindowTitle(title_);
>  }
>  
>  void MainWindow::requestComplete(Request *request,
> @@ -196,6 +217,8 @@ void MainWindow::requestComplete(Request *request,
>  	if (request->status() == Request::RequestCancelled)
>  		return;
>  
> +	framesCaptured_++;
> +
>  	Buffer *buffer = buffers.begin()->second;
>  
>  	double fps = buffer->timestamp() - lastBufferTime_;
> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> index 46a494a9d783..e97d92402f1e 100644
> --- a/src/qcam/main_window.h
> +++ b/src/qcam/main_window.h
> @@ -10,7 +10,11 @@
>  #include <map>
>  #include <memory>
>  
> +

No need for this blank line.

> +#include <QElapsedTimer>
>  #include <QMainWindow>
> +#include <QObject>
> +#include <QTimer>
>  
>  #include <libcamera/camera.h>
>  #include <libcamera/stream.h>
> @@ -28,10 +32,15 @@ enum {
>  
>  class MainWindow : public QMainWindow
>  {
> +	Q_OBJECT
> +
>  public:
>  	MainWindow(const OptionsParser::Options &options);
>  	~MainWindow();
>  
> +public Q_SLOTS:
> +	void updateTitle();

Can't you make this private ?

With those small issues fixed,

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> +
>  private:
>  	int openCamera();
>  
> @@ -43,6 +52,8 @@ private:
>  	int display(Buffer *buffer);
>  
>  	QString title_;
> +	QTimer titleTimer_;
> +
>  	const OptionsParser::Options &options_;
>  
>  	std::shared_ptr<Camera> camera_;
> @@ -51,6 +62,10 @@ private:
>  
>  	uint64_t lastBufferTime_;
>  
> +	QElapsedTimer frameRateInterval_;
> +	uint32_t previousFrames_;
> +	uint32_t framesCaptured_;
> +
>  	ViewFinder *viewfinder_;
>  };
>  
> diff --git a/src/qcam/meson.build b/src/qcam/meson.build
> index 9f1fa75f9813..21f91f25cec0 100644
> --- a/src/qcam/meson.build
> +++ b/src/qcam/meson.build
> @@ -7,14 +7,21 @@ qcam_sources = files([
>      'viewfinder.cpp',
>  ])
>  
> -import('qt5')
> +qcam_moc_headers = files([
> +    'main_window.h',
> +])
> +
> +qt5 = import('qt5')
>  qt5_dep = dependency('qt5',
>                       method : 'pkg-config',
>                       modules : ['Core', 'Gui', 'Widgets'],
>                       required : false)
>  
>  if qt5_dep.found()
> -    qcam  = executable('qcam', qcam_sources,
> +    moc_files = qt5.preprocess(moc_headers: qcam_moc_headers,
> +                               dependencies: qt5_dep)
> +
> +    qcam  = executable('qcam', qcam_sources, moc_files,
>                         install : true,
>                         dependencies : [libcamera_dep, qt5_dep],
>                         cpp_args : '-DQT_NO_KEYWORDS')
Kieran Bingham July 4, 2019, 9 p.m. UTC | #2
Hi Laurent,

On 04/07/2019 21:33, Laurent Pinchart wrote:
> Hi Kieran,
> 
> Thank you for the patch.
> 
> On Thu, Jul 04, 2019 at 03:59:41PM +0100, Kieran Bingham wrote:
>> Provide an average FPS in the QCam title bar to show the current rate of
>> frame processing.
>>
>> The QCam compilation is updated to process the QT MoC headers to support
> 
> s/QT/Qt/

Adjusted

> 
>> signals and slots accordingly.
>>
>> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>>
>> ---
>> v4
>>  - Start and stop title timer with the stream
>> ---
>>  src/qcam/main_window.cpp | 23 +++++++++++++++++++++++
>>  src/qcam/main_window.h   | 15 +++++++++++++++
>>  src/qcam/meson.build     | 11 +++++++++--
>>  3 files changed, 47 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
>> index d61369109d66..5693b9256a08 100644
>> --- a/src/qcam/main_window.cpp
>> +++ b/src/qcam/main_window.cpp
>> @@ -28,6 +28,7 @@ MainWindow::MainWindow(const OptionsParser::Options &options)
>>  
>>  	title_ = "QCam " + QString::fromStdString(libcamera::version);
>>  	setWindowTitle(title_);
>> +	connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
>>  
>>  	viewfinder_ = new ViewFinder(this);
>>  	setCentralWidget(viewfinder_);
>> @@ -54,6 +55,19 @@ MainWindow::~MainWindow()
>>  	CameraManager::instance()->stop();
>>  }
>>  
>> +void MainWindow::updateTitle()
>> +{
>> +	unsigned int duration = frameRateInterval_.elapsed();
>> +	unsigned int frames = framesCaptured_ - previousFrames_;
>> +	double fps = frames * 1000.0 / duration;
>> +
>> +	/* Restart counters */
> 
> s/counters/counters./

Added,

> 
>> +	frameRateInterval_.start();
>> +	previousFrames_ = framesCaptured_;
>> +
>> +	setWindowTitle(title_ + " : " + QString::number(fps, 'f', 2) + " fps");
>> +}
>> +
>>  int MainWindow::openCamera()
>>  {
>>  	CameraManager *cm = CameraManager::instance();
>> @@ -148,6 +162,10 @@ int MainWindow::startCapture()
>>  		requests.push_back(request);
>>  	}
>>  
>> +	titleTimer_.start(2000);
>> +	frameRateInterval_.start();
>> +	previousFrames_ = 0;
>> +	framesCaptured_ = 0;
>>  	lastBufferTime_ = 0;
>>  
>>  	ret = camera_->start();
>> @@ -188,6 +206,9 @@ void MainWindow::stopCapture()
>>  	isCapturing_ = false;
>>  
>>  	config_.reset();
>> +
>> +	titleTimer_.stop();
>> +	setWindowTitle(title_);
>>  }
>>  
>>  void MainWindow::requestComplete(Request *request,
>> @@ -196,6 +217,8 @@ void MainWindow::requestComplete(Request *request,
>>  	if (request->status() == Request::RequestCancelled)
>>  		return;
>>  
>> +	framesCaptured_++;
>> +
>>  	Buffer *buffer = buffers.begin()->second;
>>  
>>  	double fps = buffer->timestamp() - lastBufferTime_;
>> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
>> index 46a494a9d783..e97d92402f1e 100644
>> --- a/src/qcam/main_window.h
>> +++ b/src/qcam/main_window.h
>> @@ -10,7 +10,11 @@
>>  #include <map>
>>  #include <memory>
>>  
>> +
> 
> No need for this blank line.


Removed,

> 
>> +#include <QElapsedTimer>
>>  #include <QMainWindow>
>> +#include <QObject>
>> +#include <QTimer>
>>  
>>  #include <libcamera/camera.h>
>>  #include <libcamera/stream.h>
>> @@ -28,10 +32,15 @@ enum {
>>  
>>  class MainWindow : public QMainWindow
>>  {
>> +	Q_OBJECT
>> +
>>  public:
>>  	MainWindow(const OptionsParser::Options &options);
>>  	~MainWindow();
>>  
>> +public Q_SLOTS:
>> +	void updateTitle();
> 
> Can't you make this private ?
> 

Yes, it seems I can.


> With those small issues fixed,
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Collected, thanks.


> 
>> +
>>  private:
>>  	int openCamera();
>>  
>> @@ -43,6 +52,8 @@ private:
>>  	int display(Buffer *buffer);
>>  
>>  	QString title_;
>> +	QTimer titleTimer_;
>> +
>>  	const OptionsParser::Options &options_;
>>  
>>  	std::shared_ptr<Camera> camera_;
>> @@ -51,6 +62,10 @@ private:
>>  
>>  	uint64_t lastBufferTime_;
>>  
>> +	QElapsedTimer frameRateInterval_;
>> +	uint32_t previousFrames_;
>> +	uint32_t framesCaptured_;
>> +
>>  	ViewFinder *viewfinder_;
>>  };
>>  
>> diff --git a/src/qcam/meson.build b/src/qcam/meson.build
>> index 9f1fa75f9813..21f91f25cec0 100644
>> --- a/src/qcam/meson.build
>> +++ b/src/qcam/meson.build
>> @@ -7,14 +7,21 @@ qcam_sources = files([
>>      'viewfinder.cpp',
>>  ])
>>  
>> -import('qt5')
>> +qcam_moc_headers = files([
>> +    'main_window.h',
>> +])
>> +
>> +qt5 = import('qt5')
>>  qt5_dep = dependency('qt5',
>>                       method : 'pkg-config',
>>                       modules : ['Core', 'Gui', 'Widgets'],
>>                       required : false)
>>  
>>  if qt5_dep.found()
>> -    qcam  = executable('qcam', qcam_sources,
>> +    moc_files = qt5.preprocess(moc_headers: qcam_moc_headers,
>> +                               dependencies: qt5_dep)
>> +
>> +    qcam  = executable('qcam', qcam_sources, moc_files,
>>                         install : true,
>>                         dependencies : [libcamera_dep, qt5_dep],
>>                         cpp_args : '-DQT_NO_KEYWORDS')
>

Patch

diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index d61369109d66..5693b9256a08 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -28,6 +28,7 @@  MainWindow::MainWindow(const OptionsParser::Options &options)
 
 	title_ = "QCam " + QString::fromStdString(libcamera::version);
 	setWindowTitle(title_);
+	connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
 
 	viewfinder_ = new ViewFinder(this);
 	setCentralWidget(viewfinder_);
@@ -54,6 +55,19 @@  MainWindow::~MainWindow()
 	CameraManager::instance()->stop();
 }
 
+void MainWindow::updateTitle()
+{
+	unsigned int duration = frameRateInterval_.elapsed();
+	unsigned int frames = framesCaptured_ - previousFrames_;
+	double fps = frames * 1000.0 / duration;
+
+	/* Restart counters */
+	frameRateInterval_.start();
+	previousFrames_ = framesCaptured_;
+
+	setWindowTitle(title_ + " : " + QString::number(fps, 'f', 2) + " fps");
+}
+
 int MainWindow::openCamera()
 {
 	CameraManager *cm = CameraManager::instance();
@@ -148,6 +162,10 @@  int MainWindow::startCapture()
 		requests.push_back(request);
 	}
 
+	titleTimer_.start(2000);
+	frameRateInterval_.start();
+	previousFrames_ = 0;
+	framesCaptured_ = 0;
 	lastBufferTime_ = 0;
 
 	ret = camera_->start();
@@ -188,6 +206,9 @@  void MainWindow::stopCapture()
 	isCapturing_ = false;
 
 	config_.reset();
+
+	titleTimer_.stop();
+	setWindowTitle(title_);
 }
 
 void MainWindow::requestComplete(Request *request,
@@ -196,6 +217,8 @@  void MainWindow::requestComplete(Request *request,
 	if (request->status() == Request::RequestCancelled)
 		return;
 
+	framesCaptured_++;
+
 	Buffer *buffer = buffers.begin()->second;
 
 	double fps = buffer->timestamp() - lastBufferTime_;
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index 46a494a9d783..e97d92402f1e 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -10,7 +10,11 @@ 
 #include <map>
 #include <memory>
 
+
+#include <QElapsedTimer>
 #include <QMainWindow>
+#include <QObject>
+#include <QTimer>
 
 #include <libcamera/camera.h>
 #include <libcamera/stream.h>
@@ -28,10 +32,15 @@  enum {
 
 class MainWindow : public QMainWindow
 {
+	Q_OBJECT
+
 public:
 	MainWindow(const OptionsParser::Options &options);
 	~MainWindow();
 
+public Q_SLOTS:
+	void updateTitle();
+
 private:
 	int openCamera();
 
@@ -43,6 +52,8 @@  private:
 	int display(Buffer *buffer);
 
 	QString title_;
+	QTimer titleTimer_;
+
 	const OptionsParser::Options &options_;
 
 	std::shared_ptr<Camera> camera_;
@@ -51,6 +62,10 @@  private:
 
 	uint64_t lastBufferTime_;
 
+	QElapsedTimer frameRateInterval_;
+	uint32_t previousFrames_;
+	uint32_t framesCaptured_;
+
 	ViewFinder *viewfinder_;
 };
 
diff --git a/src/qcam/meson.build b/src/qcam/meson.build
index 9f1fa75f9813..21f91f25cec0 100644
--- a/src/qcam/meson.build
+++ b/src/qcam/meson.build
@@ -7,14 +7,21 @@  qcam_sources = files([
     'viewfinder.cpp',
 ])
 
-import('qt5')
+qcam_moc_headers = files([
+    'main_window.h',
+])
+
+qt5 = import('qt5')
 qt5_dep = dependency('qt5',
                      method : 'pkg-config',
                      modules : ['Core', 'Gui', 'Widgets'],
                      required : false)
 
 if qt5_dep.found()
-    qcam  = executable('qcam', qcam_sources,
+    moc_files = qt5.preprocess(moc_headers: qcam_moc_headers,
+                               dependencies: qt5_dep)
+
+    qcam  = executable('qcam', qcam_sources, moc_files,
                        install : true,
                        dependencies : [libcamera_dep, qt5_dep],
                        cpp_args : '-DQT_NO_KEYWORDS')