2016-03-09 07:03:17 +01:00
// QT includes
# include <QCoreApplication>
# include <QImage>
# include <protoserver/ProtoConnectionWrapper.h>
# include "FramebufferWrapper.h"
2016-08-28 15:10:43 +02:00
# include <commandline/Parser.h>
2016-03-09 07:03:17 +01:00
2016-08-28 15:10:43 +02:00
using namespace commandline ;
2016-03-09 07:03:17 +01:00
// save the image as screenshot
2016-08-28 15:10:43 +02:00
void saveScreenshot ( QString filename , const Image < ColorRgb > & image )
2016-03-09 07:03:17 +01:00
{
// store as PNG
QImage pngImage ( ( const uint8_t * ) image . memptr ( ) , image . width ( ) , image . height ( ) , 3 * image . width ( ) , QImage : : Format_RGB888 ) ;
pngImage . save ( filename ) ;
}
int main ( int argc , char * * argv )
{
QCoreApplication app ( argc , argv ) ;
try
{
// create the option parser and initialize all parameters
2016-08-28 15:10:43 +02:00
Parser parser ( " FrameBuffer capture application for Hyperion " ) ;
2016-09-17 00:40:29 +02:00
Option & argDevice = parser . add < Option > ( ' d ' , " device " , " Set the video device [default: %1] " , " /dev/video0 " ) ;
IntOption & argFps = parser . add < IntOption > ( ' f ' , " framerate " , " Capture frame rate [default: %1] " , " 10 " ) ;
IntOption & argWidth = parser . add < IntOption > ( 0x0 , " width " , " Width of the captured image [default: %1] " , " 160 " , 160 , 4096 ) ;
IntOption & argHeight = parser . add < IntOption > ( 0x0 , " height " , " Height of the captured image [default: %1] " , " 160 " , 160 , 4096 ) ;
BooleanOption & argScreenshot = parser . add < BooleanOption > ( 0x0 , " screenshot " , " Take a single screenshot, save it to file and quit " ) ;
Option & argAddress = parser . add < Option > ( ' a ' , " address " , " Set the address of the hyperion server [default: %1] " , " 127.0.0.1:19445 " ) ;
IntOption & argPriority = parser . add < IntOption > ( ' p ' , " priority " , " Use the provided priority channel (the lower the number, the higher the priority) [default: %1] " , " 800 " ) ;
BooleanOption & argSkipReply = parser . add < BooleanOption > ( 0x0 , " skip-reply " , " Do not receive and check reply messages from Hyperion " ) ;
BooleanOption & argHelp = parser . add < BooleanOption > ( ' h ' , " help " , " Show this help message and exit " ) ;
2016-03-09 07:03:17 +01:00
// parse all options
2016-08-28 15:10:43 +02:00
parser . process ( app ) ;
2016-03-09 07:03:17 +01:00
// check if we need to display the usage. exit if we do.
2016-08-28 15:10:43 +02:00
if ( parser . isSet ( argHelp ) )
2016-03-09 07:03:17 +01:00
{
2016-08-28 15:10:43 +02:00
parser . showHelp ( 0 ) ;
2016-03-09 07:03:17 +01:00
}
2016-08-28 15:10:43 +02:00
FramebufferWrapper fbWrapper ( argDevice . getStdString ( parser ) , argWidth . getInt ( parser ) , argHeight . getInt ( parser ) , 1000 / argFps . getInt ( parser ) ) ;
2016-03-09 07:03:17 +01:00
2016-08-28 15:10:43 +02:00
if ( parser . isSet ( argScreenshot ) )
2016-03-09 07:03:17 +01:00
{
// Capture a single screenshot and finish
const Image < ColorRgb > & screenshot = fbWrapper . getScreenshot ( ) ;
saveScreenshot ( " screenshot.png " , screenshot ) ;
}
else
{
// Create the Proto-connection with hyperiond
2016-08-28 15:10:43 +02:00
ProtoConnectionWrapper protoWrapper ( argAddress . value ( parser ) , argPriority . getInt ( parser ) , 1000 , parser . isSet ( argSkipReply ) ) ;
2016-03-09 07:03:17 +01:00
// Connect the screen capturing to the proto processing
QObject : : connect ( & fbWrapper , SIGNAL ( sig_screenshot ( const Image < ColorRgb > & ) ) , & protoWrapper , SLOT ( receiveImage ( Image < ColorRgb > ) ) ) ;
// Start the capturing
fbWrapper . start ( ) ;
// Start the application
app . exec ( ) ;
}
}
catch ( const std : : runtime_error & e )
{
// An error occured. Display error and quit
2016-07-12 15:13:06 +02:00
Error ( Logger : : getInstance ( " FRAMEBUFFER " ) , " %s " , e . what ( ) ) ;
2016-03-09 07:03:17 +01:00
return - 1 ;
}
return 0 ;
}