2014-01-30 13:35:29 +01:00
// QT includes
# include <QCoreApplication>
# include <QImage>
2016-08-28 15:10:43 +02:00
# include <commandline/Parser.h>
2018-12-30 22:07:53 +01:00
# include <flatbufserver/FlatBufferConnection.h>
2014-01-30 13:35:29 +01:00
# include "X11Wrapper.h"
2016-03-10 12:01:10 +01:00
# include "HyperionConfig.h"
2014-01-30 13:35:29 +01:00
2018-12-30 22:07:53 +01:00
// ssdp discover
# include <ssdp/SSDPDiscover.h>
2016-08-28 15:10:43 +02:00
using namespace commandline ;
2014-01-30 13:35:29 +01:00
// save the image as screenshot
2016-08-28 15:10:43 +02:00
void saveScreenshot ( QString filename , const Image < ColorRgb > & image )
2014-01-30 13:35:29 +01:00
{
2016-05-26 23:44:27 +02:00
// store as PNG
QImage pngImage ( ( const uint8_t * ) image . memptr ( ) , image . width ( ) , image . height ( ) , 3 * image . width ( ) , QImage : : Format_RGB888 ) ;
pngImage . save ( filename ) ;
2014-01-30 13:35:29 +01:00
}
int main ( int argc , char * * argv )
{
2016-06-07 22:24:29 +02:00
std : : cout
< < " hyperion-x11: " < < std : : endl
2016-06-24 23:22:31 +02:00
< < " \t Version : " < < HYPERION_VERSION < < " ( " < < HYPERION_BUILD_ID < < " ) " < < std : : endl
2016-06-07 22:24:29 +02:00
< < " \t build time: " < < __DATE__ < < " " < < __TIME__ < < std : : endl ;
2016-05-26 23:44:27 +02:00
QCoreApplication app ( argc , argv ) ;
try
{
// create the option parser and initialize all parameters
2018-12-30 22:07:53 +01:00
Parser parser ( " X11 capture application for Hyperion. Will automatically search a Hyperion server if -a option isn't used. Please note that if you have more than one server running it's more or less random which one will be used. " ) ;
2016-08-28 15:10:43 +02:00
2016-09-17 00:40:29 +02:00
IntOption & argFps = parser . add < IntOption > ( ' f ' , " framerate " , " Capture frame rate [default: %1] " , " 10 " ) ;
IntOption & argCropWidth = parser . add < IntOption > ( 0x0 , " crop-width " , " Number of pixels to crop from the left and right sides of the picture before decimation [default: %1] " , " 0 " ) ;
IntOption & argCropHeight = parser . add < IntOption > ( 0x0 , " crop-height " , " Number of pixels to crop from the top and the bottom of the picture before decimation [default: %1] " , " 0 " ) ;
IntOption & argCropLeft = parser . add < IntOption > ( 0x0 , " crop-left " , " Number of pixels to crop from the left of the picture before decimation (overrides --crop-width) " ) ;
IntOption & argCropRight = parser . add < IntOption > ( 0x0 , " crop-right " , " Number of pixels to crop from the right of the picture before decimation (overrides --crop-width) " ) ;
IntOption & argCropTop = parser . add < IntOption > ( 0x0 , " crop-top " , " Number of pixels to crop from the top of the picture before decimation (overrides --crop-height) " ) ;
IntOption & argCropBottom = parser . add < IntOption > ( 0x0 , " crop-bottom " , " Number of pixels to crop from the bottom of the picture before decimation (overrides --crop-height) " ) ;
2018-12-31 15:48:29 +01:00
IntOption & argSizeDecimation = parser . add < IntOption > ( ' s ' , " size-decimator " , " Decimation factor for the output size [default=%1] " , " 8 " , 1 ) ;
2016-09-17 00:40:29 +02:00
BooleanOption & argScreenshot = parser . add < BooleanOption > ( 0x0 , " screenshot " , " Take a single screenshot, save it to file and quit " ) ;
2019-02-05 19:55:48 +01:00
Option & argAddress = parser . add < Option > ( ' a ' , " address " , " Set the address of the hyperion server [default: %1] " , " 127.0.0.1:19400 " ) ;
2017-01-17 21:53:35 +01:00
IntOption & argPriority = parser . add < IntOption > ( ' p ' , " priority " , " Use the provided priority channel (suggested 100-199) [default: %1] " , " 150 " ) ;
2016-09-17 00:40:29 +02:00
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-05-26 23:44:27 +02:00
// parse all options
2016-08-28 15:10:43 +02:00
parser . process ( app ) ;
2016-05-26 23:44:27 +02: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-05-26 23:44:27 +02:00
{
2016-08-28 15:10:43 +02:00
parser . showHelp ( 0 ) ;
2016-05-26 23:44:27 +02:00
}
// Create the X11 grabbing stuff
X11Wrapper x11Wrapper (
2016-08-28 15:10:43 +02:00
1000 / argFps . getInt ( parser ) ,
parser . isSet ( argCropLeft ) ? argCropLeft . getInt ( parser ) : argCropWidth . getInt ( parser ) ,
parser . isSet ( argCropRight ) ? argCropRight . getInt ( parser ) : argCropWidth . getInt ( parser ) ,
parser . isSet ( argCropTop ) ? argCropTop . getInt ( parser ) : argCropHeight . getInt ( parser ) ,
parser . isSet ( argCropBottom ) ? argCropBottom . getInt ( parser ) : argCropHeight . getInt ( parser ) ,
2018-12-30 22:07:53 +01:00
argSizeDecimation . getInt ( parser ) ) ; // decimation
2017-11-22 00:52:55 +01:00
2016-01-21 16:42:30 +01:00
if ( ! x11Wrapper . displayInit ( ) )
return - 1 ;
2014-11-21 21:24:33 +01:00
2016-08-28 15:10:43 +02:00
if ( parser . isSet ( argScreenshot ) )
2016-05-26 23:44:27 +02:00
{
// Capture a single screenshot and finish
const Image < ColorRgb > & screenshot = x11Wrapper . getScreenshot ( ) ;
saveScreenshot ( " screenshot.png " , screenshot ) ;
}
else
{
2018-12-30 22:07:53 +01:00
// server searching by ssdp
2019-08-17 09:44:57 +02:00
QString address = argAddress . value ( parser ) ;
if ( argAddress . value ( parser ) = = " 127.0.0.1:19400 " )
2018-12-30 22:07:53 +01:00
{
SSDPDiscover discover ;
address = discover . getFirstService ( STY_FLATBUFSERVER ) ;
if ( address . isEmpty ( ) )
{
address = argAddress . value ( parser ) ;
}
}
// Create the Flatbuf-connection
FlatBufferConnection flatbuf ( " X11 Standalone " , address , argPriority . getInt ( parser ) , parser . isSet ( argSkipReply ) ) ;
// Connect the screen capturing to flatbuf connection processing
QObject : : connect ( & x11Wrapper , SIGNAL ( sig_screenshot ( const Image < ColorRgb > & ) ) , & flatbuf , SLOT ( setImage ( Image < ColorRgb > ) ) ) ;
2016-05-26 23:44:27 +02:00
// Start the capturing
x11Wrapper . start ( ) ;
// Start the application
app . exec ( ) ;
}
}
catch ( const std : : runtime_error & e )
{
// An error occured. Display error and quit
2017-08-12 07:55:32 +02:00
Error ( Logger : : getInstance ( " X11GRABBER " ) , " %s " , e . what ( ) ) ;
2016-05-26 23:44:27 +02:00
return - 1 ;
}
return 0 ;
2014-01-30 13:35:29 +01:00
}