<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,7 +1,10 @@
-CFLAGS= -Wunused -O3 -funroll-loops -fno-rtti -fomit-frame-pointer -ffast-math -fno-stack-protector -ffunction-sections
-LFLAGS= -lpthread -lX11 
+CFLAGS= -w -O3 -funroll-loops -fno-rtti -fomit-frame-pointer -ffast-math -fno-stack-protector -ffunction-sections
+LFLAGS=
 
 all:
 	g++ *.cpp -o kerbyd $(CFLAGS) $(LFLAGS)
+install:
+	#For testing purpose only, do not run this !
+	scp -r ../kerby root@ganryu:/root
 clean:
 	rm -f *.o kerbyd</diff>
      <filename>Makefile</filename>
    </modified>
    <modified>
      <diff>@@ -20,119 +20,62 @@
  ***************************************************************************/
 #include &quot;analyzer.h&quot;
 
-void Analyzer::convert( kb_video_buffer_t *frame, CImg&lt;byte&gt; *image ){
-	int x,y;
-	
-	for( x = 0; x &lt; frame-&gt;width; x++ ){
-		for( y = 0; y &lt; frame-&gt;height; y++ ){
-			*image-&gt;ptr( x, y, 0 ) = frame-&gt;data[ (y * frame-&gt;width + x) * frame-&gt;depth + 0 ];	
-			*image-&gt;ptr( x, y, 1 ) = frame-&gt;data[ (y * frame-&gt;width + x) * frame-&gt;depth + 1 ];	
-			*image-&gt;ptr( x, y, 2 ) = frame-&gt;data[ (y * frame-&gt;width + x) * frame-&gt;depth + 2 ];	
-		}	
-	}	
-}
-
-void Analyzer::convert( kb_video_buffer_t* frame ){
-	this-&gt;convert( frame, this-&gt;m_masterframe );
-}
-
-CImg&lt;byte&gt; Analyzer::quadrant( CImg&lt;byte&gt; *image, int xt, int yt, int xb, int yb ){
-	CImg&lt;byte&gt; quad( xb - xt, yb - yt, 1, 3 );	
-	
-	int xq,yq,xi,yi;
-	
-	for( xi = xt, xq = 0; xi &lt; xb; xi++, xq++ ){
-    	for( yi = yt, yq = 0; yi &lt; yb; yi++, yq++ ){
-			*quad.ptr( xq, yq, 0 ) = *image-&gt;ptr( xi, yi, 0 );	
-			*quad.ptr( xq, yq, 1 ) = *image-&gt;ptr( xi, yi, 1 );	
-			*quad.ptr( xq, yq, 2 ) = *image-&gt;ptr( xi, yi, 2 );	
-		}
-	}
-	
-	return quad;
-}
-
-CImg&lt;byte&gt; Analyzer::quadrant( int xt, int yt, int xb, int yb ){
-	return this-&gt;quadrant( this-&gt;m_masterframe, xt, yt, xb, yb );
-}
-
-double Analyzer::delta( short total, short value ){
-	double a = total,
-           b = value;
-
-	if( total &lt; value ){
-		a = value;
-		b = total;
-	}
-
-    return ((a - b) / b) * 100.0f;
-}
-
-double Analyzer::delta( CImg&lt;byte&gt; *quadrant, int xt, int yt, int xb, int yb ){
-	CImg&lt;byte&gt; masterquadrant = this-&gt;quadrant( xt, yt, xb, yb );
-    double     delta = 0.0f;
-
-    int h = yb - yt,
-        w = xb - xt,
-        y, x;
-    
-    double rdelta,gdelta,bdelta;
-
-	for( y = 0; y &lt; h; y++ ){
-		for( x = 0; x &lt; w; x++ ){
-			rdelta = this-&gt;delta( *masterquadrant.ptr( x, y, 0 ), *quadrant-&gt;ptr( x, y, 0 ) );
-        	gdelta = this-&gt;delta( *masterquadrant.ptr( x, y, 1 ), *quadrant-&gt;ptr( x, y, 1 ) );
-			bdelta = this-&gt;delta( *masterquadrant.ptr( x, y, 2 ), *quadrant-&gt;ptr( x, y, 2 ) );
-        	
-        	delta += ((rdelta + gdelta + bdelta) / 3.0f);
-		}
-	}
-
-	return (delta / (w * h));
-}
-
-Analyzer::Analyzer( uint width, uint height, uint depth, uint quadrant_size, double threshold ){
-	this-&gt;m_masterframe   = new CImg&lt;byte&gt;( width, height, 1, depth );	
-	this-&gt;m_frame		  = new CImg&lt;byte&gt;( width, height, 1, depth );	
-	this-&gt;m_quadrant_size = quadrant_size;
-	this-&gt;m_threshold	  = threshold;
-	this-&gt;m_quadrants     = (width * height) / this-&gt;m_quadrant_size;
+Analyzer::Analyzer( kb_video_driver_t *driver, uint width, uint height, uint depth, uint quadrant_size, double threshold ){
+	m_driver        = driver;
+	m_masterframe   = driver-&gt;create( width, height, depth );	
+	m_quadrant_size = quadrant_size;
+	m_threshold	    = threshold;
+	m_quadrants     = (width * height) / this-&gt;m_quadrant_size;
 }
 
 Analyzer::~Analyzer(){
-	delete this-&gt;m_masterframe;
-	delete this-&gt;m_frame;
+	free( m_masterframe-&gt;data );
+	free( m_masterframe );
 }
 
 double Analyzer::update( kb_video_buffer_t *frame ){
-	CImg&lt;byte&gt; iframe( frame-&gt;width, frame-&gt;height, 1, frame-&gt;depth ), 
-			   quadrant;
-	int        x, y, xt, yt, xb, yb, count = 0;
-	double 	   qdelta;
-		
-	this-&gt;convert( frame, &amp;iframe );
+	int        x, y,           // main coordinates 
+			   xt, yt, xb, yb, // top-x, top-y, bottom-x and bottom-x of a quadrant
+			   xq, yq,         // quadrants coordinates
+			   count = 0;      // relevant quadrants counter
 	
-	this-&gt;m_frame-&gt;swap(iframe);
+	kb_rgb_t   mpixel,         // master pixel
+			   fpixel;         // frame pixel
 	
-	for( x = 0; x &lt; iframe.width; x += this-&gt;m_quadrant_size ){
-		for( y = 0; y &lt; iframe.height; y += this-&gt;m_quadrant_size ){
+	double     rd, gd, bd,     // red, green and blue delta values
+		 	   qdelta;		   // quadrant delta value
+	
+	for( x = 0; x &lt; frame-&gt;width; x += this-&gt;m_quadrant_size ){
+		for( y = 0; y &lt; frame-&gt;height; y += this-&gt;m_quadrant_size ){
 			xt = x;
 			yt = y;
 			xb = x + this-&gt;m_quadrant_size;
 			yb = y + this-&gt;m_quadrant_size;
 			
-			quadrant = this-&gt;quadrant( &amp;iframe, xt, yt, xb, yb );
-			
-			qdelta = this-&gt;delta( &amp;quadrant, xt, yt, xb, yb );
-			
+			// compute delta value between frame and m_masterframe (the previous frame)
+			qdelta = 0;
+			for( xq = xt; xq &lt; xb; xq++ ){
+				for( yq = yt; yq &lt; yb; yq++ ){
+					// acquire pixels
+					m_driver-&gt;pixel( m_masterframe, xq, yq, &amp;mpixel );	
+					m_driver-&gt;pixel( frame,         xq, yq, &amp;fpixel );
+					// compute delta					
+					rd = this-&gt;delta( mpixel.red,   fpixel.red );
+        			gd = this-&gt;delta( mpixel.green, fpixel.green );
+					bd = this-&gt;delta( mpixel.blue,  fpixel.blue );
+
+					qdelta += ((rd + gd + bd) / 3.0f);
+				}	
+			}
+			qdelta /= m_quadrants;
+		
 			if( qdelta &gt;= this-&gt;m_threshold ){
 				count++;
 			}
 		}
 	}
 	
-	this-&gt;m_masterframe-&gt;swap(iframe);
-	
-	
-	return (count * 100.0f) / (double)this-&gt;m_quadrants;
+	memcpy( m_masterframe-&gt;data, frame-&gt;data, frame-&gt;size );
+		
+	return (count * 100.0f) / (double)m_quadrants;
 }</diff>
      <filename>analyzer.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -22,57 +22,32 @@
 #	define __analyzer_h__
 
 #include &quot;driver.h&quot;
-#include &lt;vector&gt;
-
-#include &lt;CImg.h&gt;
-
-using std::vector;
-using namespace cimg_library; 
-
-typedef struct _kb_quadrant{
-	int xt;
-	int yt;
-	int xb;
-	int yb;
-	
-	double delta;
-	
-	_kb_quadrant( int xt, int yt, int xb, int yb, double delta ){
-		this-&gt;xt = xt;
-		this-&gt;yt = yt;
-		this-&gt;xb = xb;
-		this-&gt;yb = yb;
-		this-&gt;delta = delta;
-	}	
-}
-kb_quadrant_t;
-
-typedef vector&lt;kb_quadrant_t *&gt; kb_delta_quadrants_t;
 
 class Analyzer
 {
 	private :
-	
-		double		 m_threshold;
-		
-		uint	     m_quadrant_size;		
-		uint         m_quadrants;
-		
-		CImg&lt;byte&gt; * m_masterframe;
-		CImg&lt;byte&gt; * m_frame;
+		kb_video_driver_t *m_driver;	
+			
+		double		       m_threshold;
 		
-		void convert( kb_video_buffer_t *frame, CImg&lt;byte&gt; *image );
-		void convert( kb_video_buffer_t *frame );
+		uint	           m_quadrant_size;		
+		uint               m_quadrants;
 		
-		CImg&lt;byte&gt; quadrant( CImg&lt;byte&gt; *image, int xt, int yt, int xb, int yb );
-		CImg&lt;byte&gt; quadrant( int xt, int yt, int xb, int yb );
+		kb_video_buffer_t *m_masterframe;
 		
-		double delta( short total, short value );
-		double delta( CImg&lt;byte&gt; *quadrant, int xt, int yt, int xb, int yb );
-				
+		inline double delta( short total, short value ){
+			double a = total,
+				   b = value;
+			if( total &lt; value ){
+				a = value;
+				b = total;
+			}
+			return (b &gt; 0 ? (((a - b) / b) * 100.0f) : 0);
+		}
+					
 	public  :
 	
-		Analyzer( uint width, uint height, uint depth, uint quadrant_size, double threshold );
+		Analyzer( kb_video_driver_t *driver, uint width, uint height, uint depth, uint quadrant_size, double threshold );
 	   ~Analyzer();
 	   
 	   double update( kb_video_buffer_t *frame );</diff>
      <filename>analyzer.h</filename>
    </modified>
    <modified>
      <diff>@@ -77,7 +77,7 @@ int v4l_capture( kb_device_t * dev, kb_video_buffer_t * vbuffer ){
 		perror(&quot;VIDIOCSYNC&quot;);
 		return -1;
 	}
-	
+
 	vbuffer-&gt;data = dev-&gt;mmap;
 	
 	return 1;
@@ -87,3 +87,27 @@ void v4l_close( kb_device_t * dev ){
 	munmap( dev-&gt;mmap, dev-&gt;width * dev-&gt;height * dev-&gt;depth );
 	close( dev-&gt;fd);
 }
+
+void v4l_pixel( kb_video_buffer_t * vbuffer, uint x, uint y, kb_rgb_t *pixel ){
+	uint offset = (y * vbuffer-&gt;width + x) * vbuffer-&gt;depth;
+	
+	pixel-&gt;red   = vbuffer-&gt;data[ offset + 0 ];
+	pixel-&gt;green = vbuffer-&gt;data[ offset + 1 ];
+	pixel-&gt;blue  = vbuffer-&gt;data[ offset + 2 ];
+}
+
+void v4l_swap( kb_video_buffer_t * src, kb_video_buffer_t * dst ){
+	memcpy( dst-&gt;data, src-&gt;data, dst-&gt;size );
+}
+
+kb_video_buffer_t * v4l_create( uint width, uint height, uint depth ){
+	kb_video_buffer_t *buffer = (kb_video_buffer_t *)malloc(sizeof(kb_video_buffer_t));
+	
+	buffer-&gt;width  = width;
+	buffer-&gt;height = height;
+	buffer-&gt;depth  = depth;
+	buffer-&gt;size   = width * height * depth;
+	buffer-&gt;data   = (byte *)malloc( buffer-&gt;size );
+	
+	return buffer;
+}</diff>
      <filename>driver.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -32,6 +32,7 @@
 #include &lt;signal.h&gt;
 #include &lt;malloc.h&gt;
 #include &lt;linux/videodev.h&gt;
+#include &lt;stdlib.h&gt;
 
 typedef unsigned char byte;
 typedef unsigned int  uint;
@@ -57,9 +58,19 @@ typedef struct{
 }
 kb_video_buffer_t;
 
-typedef int  (* kb_open_t)	 ( char *devname, kb_device_t * dev );
-typedef int  (* kb_capture_t)( kb_device_t * dev, kb_video_buffer_t * vbuffer );
-typedef void (* kb_close_t)	 ( kb_device_t * dev );
+typedef struct{
+	byte red;
+	byte green;
+	byte blue;
+}
+kb_rgb_t;
+
+typedef int  				(* kb_open_t)	 ( char *devname, kb_device_t * dev );
+typedef int  				(* kb_capture_t) ( kb_device_t * dev, kb_video_buffer_t * vbuffer );
+typedef void 				(* kb_close_t)	 ( kb_device_t * dev );
+typedef void 				(* kb_pixel_t)   ( kb_video_buffer_t * vbuffer, uint x, uint y, kb_rgb_t *pixel );
+typedef void 				(* kb_swap_t)    ( kb_video_buffer_t * src, kb_video_buffer_t * dst );
+typedef kb_video_buffer_t * (* kb_create_t)  ( uint width, uint height, uint depth );
 
 typedef struct{
 	char 		 name[0xFF];
@@ -67,16 +78,22 @@ typedef struct{
 	kb_open_t	 open;
 	kb_capture_t capture;
 	kb_close_t   close;
+	kb_pixel_t	 pixel;
+	kb_swap_t    swap;
+	kb_create_t  create;
 }
 kb_video_driver_t;
 
-int  v4l_open   ( char *devname, kb_device_t * dev );
-int  v4l_capture( kb_device_t * dev, kb_video_buffer_t * vbuffer );
-void v4l_close	( kb_device_t * dev );
+int  				v4l_open    ( char *devname, kb_device_t * dev );
+int  			    v4l_capture ( kb_device_t * dev, kb_video_buffer_t * vbuffer );
+void 				v4l_close	( kb_device_t * dev );
+void 			    v4l_pixel   ( kb_video_buffer_t * vbuffer, uint x, uint y, kb_rgb_t *pixel );
+void 			    v4l_swap    ( kb_video_buffer_t * src, kb_video_buffer_t * dst );
+kb_video_buffer_t * v4l_create  ( uint width, uint height, uint depth );
 
 static const kb_video_driver_t kb_video_drivers[] = 
 {
-	{ &quot;Video 4 Linux v1.0&quot;, v4l_open, v4l_capture, v4l_close }
+	{ &quot;Video 4 Linux v1.0&quot;, v4l_open, v4l_capture, v4l_close, v4l_pixel, v4l_swap, v4l_create }
 };
 
 #define SSVIDEODRIVERSN sizeof(kb_video_drivers) / sizeof(kb_video_drivers[0])</diff>
      <filename>driver.h</filename>
    </modified>
    <modified>
      <diff>@@ -20,8 +20,12 @@
  ***************************************************************************/
 #include &quot;analyzer.h&quot;
 
+// TODO: Those values should be read from a configuration file .
 #define QUADRANTSIZE 8
-#define THRESHOLD	 5.0f
+#define THRESHOLD	 0.2f
+#define RECORDPATH   &quot;/media/pendrive/kerbyd&quot;
+
+#define DEBUG        1
 
 void usage( char *app ){
 	printf( &quot;\nUsage %s -d &lt;device&gt; -t &lt;threshold&gt; -q &lt;quadrantsize&gt; -a &lt;alarm percentage&gt;\n\n&quot;, app );	
@@ -33,26 +37,30 @@ int main( int argc, char *argv[] ){
 	kb_video_buffer_t   frame;
 	Analyzer           *analyzer;
 	
-	v4l-&gt;open( argv[1], &amp;device );
-
-	analyzer = new Analyzer( device.width, device.height, 3, QUADRANTSIZE, THRESHOLD );
+	if( v4l-&gt;open( argv[1], &amp;device ) &lt; 0 ){
+		exit(-1);	
+	}
 
-	printf( &quot;Device :\n&quot;
-			&quot;\tfile descriptor : %d\n&quot;
-			&quot;\tmemory map      : 0x%X\n&quot;
-			&quot;\tdevice          : %s\n&quot;
-			&quot;\tname            : %s\n&quot;
-			&quot;\tmax width       : %d\n&quot;
-			&quot;\tmax height      : %d\n&quot;
-			&quot;\tdepth           : %d\n&quot;,
-			device.fd,
-			device.mmap,
-			device.device,
-			device.name,
-			device.width,
-			device.height,
-			device.depth );
-				
+	analyzer = new Analyzer( v4l, device.width, device.height, 3, QUADRANTSIZE, THRESHOLD );
+	
+	#ifdef DEBUG 
+		printf( &quot;Device :\n&quot;
+				&quot;\tfile descriptor : %d\n&quot;
+				&quot;\tmemory map      : 0x%X\n&quot;
+				&quot;\tdevice          : %s\n&quot;
+				&quot;\tname            : %s\n&quot;
+				&quot;\tmax width       : %d\n&quot;
+				&quot;\tmax height      : %d\n&quot;
+				&quot;\tdepth           : %d\n&quot;,
+				device.fd,
+				device.mmap,
+				device.device,
+				device.name,
+				device.width,
+				device.height,
+				device.depth );
+	#endif
+	
 	double delta;
 	
 	while( 1 ){
@@ -60,7 +68,7 @@ int main( int argc, char *argv[] ){
 
 		delta = analyzer-&gt;update( &amp;frame );
 		
-		printf( &quot;DELTA : %f%%\n&quot;, delta );
+		printf( &quot;DELTA : %f\n&quot;, delta );
 	}
 
 	v4l-&gt;close( &amp;device );</diff>
      <filename>main.cpp</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b1c589a910f8e578b666c0ae9b51d43d643b6017</id>
    </parent>
  </parents>
  <author>
    <name>evilsocket</name>
    <email>evilsocket@gmail.com</email>
  </author>
  <url>http://github.com/evilsocket/Kerby/commit/813f067a4df6ddd2044d888daae313cbe40e734b</url>
  <id>813f067a4df6ddd2044d888daae313cbe40e734b</id>
  <committed-date>2009-06-17T10:17:48-07:00</committed-date>
  <authored-date>2009-06-17T10:17:48-07:00</authored-date>
  <message>General optimization / removed dependencies to CImg, libx11, libpthread, etc</message>
  <tree>ee1e8a99059ca3254967e2b5333f9c7d334b6d13</tree>
  <committer>
    <name>evilsocket</name>
    <email>evilsocket@gmail.com</email>
  </committer>
</commit>
