Added LocalCamera class.

git-svn-id: http://svn.zoneminder.com/svn/zm/trunk@394 e3e1d417-86f3-4887-817a-d78f3d33393f
This commit is contained in:
stan 2003-03-20 22:34:25 +00:00
parent 027329496e
commit 3443c3db7c
3 changed files with 238 additions and 205 deletions

View File

@ -1381,16 +1381,39 @@ void Image::DeColourise()
} }
} }
Camera::Camera( int p_device, int p_channel, int p_format, int p_width, int p_height, int p_colours, bool p_capture ) : device( p_device ), channel( p_channel ), format( p_format ), width( p_width), height( p_height ), colours( p_colours ), capture( p_capture ) Camera::Camera( int p_width, int p_height, int p_colours, bool p_capture ) : width( p_width), height( p_height ), colours( p_colours ), capture( p_capture )
{ {
if ( !camera_count++ && capture )
{
Initialise( device, channel, format, width, height, colours );
}
} }
Camera::~Camera() Camera::~Camera()
{
}
void Camera::Initialise()
{
}
void Camera::Terminate()
{
}
int LocalCamera::camera_count = 0;
int LocalCamera::m_cap_frame = 0;
int LocalCamera::m_sync_frame = 0;
video_mbuf LocalCamera::m_vmb;
video_mmap *LocalCamera::m_vmm;
int LocalCamera::m_videohandle;
unsigned char *LocalCamera::m_buffer=0;
LocalCamera::LocalCamera( int p_device, int p_channel, int p_format, int p_width, int p_height, int p_colours, bool p_capture ) : Camera( p_width, p_height, p_colours, p_capture ), device( p_device ), channel( p_channel ), format( p_format )
{
if ( !camera_count++ && capture )
{
Initialise();
}
}
LocalCamera::~LocalCamera()
{ {
if ( !--camera_count && capture ) if ( !--camera_count && capture )
{ {
@ -1398,7 +1421,165 @@ Camera::~Camera()
} }
} }
bool Camera::GetCurrentSettings( int device, char *output, bool verbose ) void LocalCamera::Initialise()
{
char device_path[64];
sprintf( device_path, "/dev/video%d", device );
if( (m_videohandle=open(device_path, O_RDONLY)) <=0 )
{
Error(( "Failed to open video device %s: %s\n", device_path, strerror(errno) ));
exit(-1);
}
struct video_window vid_win;
if( !ioctl( m_videohandle, VIDIOCGWIN, &vid_win))
{
Info(( "X:%d\n", vid_win.x ));
Info(( "Y:%d\n", vid_win.y ));
Info(( "W:%d\n", vid_win.width ));
Info(( "H:%d\n", vid_win.height ));
}
else
{
Error(( "Failed to get window attributes: %s\n", strerror(errno) ));
exit(-1);
}
vid_win.x = 0;
vid_win.y = 0;
vid_win.width = width;
vid_win.height = height;
if( ioctl( m_videohandle, VIDIOCSWIN, &vid_win ) )
{
Error(( "Failed to set window attributes: %s\n", strerror(errno) ));
if ( !ZM_STRICT_VIDEO_CONFIG ) exit(-1);
}
struct video_picture vid_pic;
if( !ioctl( m_videohandle, VIDIOCGPICT, &vid_pic))
{
Info(( "P:%d\n", vid_pic.palette ));
Info(( "D:%d\n", vid_pic.depth ));
Info(( "B:%d\n", vid_pic.brightness ));
Info(( "h:%d\n", vid_pic.hue ));
Info(( "Cl:%d\n", vid_pic.colour ));
Info(( "Cn:%d\n", vid_pic.contrast ));
}
else
{
Error(( "Failed to get picture attributes: %s\n", strerror(errno) ));
exit(-1);
}
if ( colours == 1 )
{
vid_pic.palette = VIDEO_PALETTE_GREY;
vid_pic.depth = 8;
}
else
{
vid_pic.palette = VIDEO_PALETTE_RGB24;
vid_pic.depth = 24;
}
if( ioctl( m_videohandle, VIDIOCSPICT, &vid_pic ) )
{
Error(( "Failed to set picture attributes: %s\n", strerror(errno) ));
if ( !ZM_STRICT_VIDEO_CONFIG ) exit(-1);
}
if(!ioctl(m_videohandle, VIDIOCGMBUF, &m_vmb))
{
m_vmm = new video_mmap[m_vmb.frames];
Info(( "vmb.frames = %d\n", m_vmb.frames ));
Info(( "vmb.size = %d\n", m_vmb.size ));
}
else
{
Error(( "Failed to setup memory: %s\n", strerror(errno) ));
exit(-1);
}
for(int loop=0; loop < m_vmb.frames; loop++)
{
m_vmm[loop].frame = loop;
m_vmm[loop].width = width;
m_vmm[loop].height = height;
m_vmm[loop].format = (colours==1?VIDEO_PALETTE_GREY:VIDEO_PALETTE_RGB24);
}
m_buffer = (unsigned char *)mmap(0, m_vmb.size, PROT_READ, MAP_SHARED, m_videohandle,0);
if( !((long)m_buffer > 0) )
{
Error(( "Could not mmap video: %s", strerror(errno) ));
exit(-1);
}
struct video_channel vid_src;
vid_src.channel = channel;
if( !ioctl( m_videohandle, VIDIOCGCHAN, &vid_src))
{
Info(( "C:%d\n", vid_src.channel ));
Info(( "F:%d\n", vid_src.norm ));
Info(( "Fl:%x\n", vid_src.flags ));
Info(( "T:%d\n", vid_src.type ));
}
else
{
Error(( "Failed to get camera source: %s\n", strerror(errno) ));
exit(-1);
}
//vid_src.norm = VIDEO_MODE_AUTO;
vid_src.norm = format;
vid_src.flags = 0;
vid_src.type = VIDEO_TYPE_CAMERA;
if(ioctl(m_videohandle, VIDIOCSCHAN, &vid_src))
{
Error(( "Failed to set camera source %d: %s\n", channel, strerror(errno) ));
if ( !ZM_STRICT_VIDEO_CONFIG ) exit(-1);
}
if( !ioctl( m_videohandle, VIDIOCGWIN, &vid_win))
{
Info(( "X:%d\n", vid_win.x ));
Info(( "Y:%d\n", vid_win.y ));
Info(( "W:%d\n", vid_win.width ));
Info(( "H:%d\n", vid_win.height ));
}
else
{
Error(( "Failed to get window data: %s\n", strerror(errno) ));
exit(-1);
}
if( !ioctl( m_videohandle, VIDIOCGPICT, &vid_pic))
{
Info(( "P:%d\n", vid_pic.palette ));
Info(( "D:%d\n", vid_pic.depth ));
Info(( "B:%d\n", vid_pic.brightness ));
Info(( "h:%d\n", vid_pic.hue ));
Info(( "Cl:%d\n", vid_pic.colour ));
Info(( "Cn:%d\n", vid_pic.contrast ));
}
else
{
Error(( "Failed to get window data: %s\n", strerror(errno) ));
exit(-1);
}
}
void LocalCamera::Terminate()
{
munmap((char*)m_buffer, m_vmb.size);
delete[] m_vmm;
close(m_videohandle);
}
bool LocalCamera::GetCurrentSettings( int device, char *output, bool verbose )
{ {
char device_path[64]; char device_path[64];
@ -1597,172 +1778,6 @@ bool Camera::GetCurrentSettings( int device, char *output, bool verbose )
return( true ); return( true );
} }
void Camera::Initialise( int device, int channel, int format, int width, int height, int colours )
{
char device_path[64];
sprintf( device_path, "/dev/video%d", device );
if( (m_videohandle=open(device_path, O_RDONLY)) <=0 )
{
Error(( "Failed to open video device %s: %s\n", device_path, strerror(errno) ));
exit(-1);
}
struct video_window vid_win;
if( !ioctl( m_videohandle, VIDIOCGWIN, &vid_win))
{
Info(( "X:%d\n", vid_win.x ));
Info(( "Y:%d\n", vid_win.y ));
Info(( "W:%d\n", vid_win.width ));
Info(( "H:%d\n", vid_win.height ));
}
else
{
Error(( "Failed to get window attributes: %s\n", strerror(errno) ));
exit(-1);
}
vid_win.x = 0;
vid_win.y = 0;
vid_win.width = width;
vid_win.height = height;
if( ioctl( m_videohandle, VIDIOCSWIN, &vid_win ) )
{
Error(( "Failed to set window attributes: %s\n", strerror(errno) ));
if ( !ZM_STRICT_VIDEO_CONFIG ) exit(-1);
}
struct video_picture vid_pic;
if( !ioctl( m_videohandle, VIDIOCGPICT, &vid_pic))
{
Info(( "P:%d\n", vid_pic.palette ));
Info(( "D:%d\n", vid_pic.depth ));
Info(( "B:%d\n", vid_pic.brightness ));
Info(( "h:%d\n", vid_pic.hue ));
Info(( "Cl:%d\n", vid_pic.colour ));
Info(( "Cn:%d\n", vid_pic.contrast ));
}
else
{
Error(( "Failed to get picture attributes: %s\n", strerror(errno) ));
exit(-1);
}
if ( colours == 1 )
{
vid_pic.palette = VIDEO_PALETTE_GREY;
vid_pic.depth = 8;
}
else
{
vid_pic.palette = VIDEO_PALETTE_RGB24;
vid_pic.depth = 24;
}
if( ioctl( m_videohandle, VIDIOCSPICT, &vid_pic ) )
{
Error(( "Failed to set picture attributes: %s\n", strerror(errno) ));
if ( !ZM_STRICT_VIDEO_CONFIG ) exit(-1);
}
if(!ioctl(m_videohandle, VIDIOCGMBUF, &m_vmb))
{
m_vmm = new video_mmap[m_vmb.frames];
Info(( "vmb.frames = %d\n", m_vmb.frames ));
Info(( "vmb.size = %d\n", m_vmb.size ));
}
else
{
Error(( "Failed to setup memory: %s\n", strerror(errno) ));
exit(-1);
}
for(int loop=0; loop < m_vmb.frames; loop++)
{
m_vmm[loop].frame = loop;
m_vmm[loop].width = width;
m_vmm[loop].height = height;
m_vmm[loop].format = (colours==1?VIDEO_PALETTE_GREY:VIDEO_PALETTE_RGB24);
}
m_buffer = (unsigned char *)mmap(0, m_vmb.size, PROT_READ, MAP_SHARED, m_videohandle,0);
if( !((long)m_buffer > 0) )
{
Error(( "Could not mmap video: %s", strerror(errno) ));
exit(-1);
}
struct video_channel vid_src;
vid_src.channel = channel;
if( !ioctl( m_videohandle, VIDIOCGCHAN, &vid_src))
{
Info(( "C:%d\n", vid_src.channel ));
Info(( "F:%d\n", vid_src.norm ));
Info(( "Fl:%x\n", vid_src.flags ));
Info(( "T:%d\n", vid_src.type ));
}
else
{
Error(( "Failed to get camera source: %s\n", strerror(errno) ));
exit(-1);
}
//vid_src.norm = VIDEO_MODE_AUTO;
vid_src.norm = format;
vid_src.flags = 0;
vid_src.type = VIDEO_TYPE_CAMERA;
if(ioctl(m_videohandle, VIDIOCSCHAN, &vid_src))
{
Error(( "Failed to set camera source %d: %s\n", channel, strerror(errno) ));
if ( !ZM_STRICT_VIDEO_CONFIG ) exit(-1);
}
if( !ioctl( m_videohandle, VIDIOCGWIN, &vid_win))
{
Info(( "X:%d\n", vid_win.x ));
Info(( "Y:%d\n", vid_win.y ));
Info(( "W:%d\n", vid_win.width ));
Info(( "H:%d\n", vid_win.height ));
}
else
{
Error(( "Failed to get window data: %s\n", strerror(errno) ));
exit(-1);
}
if( !ioctl( m_videohandle, VIDIOCGPICT, &vid_pic))
{
Info(( "P:%d\n", vid_pic.palette ));
Info(( "D:%d\n", vid_pic.depth ));
Info(( "B:%d\n", vid_pic.brightness ));
Info(( "h:%d\n", vid_pic.hue ));
Info(( "Cl:%d\n", vid_pic.colour ));
Info(( "Cn:%d\n", vid_pic.contrast ));
}
else
{
Error(( "Failed to get window data: %s\n", strerror(errno) ));
exit(-1);
}
}
void Camera::Terminate()
{
munmap((char*)m_buffer, m_vmb.size);
delete[] m_vmm;
close(m_videohandle);
}
int Camera::m_cap_frame = 0;
int Camera::m_sync_frame = 0;
video_mbuf Camera::m_vmb;
video_mmap *Camera::m_vmm;
int Camera::m_videohandle;
unsigned char *Camera::m_buffer=0;
int Camera::camera_count = 0;
Event::Event( Monitor *p_monitor, struct timeval p_start_time ) : monitor( p_monitor ), start_time( p_start_time ) Event::Event( Monitor *p_monitor, struct timeval p_start_time ) : monitor( p_monitor ), start_time( p_start_time )
{ {
static char sql[256]; static char sql[256];
@ -1914,7 +1929,7 @@ Monitor::Monitor( int p_id, char *p_name, int p_function, int p_device, int p_ch
strcpy( label_format, p_label_format ); strcpy( label_format, p_label_format );
camera = new Camera( p_device, p_channel, p_format, p_width, p_height, p_colours, p_capture ); camera = new LocalCamera( p_device, p_channel, p_format, p_width, p_height, p_colours, p_capture );
fps = 0.0; fps = 0.0;
event_count = 0; event_count = 0;
@ -2431,10 +2446,10 @@ bool Monitor::DumpSettings( char *output, bool verbose )
sprintf( output+strlen(output), "Id : %d\n", id ); sprintf( output+strlen(output), "Id : %d\n", id );
sprintf( output+strlen(output), "Name : %s\n", name ); sprintf( output+strlen(output), "Name : %s\n", name );
sprintf( output+strlen(output), "Device : %d\n", camera->Device() ); sprintf( output+strlen(output), "Device : %d\n", ((LocalCamera *)camera)->Device() );
sprintf( output+strlen(output), "Channel : %d\n", camera->Channel() ); sprintf( output+strlen(output), "Channel : %d\n", ((LocalCamera *)camera)->Channel() );
sprintf( output+strlen(output), "Format : %d\n", camera->Format() ); sprintf( output+strlen(output), "Format : %d\n", ((LocalCamera *)camera)->Format() );
sprintf( output+strlen(output), "Width : %d\n", camera->Width() ); sprintf( output+strlen(output), "Width : %d\n", ((LocalCamera *)camera)->Width() );
sprintf( output+strlen(output), "Height : %d\n", camera->Height() ); sprintf( output+strlen(output), "Height : %d\n", camera->Height() );
sprintf( output+strlen(output), "Colour Depth : %d\n", 8*camera->Colours() ); sprintf( output+strlen(output), "Colour Depth : %d\n", 8*camera->Colours() );
sprintf( output+strlen(output), "Label Format : %s\n", label_format ); sprintf( output+strlen(output), "Label Format : %s\n", label_format );

View File

@ -347,14 +347,45 @@ public:
class Camera class Camera
{ {
protected: protected:
int device;
int channel;
int format;
unsigned int width; unsigned int width;
unsigned int height; unsigned int height;
unsigned int colours; unsigned int colours;
bool capture; bool capture;
public:
Camera( int p_width, int p_height, int p_colours, bool p_capture=true );
~Camera();
unsigned int Width() const { return( width ); }
unsigned int Height() const { return( height ); }
unsigned int Colours() const { return( colours ); }
unsigned int ImageSize() const { return( colours*width*height ); }
virtual void Initialise();
void Terminate();
virtual void PreCapture()=0;
virtual unsigned char *PostCapture()=0;
virtual void PostCapture( Image &image )=0;
inline unsigned char *Capture()
{
PreCapture();
return( PostCapture() );
}
inline void Capture( Image &image )
{
PreCapture();
return( PostCapture( image ) );
}
};
class LocalCamera : public Camera
{
protected:
int device;
int channel;
int format;
protected: protected:
static int m_cap_frame; static int m_cap_frame;
static int m_sync_frame; static int m_sync_frame;
@ -365,21 +396,18 @@ protected:
static int camera_count; static int camera_count;
public: public:
Camera( int p_device, int p_channel, int p_format, int p_width, int p_height, int p_colours, bool p_capture=true ); LocalCamera( int p_device, int p_channel, int p_format, int p_width, int p_height, int p_colours, bool p_capture=true );
~Camera(); ~LocalCamera();
unsigned int Device() const { return( device ); } unsigned int Device() const { return( device ); }
unsigned int Channel() const { return( channel ); } unsigned int Channel() const { return( channel ); }
unsigned int Format() const { return( format ); } unsigned int Format() const { return( format ); }
unsigned int Width() const { return( width ); }
unsigned int Height() const { return( height ); }
unsigned int Colours() const { return( colours ); }
unsigned int ImageSize() const { return( colours*width*height ); }
static bool Camera::GetCurrentSettings( int device, char *output, bool verbose ); static bool GetCurrentSettings( int device, char *output, bool verbose );
static void Initialise( int device, int channel, int format, int width, int height, int colours );
void Terminate();
inline void PreCapture() virtual void Initialise();
virtual void Terminate();
virtual void PreCapture()
{ {
//Info(( "%s: Capturing image\n", id )); //Info(( "%s: Capturing image\n", id ));
@ -405,7 +433,7 @@ public:
} }
m_cap_frame = (m_cap_frame+1)%m_vmb.frames; m_cap_frame = (m_cap_frame+1)%m_vmb.frames;
} }
inline unsigned char *PostCapture() virtual unsigned char *PostCapture()
{ {
//Info(( "%s: Capturing image\n", id )); //Info(( "%s: Capturing image\n", id ));
@ -419,7 +447,7 @@ public:
return( buffer ); return( buffer );
} }
inline void PostCapture( Image &image ) virtual void PostCapture( Image &image )
{ {
//Info(( "%s: Capturing image\n", id )); //Info(( "%s: Capturing image\n", id ));
@ -433,16 +461,6 @@ public:
image.Assign( width, height, colours, buffer ); image.Assign( width, height, colours, buffer );
} }
inline unsigned char *Capture()
{
PreCapture();
return( PostCapture() );
}
inline void Capture( Image &image )
{
PreCapture();
return( PostCapture( image ) );
}
}; };
class Monitor; class Monitor;

View File

@ -204,7 +204,7 @@ int main( int argc, char *argv[] )
if ( dev_id >= 0 ) if ( dev_id >= 0 )
{ {
char vid_string[1024] = ""; char vid_string[1024] = "";
bool ok = Camera::GetCurrentSettings( dev_id, vid_string, verbose ); bool ok = LocalCamera::GetCurrentSettings( dev_id, vid_string, verbose );
printf( "%s", vid_string ); printf( "%s", vid_string );
exit( ok?0:-1 ); exit( ok?0:-1 );
} }