diff options
Diffstat (limited to 'grab.cpp')
-rw-r--r-- | grab.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/grab.cpp b/grab.cpp new file mode 100644 index 0000000..9211b92 --- /dev/null +++ b/grab.cpp @@ -0,0 +1,69 @@ +#include <cstdlib> +#include <vdr/device.h> +#include "grab.h" + +namespace vdrlive { + +using namespace std; + +class GrabImageTask: public StickyTask +{ +public: + explicit GrabImageTask( int quality = 80, int width = 320, int height = 240 ) + : m_quality( quality ) + , m_width( width ) + , m_height( height ) + {} + +private: + int m_quality; + int m_width; + int m_height; + + virtual void Action(); +}; + +void GrabImageTask::Action() +{ + cDevice* device = cDevice::PrimaryDevice(); + if ( device == 0 ) { + SetError( tr("Couldn't aquire primary device") ); + return; + } + + int size = 0; + uchar* image = device->GrabImage( size, true, m_quality, m_width, m_height ); + if ( image == 0 ) { + SetError( tr("Couldn't grab image from primary device") ); + return; + } + + LiveGrabImageManager().PutImage( reinterpret_cast< char* >( image ), size ); +} + +GrabImageManager::GrabImageManager() + : m_task( new GrabImageTask ) + , m_image( 0, &free ) + , m_size( 0 ) +{ +} + +GrabImageInfo GrabImageManager::GetImage() const +{ + cMutexLock lock( &LiveTaskManager() ); + return make_pair( m_image, m_size ); +} + +void GrabImageManager::PutImage( char* image, int size ) +{ + m_image.reset( image, &free ); + m_size = size; +} + +GrabImageManager& LiveGrabImageManager() +{ + static GrabImageManager instance; + return instance; +} + +} // namespace vdrlive |