From e20996831570ec951cf8c38cf927e83b377853f5 Mon Sep 17 00:00:00 2001
From: am0ebe <am0ebe@gmx.de>
Date: Thu, 15 Feb 2024 16:13:59 +0100
Subject: [PATCH] v0.0.8 - get frame in Processor! fix errors. project: clean:
 rm jpgs.

---
 obj/recorder-cmd.pro                     |   2 +-
 src/cmd/console.cpp                      |  39 +++-
 src/cmd/console.h                        |  19 +-
 src/cmd/core.cpp                         | 231 ++++++++++++-----------
 src/cmd/core.h                           |  25 ++-
 src/cmd/frameobserver.cpp                |  55 ++++--
 src/cmd/frameobserver.h                  |  14 +-
 src/cmd/frameprocessor.cpp               |  57 +++---
 src/cmd/frameprocessor.h                 |   4 +-
 src/cmd/main.cpp                         |  18 +-
 src/utils.cpp                            |   5 +-
 src/utils.h                              |   3 +-
 vimbax/api/include/VmbC/VmbCommonTypes.h | 148 +++++++--------
 13 files changed, 343 insertions(+), 277 deletions(-)

diff --git a/obj/recorder-cmd.pro b/obj/recorder-cmd.pro
index ac54cd1..a7c42f7 100644
--- a/obj/recorder-cmd.pro
+++ b/obj/recorder-cmd.pro
@@ -40,5 +40,5 @@ QMAKE_CXXFLAGS += -Wno-deprecated-enum-enum-conversion # ignore opencv warnings.
 TARGET = cmd
 DESTDIR = ../bin
 
-QMAKE_CLEAN += .cache/clangd/index/* .qmake.stash
+QMAKE_CLEAN += .cache/clangd/index/* .qmake.stash $${DESTDIR}/*jpg
 #cant rm dir here, so added in project file
diff --git a/src/cmd/console.cpp b/src/cmd/console.cpp
index 19b662c..b497cc6 100644
--- a/src/cmd/console.cpp
+++ b/src/cmd/console.cpp
@@ -45,7 +45,7 @@ void Console::print(const QString& str )
 	qDebug().noquote() << str;
 }
 
-void Console::printList(const QStringList& list )
+void Console::print(const QStringList& list )
 {
 
 	for ( auto str : list  )
@@ -55,6 +55,32 @@ void Console::printList(const QStringList& list )
 	}
 }
 
+void Console::printVersion()
+{
+	auto version = getVersions();
+	print(version);
+}
+
+void Console::printHelp()
+{
+	//sa Controller::keyPress
+	QStringList str;
+	str << "HELP!"
+	<< "-------------------------------"
+	<< "h: print this help"
+	<< "1-9: select camera"
+	<< "o: open selected camera"
+	// XXX add new func
+	<< "r: start recording"
+	<< "t: stop recording"
+	<< "l: list available cameras"
+	<< "v: print versions"
+	<< "q: quit"
+	<< "-------------------------------";
+
+	print(str);
+}
+
 // ###############################
 // Controller
 Controller::Controller() : console(new Console())
@@ -88,7 +114,7 @@ void Controller::keyPress(const QChar& key)
 		{
 			// XXX add new func
 			case 'h':
-				emit printHelp();
+				console->printHelp();
 				break;
 
 			case 'o':
@@ -96,16 +122,19 @@ void Controller::keyPress(const QChar& key)
 				break;
 
 			case 'l':
-
 				emit listCams();
 				break;
 
 			case 'r':
-				emit record();
+				emit startRecording();
+				break;
+
+			case 't':
+				emit stopRecording();
 				break;
 
 			case 'v':
-				emit printVersion();
+				console->printVersion();
 				break;
 
 			case 'q':
diff --git a/src/cmd/console.h b/src/cmd/console.h
index 31736fd..1f06a56 100644
--- a/src/cmd/console.h
+++ b/src/cmd/console.h
@@ -15,7 +15,10 @@ class Console : public QObject
 		void error(const QString&,const int&);
 		void error(const int&);
 		void print(const QString&);
-		void printList(const QStringList&);
+		void print(const QStringList&);
+
+		void printVersion();
+		void printHelp();
 		// ...
 
 	signals:
@@ -39,25 +42,17 @@ class Controller : public QObject
 	signals:
 		// to UI
 		void operate();
-		void error(const QString&,const int& errCode=0);
-		void error(const int& errCode=0);
-		void print(const QString&);
-		void printList(const QStringList&);
 
 		// to core
-		void printHelp();
-		void printVersion();
-
 		void listCams();
 		void openCam();
 		void selectCam(int);
-		void record();
+		void startRecording();
+		void stopRecording();
 
-		// XXX add new func
 		// void calibrateCam();
-		// void stopRecording();
 		// void loadSettings();
 		// void storeSettings();
-		// ... more signals here
+		// ... more signals here, new func XXX
 
 };
diff --git a/src/cmd/core.cpp b/src/cmd/core.cpp
index c751373..f30bede 100644
--- a/src/cmd/core.cpp
+++ b/src/cmd/core.cpp
@@ -1,17 +1,19 @@
 #include "core.h"
-#include "VmbC/VmbCommonTypes.h"
-#include "VmbCPP/SharedPointerDefines.h"
 #include "frameobserver.h"
-
 #include "../utils.h"
+
 #include <iostream>
 #include <vector>
 
+#include "VmbC/VmbCommonTypes.h"
+#include "VmbCPP/SharedPointerDefines.h"
 #include <VmbCPP/VmbCPP.h>
 #include <VmbCPP/Camera.h>
 
 #include <QDebug>
 #include <QThread>
+#include <QTimer>
+
 
 using namespace VmbCPP;
 
@@ -20,7 +22,11 @@ Core::Core() :
 	sys( VmbSystem::GetInstance() ), // Create and get Vimba singleton
 	cameras( CameraPtrVector() ), // Holds camera handles
 	camIdx(-1),
-	curCam(nullptr)
+	curCam(nullptr),
+	payloadSize(0),
+	frames(FramePtrVector(3)),
+	// frames(FramePtrVector(QThread::idealThreadCount())),
+	pixelFormat("")
 {
 	if ( f(sys.Startup()) )
 	{
@@ -38,7 +44,7 @@ void Core::initCams()
 {
 	if ( f(sys.GetCameras( cameras )))
 	{
-		qDebug() << "Couldn't get cameras";
+		qDebug() << "No cameras";
 	}
 	else
 	{
@@ -53,12 +59,12 @@ void Core::initCams()
 
 Core::~Core()
 {
-	// close each camera in cameras
-	for ( auto iter = cameras.begin (); cameras.end () != iter; ++ iter )
-		(*iter)->Close();
-
 	qDebug() << __FUNCTION__ << "():" << __LINE__;
-	sys.Shutdown(); //unload TL's
+
+	for ( auto cam : cameras )
+		cam->Close();
+
+	sys.Shutdown();
 }
 
 CameraPtr Core::cam()
@@ -66,9 +72,13 @@ CameraPtr Core::cam()
 	return cameras.at(camIdx);
 }
 
+//2d
+// need to update open / closed states.
+//initially cams are closed, right? XXX how to find out?
+//XXX track states
+//VmbSystem::RegisterCameraListObserver
 void Core::listCams()
 {
-
 	if( !apiStarted )
 		return;
 
@@ -87,6 +97,7 @@ void Core::listCams()
 		else
 			curCamInfo += "[ ]" + DELIM;
 
+
 		if( f((camera->GetID( str )))) continue;
 		curCamInfo += QString::fromStdString(str) + DELIM;
 
@@ -102,64 +113,66 @@ void Core::listCams()
 		if( f((camera->GetInterfaceID( str )))) continue;
 		curCamInfo += QString::fromStdString(str) + DELIM;
 
-		curCamInfo += "closed";
-		// need to update open / closed states.
-		//initially cams are closed, right? XXX how to find out?
-		//XXX track states
-		//VmbSystem::RegisterCameraListObserver
+		// curCamInfo += "closed";//xxx
 
 		allCamInfo << curCamInfo;
 		idx++;
 	}
-	emit print(QString("found " + QString::number(cameras.size()) + " cameras"));
-	emit printList(allCamInfo);
-}
 
-void Core::printVersion()
-{
-	auto version = getVersions();
-	emit printList(version);
-}
-
-void Core::printHelp()
-{
-	//sa Controller::keyPress
-	QStringList str;
-	str << "HELP!"
-	<< "-------------------------------"
-	<< "h: print this help"
-	<< "1-9: select camera"
-	<< "o: open selected camera"
-	// XXX add new func
-	<< "r: start recording"
-	<< "l: list available cameras"
-	<< "v: print versions"
-	<< "q: quit"
-	<< "-------------------------------";
-
-	emit printList(str);
+	if( !cameras.size())
+		emit error(errNoCams);
+	else
+	{
+		emitPrint("found Cameras",cameras.size());
+		emit print(allCamInfo);
+	}
 }
 
 bool Core::f(const VmbErrorType& ret, const QString& msg)
 {
-	//vimba function wrapper to test return type and potentially emit error message or successmsg
+	// vimba function wrapper to test return type and potentially emit error message or successmsg
 	// returns true on error
-	if( VmbErrorSuccess == ret )
+	// qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << " ret:" << ret << " msg:" << msg;
+
+	if ( VmbErrorSuccess == ret )
 	{
 		if (! msg.isEmpty())
-			emit print(msg);
+			emitPrint(msg);
 
 		return false;
 	}
 	else
 	{
 		if (! msg.isEmpty())
-			emit print("Fail! " + msg);
+			emitPrint("Fail! " + msg);
 		emit error(ret);
 		return true;
 	}
 }
 
+void Core::g(const VmbErrorType& ret, const QString& msg)
+{
+	//vimba function wrapper - throws exception on error - to declutter error handling code
+	if( f(ret,msg) )
+		throw std::runtime_error("Error: " + msg.toStdString());
+}
+
+void Core::emitPrint(const QString& name, const VmbInt64_t& val=0)
+{
+	if( val != 0 )
+		emit print(QString("%1: %2").arg(name).arg(val));
+	else
+		emit print(name);
+}
+
+void Core::emitPrint(const QString& name, const std::string& val)
+{
+	if( val.empty() )
+		emit print(name);
+	else
+		emit print(name + ": " + QString::fromStdString(val));
+}
+
 bool Core::openCam()
 {
 	if(!curCam)
@@ -183,81 +196,83 @@ void Core::selectCam(const int& camIdx)
 		return;
 	}
 
-	emit print("camSelected("+QString::number(camIdx)+")");
+	emitPrint("camSelected",camIdx);
 }
 
-void Core::record()
+/* Does:
+	get Payloadsize
+	get Pixelformat - eg RGB8
+	Allocate memory for frame buffer
+	Register frame observer / callback for each frame
+	Announce frame to the API
+	Start the capture engine (API)
+	Put frame into the frame queue
+	Start the acquisition engine ( curCam)
+
+	TODO use exceptions to not clutter error handling code here and catch em in main
+	TODO if( !curCam->isOpen() ) return; >> listener
+	2d get frameID
+*/
+void Core::startRecording()
 {
-	//TODO use exceptions to not clutter error handling code here and catch em in main
-	// TODO
-	// if( !curCam->isOpen() )
-		// return; >> listener
-	VmbInt64_t nPLS; // Payload size value
-	FeaturePtr pFeature ; // Generic feature pointer
-	auto nFrames = 5;
-	FramePtrVector frames(nFrames); // Frame array
+	FeaturePtr pFeature;
 
+	try
+	{
+		g( curCam->GetFeatureByName ("PayloadSize", pFeature ),"get PayloadSize");
+		g( pFeature->GetValue (payloadSize));
+		emitPrint("PayloadSize",payloadSize);
 
+		g( curCam->GetFeatureByName("PixelFormat", pFeature));
+		g( pFeature->GetValue(pixelFormat));
+		emitPrint("PixelFormat",pixelFormat);
 
-	// Get the image size for the required buffer
-	if ( f(curCam->GetFeatureByName ("PayloadSize", pFeature ),"get PayloadSize") )
-		return; // emit error("Couldn't get payload size 1");
+		for( auto& frame : frames )
+		{
+			frame.reset(new Frame(payloadSize));
+			g( frame->RegisterObserver( IFrameObserverPtr( new FrameObserver(curCam) )),"register frame observer");
+			g( curCam->AnnounceFrame(frame), "announce frame");
+		}
 
-	// if( pFeature == nullptr )
-		// return; // emit error("Couldn't get payload size 2");
+		g( curCam->StartCapture(), "start capture");
 
-	if( f(pFeature->GetValue (nPLS)))
-		return;
-	qDebug() << "nPLS: " << nPLS;
+		for( auto frame : frames )
+			g( curCam->QueueFrame(frame),"QueueFrame");
 
-	// Allocate memory for frame buffer
-	// Register frame observer / callback for each frame
-	// Announce frame to the API
-	for( auto& frame : frames )
+		g( curCam->GetFeatureByName ("AcquisitionStart", pFeature ),"get AcquisitionStart");
+		g( pFeature->RunCommand(),"run AcquisitionStart");
+	}
+	catch (const std::runtime_error& xx)
 	{
-		frame.reset(new Frame(nPLS));
-		f(frame->RegisterObserver( IFrameObserverPtr( new FrameObserver(curCam) )),"register frame observer");
-		f(curCam->AnnounceFrame(frame), "announce frame");
+		// ... handle exception
+		qDebug() << "Exception caught: " << xx.what();
 	}
 
-	// Start the capture engine (API)
-	f(curCam->StartCapture(), "start capture");
-
-	for( auto frame : frames )
-		f(curCam->QueueFrame(frame),"QueueFrame"); // Put frame into the frame queue
-		// if( !frame ) error("frame is null");
-
-	// Start the acquisition engine ( curCam)
-	f(curCam->GetFeatureByName ("AcquisitionStart", pFeature ),"get AcquisitionStart");
-
-	// curCam->StartContinuousImageAcquisition(int bufferCount, const IFrameObserverPtr &pObserver)
-
-	f(pFeature->RunCommand(),"run AcquisitionStart");
-
-	// pFeature ->IsCommandDone(bool &isDone)
-	// pFeature ->
-
-	// Program runtime
-	QThread::sleep(2);
-
-
-	// Stop the acquisition engine ( curCam)
-	f(curCam->GetFeatureByName ("AcquisitionStop", pFeature ),"get AcquisitionStop");
-	f(pFeature->RunCommand(),"run AcquisitionStop");
-
-
-	// Stop the capture engine (API)
-	// Flush the frame queue
-	// Revoke all frames from the API
-	f(curCam->EndCapture(),"end capture");
-	f(curCam->FlushQueue(),"flush queue");
-	f(curCam->RevokeAllFrames(),"revoke all frames");
+	// QTimer::singleShot(6000, this, SLOT(stopRecording()));
+}
 
-	for( FramePtr frame : frames )
+/* Does:
+	Stop the capture engine (API) + discard all pending callbacks
+	Flush the frame queue
+	Revoke all frames from the API
+	Unregister the frame observer / callback
+*/
+void Core::stopRecording()
+{
+	FeaturePtr pFeature;
+	try
+	{
+		g(curCam->GetFeatureByName ("AcquisitionStop", pFeature ),"get AcquisitionStop");
+		g(pFeature->RunCommand(),"run AcquisitionStop");
+		g(curCam->EndCapture(),"end capture");
+		g(curCam->FlushQueue(),"flush queue");
+		g(curCam->RevokeAllFrames(),"revoke all frames");
+		for( FramePtr frame : frames )
+			g(frame->UnregisterObserver(),"unregister observer");
+	}
+	catch (const std::runtime_error& xx)
 	{
-		qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << " frame:" << frame;
-		// Unregister the frame observer / callback
-		f(frame->UnregisterObserver(),"unregister observer");
+		// ... handle exception
+		qDebug() << "Exception caught: " << xx.what();
 	}
-	qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << "";
 }
diff --git a/src/cmd/core.h b/src/cmd/core.h
index 634117c..d3da7b6 100644
--- a/src/cmd/core.h
+++ b/src/cmd/core.h
@@ -1,14 +1,18 @@
 #pragma once
 
-#include "qglobal.h"
+// #include "qglobal.h"
 #include <QObject>
+
 #include <VmbCPP/SharedPointerDefines.h>
 #include <VmbCPP/Interface.h>
+#include <VmbCPP/Camera.h>
 
 namespace VmbCPP {
 	class VmbSystem;
 }
 using VmbCPP::CameraPtr;
+using VmbCPP::FeaturePtr;
+using VmbCPP::FramePtrVector;
 
 class Core : public QObject
 {
@@ -19,24 +23,27 @@ class Core : public QObject
 		~Core();
 
 	public slots:
-		void printVersion();
-		void printHelp();
-
 		void listCams();
 		bool openCam();
 		void selectCam(const int &);
-		CameraPtr cam(); // make getter seetter -> rm curCam and camIdx //or make Camera class wrapper
+		CameraPtr cam(); // make getter setter -> rm curCam and camIdx //or make Camera class wrapper
 
-		void record();
+		void startRecording();
+		void stopRecording();
 
 	signals:
 		void print(const QString &);
-		void printList(QStringList);
+		void print(const QStringList&);
 		void error(const int&);
 		void error(const QString&,const int& errCode=0);
 
 	private:
 		bool f(const VmbErrorType&, const QString& = "");
+		void g(const VmbErrorType&, const QString& = "");
+
+		void emitPrint(const QString&, const VmbInt64_t& v);
+		void emitPrint(const QString&, const std::string& v="");
+
 		void initCams();
 		void getCamInfo( const CameraPtr & );
 
@@ -45,4 +52,8 @@ class Core : public QObject
 		VmbCPP::CameraPtrVector cameras;
 		ulong camIdx;
 		CameraPtr curCam;
+
+		VmbInt64_t payloadSize;
+		FramePtrVector frames;
+		std::string pixelFormat;
 };
diff --git a/src/cmd/frameobserver.cpp b/src/cmd/frameobserver.cpp
index 28feedb..3d38938 100644
--- a/src/cmd/frameobserver.cpp
+++ b/src/cmd/frameobserver.cpp
@@ -1,6 +1,7 @@
 #include "frameobserver.h"
 #include "frameprocessor.h"
 #include "qnamespace.h"
+#include "qthread.h"
 
 #include <VmbCPP/SharedPointerDefines.h>
 #include <VmbCPP/Camera.h>
@@ -12,42 +13,60 @@
 
 using namespace VmbCPP;
 
-
 FrameObserver::FrameObserver( CameraPtr pCamera ) : IFrameObserver( pCamera )
 {
-	// static int count=0;
-	// qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << " #:" << count++
+
 }
 
-// Frame callback notifies about incoming frames
-// process data afap
-// some functions are prohibited within this callback!
-// Do not apply image processing within this callback ( performance )
-// -> create frame processor to handle frame processing asynchronously
-// When the frame has been processed , requeue it
+/* Frame callback notifies about incoming frames
+	process data afap
+	some functions are prohibited within this callback!
+	Do not apply image processing within this callback ( performance )
+	-> create frame processor to handle frame processing asynchronously
+	- when the frame has been processed , requeue it
+*/
 void FrameObserver::FrameReceived ( const FramePtr pframe )
 {
-	qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << "";
-
-	FrameProcessor *processor = new FrameProcessor(pframe, this);
+	// qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << "";
 
+	VmbFrameStatusType status;
+	pframe->GetReceiveStatus(status);
+	switch( status )
+	{
+		case VmbFrameStatusIncomplete:
+			qDebug() << "Frame incomplete";
+			queueFrame(pframe);
+			return;
+		case VmbFrameStatusTooSmall:
+			qDebug() << "Frame too small";
+			queueFrame(pframe);
+			return;
+		case VmbFrameStatusInvalid:
+			qDebug() << "Frame invalid. Could not be filled to the end";
+			queueFrame(pframe);
+			return;
+		default:
+			qDebug() << "Frame status unknown";
+			return;
+		case VmbFrameStatusComplete:
+			// qDebug() << "Frame completed :) !!";
+			break;
+	}
 
+	FrameProcessor* processor = new FrameProcessor(pframe);
 	QThread *thread = new QThread;
 	processor->moveToThread(thread);
 
 	connect(thread, &QThread::started, processor, &FrameProcessor::processFrame);
+	connect(processor, &FrameProcessor::frameProcessed, this, &FrameObserver::queueFrame); //call **before** thread is deleted!
 	connect(processor, &FrameProcessor::frameProcessed, processor, &FrameProcessor::deleteLater);
 	connect(processor, &FrameProcessor::frameProcessed, thread, &QThread::quit);
-	connect(processor, &FrameProcessor::frameProcessed, this, &FrameObserver::queueFrame); // Connect to a slot in FrameObserver
 	connect(thread, &QThread::finished, thread, &QThread::deleteLater);
 
 	thread->start();
-
-	m_pCamera->QueueFrame( pframe );
 }
 
-
-void FrameObserver::queueFrame(FramePtr pFrame)
+void FrameObserver::queueFrame(FramePtr pframe)
 {
-	m_pCamera->QueueFrame(pFrame); // Queue the frame back to the camera
+	m_pCamera->QueueFrame(pframe); // Queue the frame back to the camera
 }
diff --git a/src/cmd/frameobserver.h b/src/cmd/frameobserver.h
index 23f39ce..6ab97f0 100644
--- a/src/cmd/frameobserver.h
+++ b/src/cmd/frameobserver.h
@@ -3,21 +3,21 @@
 #include <QObject>
 #include <VmbCPP/IFrameObserver.h>
 
-// using VmbCPP::CameraPtr;
-// using VmbCPP::FramePtr;
-// using VmbCPP::IFrameObserver;
-using namespace VmbCPP;
+using VmbCPP::CameraPtr;
+using VmbCPP::FramePtr;
+using VmbCPP::IFrameObserver;
 
 class FrameObserver : public QObject, public IFrameObserver
 {
 	Q_OBJECT
 
 	public:
-		void FrameReceived( const FramePtr pFrame );
+		void FrameReceived( const FramePtr );
 		FrameObserver( CameraPtr pCamera );
 
-	private slots:
-		void queueFrame(FramePtr pFrame);
+
+	public slots:
+		void queueFrame(FramePtr pframe);
 
 };
 
diff --git a/src/cmd/frameprocessor.cpp b/src/cmd/frameprocessor.cpp
index cd6cbca..b127422 100644
--- a/src/cmd/frameprocessor.cpp
+++ b/src/cmd/frameprocessor.cpp
@@ -1,6 +1,8 @@
 #include "frameprocessor.h"
-#include "opencv2/imgcodecs.hpp"
+#include "frameobserver.h"
+#include "qobject.h"
 
+#include <opencv2/imgcodecs.hpp>
 #include <opencv2/opencv.hpp>
 
 #include <VmbC/VmbCommonTypes.h>
@@ -11,56 +13,49 @@
 #include <QObject>
 #include <QImage>
 
-FrameProcessor::FrameProcessor(FramePtr pframe, QObject *parent) : QObject(parent), m_pframe(pframe)
-{}
+FrameProcessor::FrameProcessor(const FramePtr pframe) : m_pframe(pframe) {}
+
+FrameProcessor::~FrameProcessor()
+{
+	// qDebug() << __PRETTY_FUNCTION__;
+}
+
 
 //2d check image format!
 //2d add camera name to filename
-/// Process the received frame asynchronously
+// Process the received frame asynchronously
+// pre: Frame needs to be valid!
+// post: frame needs to be requeued
 void FrameProcessor::processFrame()
 {
-	// process frames receiveStatus
-	VmbFrameStatusType status;
-	m_pframe->GetReceiveStatus(status);
-	if (status != VmbFrameStatusComplete)
-	{
-		qDebug() << "Frame not complete, skip processing.";
-		return;
-	}
-
 	VmbUint32_t width = 0;
 	VmbUint32_t height = 0;
-	unsigned char* pdata;
+	unsigned char* pdata = nullptr;
+	VmbUint64_t timestamp = 0;
 	VmbPixelFormatType pixelFormat;
-	VmbUint64_t timestamp;
 
 	m_pframe->GetWidth(width);
 	m_pframe->GetHeight(height);
 	m_pframe->GetBuffer(pdata);
-	m_pframe->GetPixelFormat(pixelFormat);
 	m_pframe->GetTimestamp(timestamp);
+	m_pframe->GetPixelFormat(pixelFormat);
 
-	cv::Mat frameMat(height, width, CV_8UC3, pdata);
-
-	if (pixelFormat == VmbPixelFormatRgb8)
+	if (pixelFormat != VmbPixelFormatRgb8)
 	{
-		// If the frame pixel format is RGB8, directly copy the data
-		// memcpy(frameMat.data, pData, width * height * 3);
-		qDebug() << "Pixel format is RGB8";
-	}
-	else
-	{
-		// If the pixel format is not already in BGR format, you may need to convert it
-		// cv::Mat tempMat(height, width, CV_8UC1, pdata); //UC1??
-		// cv::cvtColor(tempMat, frameMat, cv::COLOR_BayerGB2BGR); // Adjust the conversion based on the actual Bayer pattern
-		qDebug() << "Pixel format is not RGB8, converting to BGR";
+		qWarning() << "Pixel format is not RGB8, 2D: implement convert func ... ";
+		return;
 	}
 
-	std::vector<int> params = {cv::IMWRITE_JPEG_QUALITY, 99, cv::IMWRITE_JPEG_OPTIMIZE, 1, cv::IMWRITE_JPEG_RST_INTERVAL,4};
+	qDebug() << "Frame received: " << width << "x" << height << "px, format: " << pixelFormat << ", timestamp: " << timestamp;
+
+	cv::Mat frameMat(height, width, CV_8UC3, pdata);
 
-	QString filename = QString::number(timestamp) + "frame.jpg";
+	std::vector<int> params = {cv::IMWRITE_JPEG_QUALITY, 99, cv::IMWRITE_JPEG_OPTIMIZE, 1, cv::IMWRITE_JPEG_RST_INTERVAL,4};
+	QString filename = QString::number(timestamp) + "_frame.jpg";
 	cv::imwrite(filename.toStdString(), frameMat, params);
 	qDebug() << "Frame saved as JPEG: " << filename;
 
+	QThread::msleep(500); //simulate processing time
+
 	emit frameProcessed(m_pframe);
 }
diff --git a/src/cmd/frameprocessor.h b/src/cmd/frameprocessor.h
index 9a80335..55f8440 100644
--- a/src/cmd/frameprocessor.h
+++ b/src/cmd/frameprocessor.h
@@ -8,7 +8,9 @@ class FrameProcessor : public QObject
 	Q_OBJECT
 
 public:
-	explicit FrameProcessor(FramePtr, QObject *parent = nullptr);
+	explicit FrameProcessor(const FramePtr);
+	~FrameProcessor();
+
 
 public slots:
 	void processFrame();
diff --git a/src/cmd/main.cpp b/src/cmd/main.cpp
index 00d57da..ad8e584 100644
--- a/src/cmd/main.cpp
+++ b/src/cmd/main.cpp
@@ -18,26 +18,24 @@ int main(int argc, char *argv[])
 	Core core;
 
 	//ui (controller) -> vmb (core)
-	QObject::connect(&controller, &Controller::printHelp, &core, &Core::printHelp);
-	QObject::connect(&controller, &Controller::printVersion, &core, &Core::printVersion);
-
 	QObject::connect(&controller, &Controller::listCams, &core, &Core::listCams);
 	QObject::connect(&controller, &Controller::openCam, &core, &Core::openCam);
 	QObject::connect(&controller, &Controller::selectCam, &core, &Core::selectCam);
-	QObject::connect(&controller, &Controller::record, &core, &Core::record);
+	QObject::connect(&controller, &Controller::startRecording, &core, &Core::startRecording);
+	QObject::connect(&controller, &Controller::stopRecording, &core, &Core::stopRecording);
 	// XXX add new func
 
 	//vmb (core) -> ui (controller.console)
-	QObject::connect(&core, SIGNAL(error(const QString&, const int&)), controller.console, SLOT(error(const QString&, const int&)),Qt::DirectConnection);
-	QObject::connect(&core, SIGNAL(error(const int&)), controller.console, SLOT(error(const int&)),Qt::DirectConnection);
-	QObject::connect(&core, SIGNAL(print(const QString&)), controller.console, SLOT(print(const QString&)),Qt::DirectConnection);
-	QObject::connect(&core, SIGNAL(printList(const QStringList&)), controller.console, SLOT(printList(const QStringList&)),Qt::DirectConnection);
+	QObject::connect(&core, SIGNAL(error(const QString&, const int&)), controller.console, SLOT(error(const QString&, const int&)), Qt::DirectConnection);
+	QObject::connect(&core, SIGNAL(error(const int&)), controller.console, SLOT(error(const int&)), Qt::DirectConnection);
+	QObject::connect(&core, SIGNAL(print(const QString&)), controller.console, SLOT(print(const QString&)), Qt::DirectConnection);
+	QObject::connect(&core, SIGNAL(print(const QStringList&)), controller.console, SLOT(print(const QStringList&)), Qt::DirectConnection);
 	// sa Controller() for delegating to Console
 
 	QTimer::singleShot(0, &controller, SIGNAL(operate()));
-	QTimer::singleShot(10, &core, SLOT(printVersion())); // for testing
+	// QTimer::singleShot(10, controller.console, SLOT(printVersion()), Qt::DirectConnection); // for testing
 	QTimer::singleShot(30, &core, SLOT(listCams())); // for testing
-	QTimer::singleShot(100, &core, SLOT(openCam())); // for testing
+	QTimer::singleShot(200, &core, SLOT(openCam())); // for testing
 
 	return a.exec();
 }
diff --git a/src/utils.cpp b/src/utils.cpp
index 30c2998..db9f009 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -3,7 +3,6 @@
 
 #include <random>
 
-// #include "mainwindow.h"
 #include "VmbCPP/VmbCPP.h"
 #include <QString>
 #include <QDebug>
@@ -13,7 +12,7 @@
 
 const int APP_VERSION_MAJOR = 0;
 const int APP_VERSION_MINOR = 0;
-const int APP_VERSION_PATCH = 6;
+const int APP_VERSION_PATCH = 8;
 
 using namespace VmbCPP;
 
@@ -64,6 +63,8 @@ const QString errorCodeToMessage( VmbError_t err )
 		case VmbErrorNotSupported:      msg += "Not supported."; break;
 			// ------------------------------- own errCodes -------------------------------
 		case errCamIdx:                 msg += "Camera index out of range."; break;
+		case errNoCams:                 msg += "no cameras found."; break;
+			// xx		=	12,		//!< Unexpected fault in VmbC or driver
 	}
 	return msg;
 }
diff --git a/src/utils.h b/src/utils.h
index 0ffad51..cd65a80 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -17,7 +17,8 @@ const QChar DELIM='|';
 typedef enum camtronErr
 {
 	errCamIdx	=	10,		//!< camera index out of range
-			xx		=	11,		//!< Unexpected fault in VmbC or driver
+	errNoCams	=	11,		//!< no cameras found
+			// errUn		=	12,		//!< Unexpected fault in VmbC or driver
 } camtronErr;
 
 #endif
diff --git a/vimbax/api/include/VmbC/VmbCommonTypes.h b/vimbax/api/include/VmbC/VmbCommonTypes.h
index 360b8fa..32eb896 100644
--- a/vimbax/api/include/VmbC/VmbCommonTypes.h
+++ b/vimbax/api/include/VmbC/VmbCommonTypes.h
@@ -342,89 +342,89 @@ extern "C" {
     typedef enum VmbPixelFormatType
     {
          // mono formats
-        VmbPixelFormatMono8                   = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy8Bit)  | 0x0001,  //!< Monochrome, 8 bits (PFNC:  Mono8)
-        VmbPixelFormatMono10                  = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0003,  //!< Monochrome, 10 bits in 16 bits (PFNC:  Mono10)
-        VmbPixelFormatMono10p                 = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy10Bit) | 0x0046,  //!< Monochrome, 10 bits in 16 bits (PFNC:  Mono10p)
-        VmbPixelFormatMono12                  = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0005,  //!< Monochrome, 12 bits in 16 bits (PFNC:  Mono12)
-        VmbPixelFormatMono12Packed            = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x0006,  //!< Monochrome, 2x12 bits in 24 bits (GEV:Mono12Packed)
-        VmbPixelFormatMono12p                 = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x0047,  //!< Monochrome, 2x12 bits in 24 bits (PFNC:  MonoPacked)
-        VmbPixelFormatMono14                  = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0025,  //!< Monochrome, 14 bits in 16 bits (PFNC:  Mono14)
-        VmbPixelFormatMono16                  = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0007,  //!< Monochrome, 16 bits (PFNC:  Mono16)
+        VmbPixelFormatMono8                   = VmbPixelMono  | VmbPixelOccupy8Bit  | 0x0001,  //!< Monochrome, 8 bits (PFNC:  Mono8)
+        VmbPixelFormatMono10                  = VmbPixelMono  | VmbPixelOccupy16Bit | 0x0003,  //!< Monochrome, 10 bits in 16 bits (PFNC:  Mono10)
+        VmbPixelFormatMono10p                 = VmbPixelMono  | VmbPixelOccupy10Bit | 0x0046,  //!< Monochrome, 10 bits in 16 bits (PFNC:  Mono10p)
+        VmbPixelFormatMono12                  = VmbPixelMono  | VmbPixelOccupy16Bit | 0x0005,  //!< Monochrome, 12 bits in 16 bits (PFNC:  Mono12)
+        VmbPixelFormatMono12Packed            = VmbPixelMono  | VmbPixelOccupy12Bit | 0x0006,  //!< Monochrome, 2x12 bits in 24 bits (GEV:Mono12Packed)
+        VmbPixelFormatMono12p                 = VmbPixelMono  | VmbPixelOccupy12Bit | 0x0047,  //!< Monochrome, 2x12 bits in 24 bits (PFNC:  MonoPacked)
+        VmbPixelFormatMono14                  = VmbPixelMono  | VmbPixelOccupy16Bit | 0x0025,  //!< Monochrome, 14 bits in 16 bits (PFNC:  Mono14)
+        VmbPixelFormatMono16                  = VmbPixelMono  | VmbPixelOccupy16Bit | 0x0007,  //!< Monochrome, 16 bits (PFNC:  Mono16)
 
         // bayer formats
-        VmbPixelFormatBayerGR8                = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy8Bit)  | 0x0008,  //!< Bayer-color, 8 bits, starting with GR line (PFNC:  BayerGR8)
-        VmbPixelFormatBayerRG8                = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy8Bit)  | 0x0009,  //!< Bayer-color, 8 bits, starting with RG line (PFNC:  BayerRG8)
-        VmbPixelFormatBayerGB8                = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy8Bit)  | 0x000A,  //!< Bayer-color, 8 bits, starting with GB line (PFNC:  BayerGB8)
-        VmbPixelFormatBayerBG8                = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy8Bit)  | 0x000B,  //!< Bayer-color, 8 bits, starting with BG line (PFNC:  BayerBG8)
-        VmbPixelFormatBayerGR10               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x000C,  //!< Bayer-color, 10 bits in 16 bits, starting with GR line (PFNC:  BayerGR10)
-        VmbPixelFormatBayerRG10               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x000D,  //!< Bayer-color, 10 bits in 16 bits, starting with RG line (PFNC:  BayerRG10)
-        VmbPixelFormatBayerGB10               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x000E,  //!< Bayer-color, 10 bits in 16 bits, starting with GB line (PFNC:  BayerGB10)
-        VmbPixelFormatBayerBG10               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x000F,  //!< Bayer-color, 10 bits in 16 bits, starting with BG line (PFNC:  BayerBG10)
-        VmbPixelFormatBayerGR12               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0010,  //!< Bayer-color, 12 bits in 16 bits, starting with GR line (PFNC:  BayerGR12)
-        VmbPixelFormatBayerRG12               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0011,  //!< Bayer-color, 12 bits in 16 bits, starting with RG line (PFNC:  BayerRG12)
-        VmbPixelFormatBayerGB12               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0012,  //!< Bayer-color, 12 bits in 16 bits, starting with GB line (PFNC:  BayerGB12)
-        VmbPixelFormatBayerBG12               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0013,  //!< Bayer-color, 12 bits in 16 bits, starting with BG line (PFNC:  BayerBG12)
-        VmbPixelFormatBayerGR12Packed         = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x002A,  //!< Bayer-color, 2x12 bits in 24 bits, starting with GR line (GEV:BayerGR12Packed)
-        VmbPixelFormatBayerRG12Packed         = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x002B,  //!< Bayer-color, 2x12 bits in 24 bits, starting with RG line (GEV:BayerRG12Packed)
-        VmbPixelFormatBayerGB12Packed         = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x002C,  //!< Bayer-color, 2x12 bits in 24 bits, starting with GB line (GEV:BayerGB12Packed)
-        VmbPixelFormatBayerBG12Packed         = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x002D,  //!< Bayer-color, 2x12 bits in 24 bits, starting with BG line (GEV:BayerBG12Packed)
-        VmbPixelFormatBayerGR10p              = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy10Bit) | 0x0056,  //!< Bayer-color, 10 bits continuous packed, starting with GR line (PFNC:  BayerGR10p)
-        VmbPixelFormatBayerRG10p              = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy10Bit) | 0x0058,  //!< Bayer-color, 10 bits continuous packed, starting with RG line (PFNC:  BayerRG10p)
-        VmbPixelFormatBayerGB10p              = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy10Bit) | 0x0054,  //!< Bayer-color, 10 bits continuous packed, starting with GB line (PFNC:  BayerGB10p)
-        VmbPixelFormatBayerBG10p              = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy10Bit) | 0x0052,  //!< Bayer-color, 10 bits continuous packed, starting with BG line (PFNC:  BayerBG10p)
-        VmbPixelFormatBayerGR12p              = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x0057,  //!< Bayer-color, 12 bits continuous packed, starting with GR line (PFNC:  BayerGR12p)
-        VmbPixelFormatBayerRG12p              = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x0059,  //!< Bayer-color, 12 bits continuous packed, starting with RG line (PFNC:  BayerRG12p)
-        VmbPixelFormatBayerGB12p              = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x0055,  //!< Bayer-color, 12 bits continuous packed, starting with GB line (PFNC:  BayerGB12p)
-        VmbPixelFormatBayerBG12p              = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x0053,  //!< Bayer-color, 12 bits continuous packed, starting with BG line (PFNC: BayerBG12p)
-        VmbPixelFormatBayerGR16               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x002E,  //!< Bayer-color, 16 bits, starting with GR line (PFNC: BayerGR16)
-        VmbPixelFormatBayerRG16               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x002F,  //!< Bayer-color, 16 bits, starting with RG line (PFNC: BayerRG16)
-        VmbPixelFormatBayerGB16               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0030,  //!< Bayer-color, 16 bits, starting with GB line (PFNC: BayerGB16)
-        VmbPixelFormatBayerBG16               = static_cast<VmbUint8_t>(VmbPixelMono)  | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0031,  //!< Bayer-color, 16 bits, starting with BG line (PFNC: BayerBG16)
+        VmbPixelFormatBayerGR8                = VmbPixelMono  | VmbPixelOccupy8Bit  | 0x0008,  //!< Bayer-color, 8 bits, starting with GR line (PFNC:  BayerGR8)
+        VmbPixelFormatBayerRG8                = VmbPixelMono  | VmbPixelOccupy8Bit  | 0x0009,  //!< Bayer-color, 8 bits, starting with RG line (PFNC:  BayerRG8)
+        VmbPixelFormatBayerGB8                = VmbPixelMono  | VmbPixelOccupy8Bit  | 0x000A,  //!< Bayer-color, 8 bits, starting with GB line (PFNC:  BayerGB8)
+        VmbPixelFormatBayerBG8                = VmbPixelMono  | VmbPixelOccupy8Bit  | 0x000B,  //!< Bayer-color, 8 bits, starting with BG line (PFNC:  BayerBG8)
+        VmbPixelFormatBayerGR10               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x000C,  //!< Bayer-color, 10 bits in 16 bits, starting with GR line (PFNC:  BayerGR10)
+        VmbPixelFormatBayerRG10               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x000D,  //!< Bayer-color, 10 bits in 16 bits, starting with RG line (PFNC:  BayerRG10)
+        VmbPixelFormatBayerGB10               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x000E,  //!< Bayer-color, 10 bits in 16 bits, starting with GB line (PFNC:  BayerGB10)
+        VmbPixelFormatBayerBG10               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x000F,  //!< Bayer-color, 10 bits in 16 bits, starting with BG line (PFNC:  BayerBG10)
+        VmbPixelFormatBayerGR12               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x0010,  //!< Bayer-color, 12 bits in 16 bits, starting with GR line (PFNC:  BayerGR12)
+        VmbPixelFormatBayerRG12               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x0011,  //!< Bayer-color, 12 bits in 16 bits, starting with RG line (PFNC:  BayerRG12)
+        VmbPixelFormatBayerGB12               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x0012,  //!< Bayer-color, 12 bits in 16 bits, starting with GB line (PFNC:  BayerGB12)
+        VmbPixelFormatBayerBG12               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x0013,  //!< Bayer-color, 12 bits in 16 bits, starting with BG line (PFNC:  BayerBG12)
+        VmbPixelFormatBayerGR12Packed         = VmbPixelMono  | VmbPixelOccupy12Bit | 0x002A,  //!< Bayer-color, 2x12 bits in 24 bits, starting with GR line (GEV:BayerGR12Packed)
+        VmbPixelFormatBayerRG12Packed         = VmbPixelMono  | VmbPixelOccupy12Bit | 0x002B,  //!< Bayer-color, 2x12 bits in 24 bits, starting with RG line (GEV:BayerRG12Packed)
+        VmbPixelFormatBayerGB12Packed         = VmbPixelMono  | VmbPixelOccupy12Bit | 0x002C,  //!< Bayer-color, 2x12 bits in 24 bits, starting with GB line (GEV:BayerGB12Packed)
+        VmbPixelFormatBayerBG12Packed         = VmbPixelMono  | VmbPixelOccupy12Bit | 0x002D,  //!< Bayer-color, 2x12 bits in 24 bits, starting with BG line (GEV:BayerBG12Packed)
+        VmbPixelFormatBayerGR10p              = VmbPixelMono  | VmbPixelOccupy10Bit | 0x0056,  //!< Bayer-color, 10 bits continuous packed, starting with GR line (PFNC:  BayerGR10p)
+        VmbPixelFormatBayerRG10p              = VmbPixelMono  | VmbPixelOccupy10Bit | 0x0058,  //!< Bayer-color, 10 bits continuous packed, starting with RG line (PFNC:  BayerRG10p)
+        VmbPixelFormatBayerGB10p              = VmbPixelMono  | VmbPixelOccupy10Bit | 0x0054,  //!< Bayer-color, 10 bits continuous packed, starting with GB line (PFNC:  BayerGB10p)
+        VmbPixelFormatBayerBG10p              = VmbPixelMono  | VmbPixelOccupy10Bit | 0x0052,  //!< Bayer-color, 10 bits continuous packed, starting with BG line (PFNC:  BayerBG10p)
+        VmbPixelFormatBayerGR12p              = VmbPixelMono  | VmbPixelOccupy12Bit | 0x0057,  //!< Bayer-color, 12 bits continuous packed, starting with GR line (PFNC:  BayerGR12p)
+        VmbPixelFormatBayerRG12p              = VmbPixelMono  | VmbPixelOccupy12Bit | 0x0059,  //!< Bayer-color, 12 bits continuous packed, starting with RG line (PFNC:  BayerRG12p)
+        VmbPixelFormatBayerGB12p              = VmbPixelMono  | VmbPixelOccupy12Bit | 0x0055,  //!< Bayer-color, 12 bits continuous packed, starting with GB line (PFNC:  BayerGB12p)
+        VmbPixelFormatBayerBG12p              = VmbPixelMono  | VmbPixelOccupy12Bit | 0x0053,  //!< Bayer-color, 12 bits continuous packed, starting with BG line (PFNC: BayerBG12p)
+        VmbPixelFormatBayerGR16               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x002E,  //!< Bayer-color, 16 bits, starting with GR line (PFNC: BayerGR16)
+        VmbPixelFormatBayerRG16               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x002F,  //!< Bayer-color, 16 bits, starting with RG line (PFNC: BayerRG16)
+        VmbPixelFormatBayerGB16               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x0030,  //!< Bayer-color, 16 bits, starting with GB line (PFNC: BayerGB16)
+        VmbPixelFormatBayerBG16               = VmbPixelMono  | VmbPixelOccupy16Bit | 0x0031,  //!< Bayer-color, 16 bits, starting with BG line (PFNC: BayerBG16)
 
          // rgb formats
-        VmbPixelFormatRgb8                    = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy24Bit) | 0x0014,  //!< RGB, 8 bits x 3 (PFNC: RGB8)
-        VmbPixelFormatBgr8                    = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy24Bit) | 0x0015,  //!< BGR, 8 bits x 3 (PFNC: BGR8)
-        VmbPixelFormatRgb10                   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy48Bit) | 0x0018,  //!< RGB, 12 bits in 16 bits x 3 (PFNC: RGB12)
-        VmbPixelFormatBgr10                   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy48Bit) | 0x0019,  //!< RGB, 12 bits in 16 bits x 3 (PFNC: RGB12)
-        VmbPixelFormatRgb12                   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy48Bit) | 0x001A,  //!< RGB, 12 bits in 16 bits x 3 (PFNC: RGB12)
-        VmbPixelFormatBgr12                   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy48Bit) | 0x001B,  //!< RGB, 12 bits in 16 bits x 3 (PFNC: RGB12)
-        VmbPixelFormatRgb14                   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy48Bit) | 0x005E,  //!< RGB, 14 bits in 16 bits x 3 (PFNC: RGB12)
-        VmbPixelFormatBgr14                   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy48Bit) | 0x004A,  //!< RGB, 14 bits in 16 bits x 3 (PFNC: RGB12)
-        VmbPixelFormatRgb16                   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy48Bit) | 0x0033,  //!< RGB, 16 bits x 3 (PFNC: RGB16)
-        VmbPixelFormatBgr16                   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy48Bit) | 0x004B,  //!< RGB, 16 bits x 3 (PFNC: RGB16)
+        VmbPixelFormatRgb8                    = VmbPixelColor | VmbPixelOccupy24Bit | 0x0014,  //!< RGB, 8 bits x 3 (PFNC: RGB8)
+        VmbPixelFormatBgr8                    = VmbPixelColor | VmbPixelOccupy24Bit | 0x0015,  //!< BGR, 8 bits x 3 (PFNC: BGR8)
+        VmbPixelFormatRgb10                   = VmbPixelColor | VmbPixelOccupy48Bit | 0x0018,  //!< RGB, 12 bits in 16 bits x 3 (PFNC: RGB12)
+        VmbPixelFormatBgr10                   = VmbPixelColor | VmbPixelOccupy48Bit | 0x0019,  //!< RGB, 12 bits in 16 bits x 3 (PFNC: RGB12)
+        VmbPixelFormatRgb12                   = VmbPixelColor | VmbPixelOccupy48Bit | 0x001A,  //!< RGB, 12 bits in 16 bits x 3 (PFNC: RGB12)
+        VmbPixelFormatBgr12                   = VmbPixelColor | VmbPixelOccupy48Bit | 0x001B,  //!< RGB, 12 bits in 16 bits x 3 (PFNC: RGB12)
+        VmbPixelFormatRgb14                   = VmbPixelColor | VmbPixelOccupy48Bit | 0x005E,  //!< RGB, 14 bits in 16 bits x 3 (PFNC: RGB12)
+        VmbPixelFormatBgr14                   = VmbPixelColor | VmbPixelOccupy48Bit | 0x004A,  //!< RGB, 14 bits in 16 bits x 3 (PFNC: RGB12)
+        VmbPixelFormatRgb16                   = VmbPixelColor | VmbPixelOccupy48Bit | 0x0033,  //!< RGB, 16 bits x 3 (PFNC: RGB16)
+        VmbPixelFormatBgr16                   = VmbPixelColor | VmbPixelOccupy48Bit | 0x004B,  //!< RGB, 16 bits x 3 (PFNC: RGB16)
 
          // rgba formats
-        VmbPixelFormatArgb8                   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy32Bit) | 0x0016,  //!< ARGB, 8 bits x 4 (PFNC: RGBa8)
+        VmbPixelFormatArgb8                   = VmbPixelColor | VmbPixelOccupy32Bit | 0x0016,  //!< ARGB, 8 bits x 4 (PFNC: RGBa8)
         VmbPixelFormatRgba8                   = VmbPixelFormatArgb8,                           //!< RGBA, 8 bits x 4, legacy name
-        VmbPixelFormatBgra8                   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy32Bit) | 0x0017,  //!< BGRA, 8 bits x 4 (PFNC: BGRa8)
-        VmbPixelFormatRgba10                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy64Bit) | 0x005F,  //!< RGBA, 8 bits x 4, legacy name
-        VmbPixelFormatBgra10                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy64Bit) | 0x004C,  //!< RGBA, 8 bits x 4, legacy name
-        VmbPixelFormatRgba12                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy64Bit) | 0x0061,  //!< RGBA, 8 bits x 4, legacy name
-        VmbPixelFormatBgra12                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy64Bit) | 0x004E,  //!< RGBA, 8 bits x 4, legacy name
-        VmbPixelFormatRgba14                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy64Bit) | 0x0063,  //!< RGBA, 8 bits x 4, legacy name
-        VmbPixelFormatBgra14                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy64Bit) | 0x0050,  //!< RGBA, 8 bits x 4, legacy name
-        VmbPixelFormatRgba16                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy64Bit) | 0x0064,  //!< RGBA, 8 bits x 4, legacy name
-        VmbPixelFormatBgra16                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy64Bit) | 0x0051,  //!< RGBA, 8 bits x 4, legacy name
+        VmbPixelFormatBgra8                   = VmbPixelColor | VmbPixelOccupy32Bit | 0x0017,  //!< BGRA, 8 bits x 4 (PFNC: BGRa8)
+        VmbPixelFormatRgba10                  = VmbPixelColor | VmbPixelOccupy64Bit | 0x005F,  //!< RGBA, 8 bits x 4, legacy name
+        VmbPixelFormatBgra10                  = VmbPixelColor | VmbPixelOccupy64Bit | 0x004C,  //!< RGBA, 8 bits x 4, legacy name
+        VmbPixelFormatRgba12                  = VmbPixelColor | VmbPixelOccupy64Bit | 0x0061,  //!< RGBA, 8 bits x 4, legacy name
+        VmbPixelFormatBgra12                  = VmbPixelColor | VmbPixelOccupy64Bit | 0x004E,  //!< RGBA, 8 bits x 4, legacy name
+        VmbPixelFormatRgba14                  = VmbPixelColor | VmbPixelOccupy64Bit | 0x0063,  //!< RGBA, 8 bits x 4, legacy name
+        VmbPixelFormatBgra14                  = VmbPixelColor | VmbPixelOccupy64Bit | 0x0050,  //!< RGBA, 8 bits x 4, legacy name
+        VmbPixelFormatRgba16                  = VmbPixelColor | VmbPixelOccupy64Bit | 0x0064,  //!< RGBA, 8 bits x 4, legacy name
+        VmbPixelFormatBgra16                  = VmbPixelColor | VmbPixelOccupy64Bit | 0x0051,  //!< RGBA, 8 bits x 4, legacy name
 
          // yuv/ycbcr formats
-        VmbPixelFormatYuv411                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x001E,  //!< YUV 4:1:1 with 8 bits (PFNC: YUV411_8_UYYVYY, GEV:YUV411Packed)
-        VmbPixelFormatYuv422                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x001F,  //!< YUV 4:2:2 with 8 bits (PFNC: YUV422_8_UYVY, GEV:YUV422Packed)
-        VmbPixelFormatYuv444                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy24Bit) | 0x0020,  //!< YUV 4:4:4 with 8 bits (PFNC: YUV8_UYV, GEV:YUV444Packed)
-        VmbPixelFormatYuv422_8                = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0032,  //!< YUV 4:2:2 with 8 bits Channel order YUYV (PFNC: YUV422_8)
-        VmbPixelFormatYCbCr8_CbYCr            = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy24Bit) | 0x003A,  //!< YCbCr 4:4:4 with 8 bits (PFNC: YCbCr8_CbYCr) - identical to VmbPixelFormatYuv444
-        VmbPixelFormatYCbCr422_8              = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x003B,  //!< YCbCr 4:2:2 8-bit YCbYCr (PFNC: YCbCr422_8)
-        VmbPixelFormatYCbCr411_8_CbYYCrYY     = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x003C,  //!< YCbCr 4:1:1 with 8 bits (PFNC: YCbCr411_8_CbYYCrYY) - identical to VmbPixelFormatYuv411
-        VmbPixelFormatYCbCr601_8_CbYCr        = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy24Bit) | 0x003D,  //!< YCbCr601 4:4:4 8-bit CbYCrt (PFNC: YCbCr601_8_CbYCr)
-        VmbPixelFormatYCbCr601_422_8          = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x003E,  //!< YCbCr601 4:2:2 8-bit YCbYCr (PFNC: YCbCr601_422_8)
-        VmbPixelFormatYCbCr601_411_8_CbYYCrYY = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x003F,  //!< YCbCr601 4:1:1 8-bit CbYYCrYY (PFNC: YCbCr601_411_8_CbYYCrYY)
-        VmbPixelFormatYCbCr709_8_CbYCr        = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy24Bit) | 0x0040,  //!< YCbCr709 4:4:4 8-bit CbYCr (PFNC: YCbCr709_8_CbYCr)
-        VmbPixelFormatYCbCr709_422_8          = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0041,  //!< YCbCr709 4:2:2 8-bit YCbYCr (PFNC: YCbCr709_422_8)
-        VmbPixelFormatYCbCr709_411_8_CbYYCrYY = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x0042,  //!< YCbCr709 4:1:1 8-bit CbYYCrYY (PFNC: YCbCr709_411_8_CbYYCrYY)
-        VmbPixelFormatYCbCr422_8_CbYCrY       = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0043,  //!< YCbCr 4:2:2 with 8 bits (PFNC: YCbCr422_8_CbYCrY) - identical to VmbPixelFormatYuv422
-        VmbPixelFormatYCbCr601_422_8_CbYCrY   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0044,  //!< YCbCr601 4:2:2 8-bit CbYCrY (PFNC: YCbCr601_422_8_CbYCrY)
-        VmbPixelFormatYCbCr709_422_8_CbYCrY   = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy16Bit) | 0x0045,  //!< YCbCr709 4:2:2 8-bit CbYCrY (PFNC: YCbCr709_422_8_CbYCrY)
-        VmbPixelFormatYCbCr411_8              = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy12Bit) | 0x005A,  //!< YCbCr 4:1:1 8-bit YYCbYYCr (PFNC: YCbCr411_8)
-        VmbPixelFormatYCbCr8                  = static_cast<VmbUint8_t>(VmbPixelColor) | static_cast<VmbUint8_t>(VmbPixelOccupy24Bit) | 0x005B,  //!< YCbCr 4:4:4 8-bit YCbCr (PFNC: YCbCr8)
+        VmbPixelFormatYuv411                  = VmbPixelColor | VmbPixelOccupy12Bit | 0x001E,  //!< YUV 4:1:1 with 8 bits (PFNC: YUV411_8_UYYVYY, GEV:YUV411Packed)
+        VmbPixelFormatYuv422                  = VmbPixelColor | VmbPixelOccupy16Bit | 0x001F,  //!< YUV 4:2:2 with 8 bits (PFNC: YUV422_8_UYVY, GEV:YUV422Packed)
+        VmbPixelFormatYuv444                  = VmbPixelColor | VmbPixelOccupy24Bit | 0x0020,  //!< YUV 4:4:4 with 8 bits (PFNC: YUV8_UYV, GEV:YUV444Packed)
+        VmbPixelFormatYuv422_8                = VmbPixelColor | VmbPixelOccupy16Bit | 0x0032,  //!< YUV 4:2:2 with 8 bits Channel order YUYV (PFNC: YUV422_8)
+        VmbPixelFormatYCbCr8_CbYCr            = VmbPixelColor | VmbPixelOccupy24Bit | 0x003A,  //!< YCbCr 4:4:4 with 8 bits (PFNC: YCbCr8_CbYCr) - identical to VmbPixelFormatYuv444
+        VmbPixelFormatYCbCr422_8              = VmbPixelColor | VmbPixelOccupy16Bit | 0x003B,  //!< YCbCr 4:2:2 8-bit YCbYCr (PFNC: YCbCr422_8)
+        VmbPixelFormatYCbCr411_8_CbYYCrYY     = VmbPixelColor | VmbPixelOccupy12Bit | 0x003C,  //!< YCbCr 4:1:1 with 8 bits (PFNC: YCbCr411_8_CbYYCrYY) - identical to VmbPixelFormatYuv411
+        VmbPixelFormatYCbCr601_8_CbYCr        = VmbPixelColor | VmbPixelOccupy24Bit | 0x003D,  //!< YCbCr601 4:4:4 8-bit CbYCrt (PFNC: YCbCr601_8_CbYCr)
+        VmbPixelFormatYCbCr601_422_8          = VmbPixelColor | VmbPixelOccupy16Bit | 0x003E,  //!< YCbCr601 4:2:2 8-bit YCbYCr (PFNC: YCbCr601_422_8)
+        VmbPixelFormatYCbCr601_411_8_CbYYCrYY = VmbPixelColor | VmbPixelOccupy12Bit | 0x003F,  //!< YCbCr601 4:1:1 8-bit CbYYCrYY (PFNC: YCbCr601_411_8_CbYYCrYY)
+        VmbPixelFormatYCbCr709_8_CbYCr        = VmbPixelColor | VmbPixelOccupy24Bit | 0x0040,  //!< YCbCr709 4:4:4 8-bit CbYCr (PFNC: YCbCr709_8_CbYCr)
+        VmbPixelFormatYCbCr709_422_8          = VmbPixelColor | VmbPixelOccupy16Bit | 0x0041,  //!< YCbCr709 4:2:2 8-bit YCbYCr (PFNC: YCbCr709_422_8)
+        VmbPixelFormatYCbCr709_411_8_CbYYCrYY = VmbPixelColor | VmbPixelOccupy12Bit | 0x0042,  //!< YCbCr709 4:1:1 8-bit CbYYCrYY (PFNC: YCbCr709_411_8_CbYYCrYY)
+        VmbPixelFormatYCbCr422_8_CbYCrY       = VmbPixelColor | VmbPixelOccupy16Bit | 0x0043,  //!< YCbCr 4:2:2 with 8 bits (PFNC: YCbCr422_8_CbYCrY) - identical to VmbPixelFormatYuv422
+        VmbPixelFormatYCbCr601_422_8_CbYCrY   = VmbPixelColor | VmbPixelOccupy16Bit | 0x0044,  //!< YCbCr601 4:2:2 8-bit CbYCrY (PFNC: YCbCr601_422_8_CbYCrY)
+        VmbPixelFormatYCbCr709_422_8_CbYCrY   = VmbPixelColor | VmbPixelOccupy16Bit | 0x0045,  //!< YCbCr709 4:2:2 8-bit CbYCrY (PFNC: YCbCr709_422_8_CbYCrY)
+        VmbPixelFormatYCbCr411_8              = VmbPixelColor | VmbPixelOccupy12Bit | 0x005A,  //!< YCbCr 4:1:1 8-bit YYCbYYCr (PFNC: YCbCr411_8)
+        VmbPixelFormatYCbCr8                  = VmbPixelColor | VmbPixelOccupy24Bit | 0x005B,  //!< YCbCr 4:4:4 8-bit YCbCr (PFNC: YCbCr8)
 
         VmbPixelFormatLast,
     } VmbPixelFormatType;
-- 
GitLab