<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to Home</title><link>https://sourceforge.net/p/jmotion/wiki/Home/</link><description>Recent changes to Home</description><atom:link href="https://sourceforge.net/p/jmotion/wiki/Home/feed" rel="self"/><language>en</language><lastBuildDate>Fri, 02 Jan 2015 00:52:09 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/jmotion/wiki/Home/feed" rel="self" type="application/rss+xml"/><item><title>Home modified by James Tay</title><link>https://sourceforge.net/p/jmotion/wiki/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v5
+++ v6
@@ -1,4 +1,5 @@
 See [QuickStart] for instructions on how to get up and running.
+See [Modules] for a complete reference on various modules.

 ~~~~

&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">James Tay</dc:creator><pubDate>Fri, 02 Jan 2015 00:52:09 -0000</pubDate><guid>https://sourceforge.net0f7c588bf8304e1e00cd9d825fb4df61026e3f6d</guid></item><item><title>Home modified by James Tay</title><link>https://sourceforge.net/p/jmotion/wiki/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v4
+++ v5
@@ -1,3 +1,5 @@
+See [QuickStart] for instructions on how to get up and running.
+
 ~~~~

&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">James Tay</dc:creator><pubDate>Thu, 01 Jan 2015 21:54:39 -0000</pubDate><guid>https://sourceforge.netb93aca4b54fd65562e71e9361dd4a374659d2576</guid></item><item><title>Home modified by James Tay</title><link>https://sourceforge.net/p/jmotion/wiki/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v3
+++ v4
@@ -1,8 +1,3 @@
-
-
-[[members limit=20]]
-[[download_button]]
-
 ~~~~

@@ -392,3 +387,7 @@

 ~~~~
+
+
+[[members limit=20]]
+[[download_button]]
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">James Tay</dc:creator><pubDate>Thu, 01 Jan 2015 20:18:44 -0000</pubDate><guid>https://sourceforge.neta133313345b1b9dee3297a6e6d3dde7afc61e004</guid></item><item><title>Home modified by James Tay</title><link>https://sourceforge.net/p/jmotion/wiki/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v2
+++ v3
@@ -1,8 +1,4 @@
-Welcome to your wiki!
-
-This is the default page, edit it as you see fit. To add a new page simply reference it within brackets, e.g.: [SamplePage].
-
-The wiki uses [Markdown](/p/jmotion/wiki/markdown_syntax/) syntax.
+

 [[members limit=20]]
 [[download_button]]
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">James Tay</dc:creator><pubDate>Thu, 01 Jan 2015 20:17:15 -0000</pubDate><guid>https://sourceforge.net9af285ee699c8ffba6310e2bf97fcb523e3cb18d</guid></item><item><title>Home modified by James Tay</title><link>https://sourceforge.net/p/jmotion/wiki/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;pre&gt;--- v1
+++ v2
@@ -6,3 +6,393 @@

 [[members limit=20]]
 [[download_button]]
+
+~~~~
+
+
+[ Major Design Objectives ]
+
+- Support motion detection across multiple cameras simultaneously
+- Modular design : segregation of input, processing, output, etc
+- Multi-core support by using multiple threads
+- Automatic motion masking (ie, ignore areas with continuous motion)
+
+[ To-do ]
+
+- Automatic noise level calibration
+- Support Pan/Tilt cameras (ie, 1 camera, but multiple camera instances)
+
+[ Implementation ]
+
+This is the life cycle of a typical camera instance.
+
+- Initialize data structures
+- Enter the program main loop
+  - request a camera frame
+  - auto update motion heat map
+  - write current frame to a file (keeps overriding this file)
+  - if motion is detected, save image to disk
+
+The configuration of each camera instance is as follows :
+
+  camera {
+    name &amp;lt;...&amp;gt;
+
+    input {
+      module &amp;lt;...&amp;gt;
+      params {
+        &amp;lt;...&amp;gt;
+      }
+    }
+    noise {
+      module &amp;lt;...&amp;gt;
+      params {
+        &amp;lt;...&amp;gt;
+      }
+    }
+    motion_mask {
+      module &amp;lt;...&amp;gt;
+      params {
+        &amp;lt;...&amp;gt;
+      }
+    }
+    detection {
+      module &amp;lt;...&amp;gt;
+      params {
+        &amp;lt;...&amp;gt;
+      }
+    }
+    output {
+      module &amp;lt;...&amp;gt;
+      params {
+        &amp;lt;...&amp;gt;
+      }
+    }
+  }
+
+From the above camera{..} block, we see that various components within a
+camera instance are built from user configurable modules. Each module may be
+supplied parameters relevant to it. The following example illustrates how a
+single IP camera may be configured :
+
+  camera {
+    name "my backyard"
+    input {
+      module "input_http.so"
+      params {
+        url "http://admin:cAmeRa1@192.168.1.50/snapshot.cgi"
+      }
+    }
+    noise {
+      module "std_noise.so"
+    }
+    motion_mask {
+      module "std_motion_mask.so"
+    }
+    detection {
+      module "std_motion_detect.so"
+      params {
+        sensitivity 0.15
+      }
+    }
+    output {
+      module "output_jpeg.so"
+      params {
+        save_dir "/data/cameras/mybackyard"
+      }
+    }
+  }
+
+Each module may receive configuration that is appropriate for it in the
+params{..} block. Statements here must be in the format :
+
+  &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;
+
+where value's supported data types are (note, strings must be enclosed within
+double-quotes) :
+
+  integer (eg, 1234)
+  floating point (eg, 12.34)
+  string (eg, "1234")
+
+[ Camera Instance Data Structures ]
+
+From the above configuration, you can see that each camera instance has the
+following configuration stanzas :
+
+  1. name - a label
+  2. input - where/how to get an image
+  3. noise - for detecting the camera noise level and motion heat maps
+  4. motion_mask - an algorithm for determining non-motion sensitive areas
+  5. detection - an algorithm for determining if motion (of interest) occured
+  6. output - a means of writing output (logs, images, etc)
+
+Each configuration stanza consists of exactly 1 module and an optional
+"params" sub-stanza, which consists of an arbituary number of key/value pairs.
+
+This data structure is created while parsing the config file. The parsing of
+the config file is primarily driven by "grammar.y" with tokenization performed
+by "lex.l". This is essentially an event driven model as "grammar.y" and
+"lex.l" fire off function calls as parsing progresses. Thus, this gives rise
+to the following events that are of interest :
+
+  Lex: RW_CAMERA - new camera block
+  Par: name statement - the name of this camera instance
+  Lex: RW_INPUT - now in input{..} stanza context
+  Lex: RW_OUTPUT - now in output{..} stanza context
+  Lex: RW_NOISE - now in noise{..} stanza context
+  Lex: RW_MOTIONMASK - now in motionmask{..} stanza context
+  Lex: RW_DETECTION - now in detection{..} stanza context
+  Par: module statement - the name of the shared object to load
+  Lex: RW_PARAMS - now in params{} sub-stanza
+  Lex: RW_KEY(foo) - encountered an attribute key named "foo"
+  Par: value&amp;lt;type&amp;gt;(bar) - encountered attribute's value of "bar"
+  Par: input{} stanza complete
+  Par: output{} stanza complete
+  Par: noise{} stanza complete
+  Par: motion_mask{} stanza complete
+  Par: detection{} stanza omplete
+  Par: camera{} block complete
+
+[ Modules And Function Invocation ]
+
+For each work unit within a camera instance (ie, input, noise, detection,
+etc), this program will open the corresponding shared object and attempt to
+locate the function called "handler()". This function is expected to have the
+following prototype :
+
+  int handler (Camera *cam, Stanza *stanza, char *stage, Core_Runtime *rt)
+
+Where:
+
+  cam    - pointer to the camera instance that invoked this module. A module
+           uses this to access camera instance wide variables and structures.
+  stanza - a pointer to the current module stanza that is executing. A module's
+           handler() uses this to find out more about itself (eg, its own
+           configuration, loop counter, etc).
+  stage  - a string which indicates the current invocation stage, this
+           takes on the values "input", "noise", "motion_mask", "detection"
+           or "output".
+  rt     - pointer to the shared jmotion runtime data structures.
+
+The handler() function is expected to return 1 to indicate successful
+operation, otherwise 0 to indicate that something went wrong. At the same
+time, an optional cleanup() function is called when jmotion terminates.
+
+Each module instance is allowed to track its own (opaque) data structure in
+"stanza-&amp;gt;dptr". The data at this pointer are the module's sole responsibility.
+Thus, the following code listing illustrates the layout of such a module :
+
+  #include "jmotion.h"
+
+  int handler (Camera *cam, Stanza *stanza, char *stage, Core_Runtime *rt)
+  {
+    if (stanza-&amp;gt;loop == 0)
+    {
+      /* do my own init */
+      stanza-&amp;gt;dptr = my_data_structure ;
+    }
+    /* do work */
+    return (1) ;
+  }
+
+  int cleanup (Camera *cam, Stanza *stanza, char *stage, Core_Runtime *rt)
+  {
+    /* clean up stuff */
+    return (1) ;
+  }
+
+The above code may be compiled using :
+
+  % gcc -fPIC -shared -rdynamic -o foo.so foo.c
+
+[ Modules and Multi-threading Notes ]
+
+Since jmotion supports multiple camera instances, we may end up with multiple
+modules being instantiated concurrently. Since modules are developed as third
+party components, we need some mechanism for ensuring synchronization of
+non-thread safe APIs. Take for example 2 modules which may be unrelated to
+each other (for illustration only):
+
+  input_http.so - uses HTTP GET to obtain an image from an ip camera
+  output_s3.so  - saves an image to amazon S3 via REST
+
+In the above example, we have 2 modules, developed by unrelated parties. Each
+however, has chosen to use libcurl to implement http transactions. Now libcurl
+requires exactly 1 call to curl_global_init(), but each thread also needs to
+call curl_easy_init() to obtain its own handle. Since all module threads get
+instantiated at program start, jmotion provides 2 shared variables in the
+shared Core_Runtime data structure for ensuring serial execution of such
+initialization routines.
+
+1) "global_lock" - this mutex may be used by modules to prevent concurrent
+   thread execution in critical sections. This is similar to the legacy linux
+   kernel's big kernel lock (BKL).
+
+2) "symbol_list" - a null terminated list of strings, storing process-wide
+   initializations that have been performed. In our above example, if
+   "input_http.so" gets to run first, it acquires "global_lock", it sees that
+   "curl_global_init" has not been called, so it calls "curl_global_init()",
+   adds "curl_global_init" to "symbol_list" and releases "global_lock". When
+   "output_s3.so" runs, it doesn't call "curl_global_init()" because sees the
+   symbol already exists in the list.
+
+Note that jmotion does NOT make use of the 2x above variables. They are
+provided solely for modules. Incidentally, each stanza (ie, module instance)
+has a "loop" counter. This counter is incremented each time jmotion invokes
+the module's handler() function. Thus, the module can use this counter to
+perform one time initialization.
+
+To simplify interaction with "symbol_list", jmotion provides the following
+functions, they all return 1 on success, otherwise 0 :
+
+  int symbol_list_get (char *symbol) ; // check if symbol is present
+  int symbol_list_set (char *symbol) ; // adds the specified symbol
+  int symbol_list_del (char *symbol) ; // removes the specified symbol
+
+Note that the caller should still acquire "global_lock" when calling any of
+the routines.
+
+[ Module Operation ]
+
+Each camera instance is essentially a dedicated thread executing a main loop.
+The loop consists of executing modules (if present) in each stage, in the
+following order :
+
+  1. input
+  2. noise
+  3. motion_mask
+  4. detection
+  5. output
+
+Each stage may be comprised of zero or more modules. If more than 1 module
+is present in a particular stage, they are invoked in the order that they were
+declared in the configuration file.
+
+At the start of each loop, the first input module is expected to acquire a
+fresh frame from the camera. This module is responsible for placing the newly
+acquired frame in "Camera-&amp;gt;frame_buf". If this pointer is NULL, the module
+is expected to allocate a suitably sized buffer, saving the size of this
+buffer into "Camera-&amp;gt;frame_total". The actual amount of data used should be
+reflected in "Camera-&amp;gt;frame_used". This frame buffer should then be treated as
+read-only by subsequent modules. Typically, we do not want to keep reallocating
+this buffer to fit the frame we place here, so we only grow "Camera-&amp;gt;total"
+when needed, and set "Camera-&amp;gt;frame_used" to reflect the current frame length.
+
+[ Stages, and what's expected of them ]
+
+The "input" stage
+
+- Writes a freshly captured frame to "cam-&amp;gt;frame_buf", the buffer's size is
+  "cam-&amp;gt;frame_total"
+- "cam-&amp;gt;frame_used" indicates the actual number of data bytes used (in case
+  subsequent frames shrink).
+- This module is expected to poll/pause as required. For example, if we want
+  to capture a fresh frame every 2 seconds, then this module is responsible
+  for sleep()'ing as necessary.
+- This module is expected to decompress the (jpeg) image. The raw pixels are
+  placed in "cam-&amp;gt;img_buf". The size of this buffer is "cam-&amp;gt;img_total".
+- The decompressed image is "cam-&amp;gt;img_width" by "cam-&amp;gt;img_height", and its
+  color depth is "cam-&amp;gt;depth".
+
+The "noise" stage
+
+- Compare "cam-&amp;gt;prev_buf" with "cam-&amp;gt;img_buf", build/update a motion heatmap
+  in "cam-&amp;gt;heatmap". To determine motion change, a pixel is considered a
+  change if its neighboring pixels all exhibit change.
+- The motion heatmap is maintained at cam-&amp;gt;heatmap, which is expected to be
+  an array of double, with values between 0.0 and 1.0.
+
+The "motion_mask" stage
+
+- Certain kinda of motion artifacts ought to be ignored. For example, on IR
+  illuminated cameras, rain appears as white streaks. This is where custom
+  motion masking algorithms may be applied.
+
+The "detection" stage
+
+- Inspect the motion heatmap, determine which pixels will be used for motion
+  detection. From that point, determine how much change has occured and set
+  the "cam-&amp;gt;motion_detected" flag if so.
+
+The "output" stage
+
+- Save the original camera image "cam-&amp;gt;frame_buf", of length "cam-&amp;gt;frame_used"
+  to a file.
+- If "cam-&amp;gt;motion_detected" is set, save the original camera image to the
+  "motion_dir" directory.
+
+(end of cycle)
+
+- The thread engine automatically copies the contents of "cam-&amp;gt;img_buf" to
+  "cam-&amp;gt;prev_buf". The dimensions and depth of the subsequent frames are
+  expected to remain the same.
+
+- Set "cam-&amp;gt;motion_detected" to 0.
+
+[ Logging ]
+
+Whether events originate from within jmotion, or from modules, logging is
+configured in the main config file, using the following statements :
+
+  global
+  {
+    log_basedir "&amp;lt;dirname&amp;gt;"
+    log_maxsize &amp;lt;bytes&amp;gt;
+    log_rotations &amp;lt;num&amp;gt;
+    log_level &amp;lt;num&amp;gt;
+  }
+
+Modules are encouraged to use the jmotion function which returns 1 on success,
+otherwise 0.
+
+  int f_log (char *ident, int level, char *format, ...)
+
+Where,
+
+  ident       - the identity of the caller (typically the macro "__func__")
+  level       - LOG_DEBUG to LOG_CRIT, see syslog(3)
+  format,...  - the event string and subsequent arguments
+
+Eg,
+
+  f_log ("output_jpeg", LOG_ERR, "Cannot write to %s", myfile) ;
+
+Thus, a module running under camera instance name "foo" will have its events
+delivered to the file "/path/to/basedir/foo.log". Incidentally, events which
+originate from the core jmotion engine are logged to "jmotion.log". The
+initial log level can be set via the "LOG_LEVEL" environment variable.
+
+[ Minimal Configuration ]
+
+The following configuration is the simplest possible working setup, which
+pulls an image from a usb camera and writes it periodically to a file. It
+does not perform any processing (ie, no motion detection, no image archiving,
+etc).
+
+  camera {
+    name "mycam1"
+    input {
+      module "input_v4l2.so"
+    }
+    output {
+      module "output_jpeg.so"
+      params {
+        cur_frame "/tmp/mycam1.jpg"
+      }
+    }
+  }
+
+[ Signal Handler ]
+
+The jmotion program supports the following signals :
+
+  SIGHUP  - dumps the current runtime info
+  SIGUSR1 - decrements the log level
+  SIGUSR2 - increments the log level
+  SIGINT  - performs an orderly shutdown
+  SIGTERM - performs an orderly shutdown
+  SIGALRM - watchdog timer (for internal use only)
+
+
+~~~~
&lt;/pre&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">James Tay</dc:creator><pubDate>Thu, 01 Jan 2015 20:16:29 -0000</pubDate><guid>https://sourceforge.net8dac798ba2dc1f25a2cc4f353eca0d033f3a4bc9</guid></item><item><title>Discussion for Home page</title><link>https://sourceforge.net/p/jmotion/wiki/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;[ Major Design Objectives ]&lt;/span&gt;

&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Support&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;detection&lt;/span&gt; &lt;span class="err"&gt;across&lt;/span&gt; &lt;span class="err"&gt;multiple&lt;/span&gt; &lt;span class="err"&gt;cameras&lt;/span&gt; &lt;span class="err"&gt;simultaneously&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Modular&lt;/span&gt; &lt;span class="err"&gt;design&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;segregation&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;input,&lt;/span&gt; &lt;span class="err"&gt;processing,&lt;/span&gt; &lt;span class="err"&gt;output,&lt;/span&gt; &lt;span class="err"&gt;etc&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Multi-core&lt;/span&gt; &lt;span class="err"&gt;support&lt;/span&gt; &lt;span class="err"&gt;by&lt;/span&gt; &lt;span class="err"&gt;using&lt;/span&gt; &lt;span class="err"&gt;multiple&lt;/span&gt; &lt;span class="err"&gt;threads&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Automatic&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;masking&lt;/span&gt; &lt;span class="err"&gt;(ie,&lt;/span&gt; &lt;span class="err"&gt;ignore&lt;/span&gt; &lt;span class="err"&gt;areas&lt;/span&gt; &lt;span class="err"&gt;with&lt;/span&gt; &lt;span class="err"&gt;continuous&lt;/span&gt; &lt;span class="err"&gt;motion)&lt;/span&gt;

&lt;span class="k"&gt;[ To-do ]&lt;/span&gt;

&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Automatic&lt;/span&gt; &lt;span class="err"&gt;noise&lt;/span&gt; &lt;span class="err"&gt;level&lt;/span&gt; &lt;span class="err"&gt;calibration&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Support&lt;/span&gt; &lt;span class="err"&gt;Pan/Tilt&lt;/span&gt; &lt;span class="err"&gt;cameras&lt;/span&gt; &lt;span class="err"&gt;(ie,&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;camera,&lt;/span&gt; &lt;span class="err"&gt;but&lt;/span&gt; &lt;span class="err"&gt;multiple&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instances)&lt;/span&gt;

&lt;span class="k"&gt;[ Implementation ]&lt;/span&gt;

&lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;life&lt;/span&gt; &lt;span class="err"&gt;cycle&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;typical&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instance.&lt;/span&gt;

&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Initialize&lt;/span&gt; &lt;span class="err"&gt;data&lt;/span&gt; &lt;span class="err"&gt;structures&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Enter&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;program&lt;/span&gt; &lt;span class="err"&gt;main&lt;/span&gt; &lt;span class="err"&gt;loop&lt;/span&gt;
  &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;request&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;frame&lt;/span&gt;
  &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;auto&lt;/span&gt; &lt;span class="err"&gt;update&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;heat&lt;/span&gt; &lt;span class="err"&gt;map&lt;/span&gt;
  &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;write&lt;/span&gt; &lt;span class="err"&gt;current&lt;/span&gt; &lt;span class="err"&gt;frame&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;file&lt;/span&gt; &lt;span class="err"&gt;(keeps&lt;/span&gt; &lt;span class="err"&gt;overriding&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;file)&lt;/span&gt;
  &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;if&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;detected,&lt;/span&gt; &lt;span class="err"&gt;save&lt;/span&gt; &lt;span class="err"&gt;image&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;disk&lt;/span&gt;

&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;configuration&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;each&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instance&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;as&lt;/span&gt; &lt;span class="err"&gt;follows&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;name&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;

    &lt;span class="err"&gt;input&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;params&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;noise&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;params&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;motion_mask&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;params&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;detection&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;params&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;output&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;params&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;&amp;lt;...&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="err"&gt;From&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;above&lt;/span&gt; &lt;span class="err"&gt;camera{..}&lt;/span&gt; &lt;span class="err"&gt;block,&lt;/span&gt; &lt;span class="err"&gt;we&lt;/span&gt; &lt;span class="err"&gt;see&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;various&lt;/span&gt; &lt;span class="err"&gt;components&lt;/span&gt; &lt;span class="err"&gt;within&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt;
&lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instance&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt; &lt;span class="err"&gt;built&lt;/span&gt; &lt;span class="err"&gt;from&lt;/span&gt; &lt;span class="err"&gt;user&lt;/span&gt; &lt;span class="err"&gt;configurable&lt;/span&gt; &lt;span class="err"&gt;modules.&lt;/span&gt; &lt;span class="err"&gt;Each&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;may&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt;
&lt;span class="err"&gt;supplied&lt;/span&gt; &lt;span class="err"&gt;parameters&lt;/span&gt; &lt;span class="err"&gt;relevant&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;it.&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;following&lt;/span&gt; &lt;span class="err"&gt;example&lt;/span&gt; &lt;span class="err"&gt;illustrates&lt;/span&gt; &lt;span class="err"&gt;how&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt;
&lt;span class="err"&gt;single&lt;/span&gt; &lt;span class="err"&gt;IP&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;may&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;configured&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;name&lt;/span&gt; &lt;span class="err"&gt;"my&lt;/span&gt; &lt;span class="err"&gt;backyard"&lt;/span&gt;
    &lt;span class="err"&gt;input&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;"input_http.so"&lt;/span&gt;
      &lt;span class="err"&gt;params&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;url&lt;/span&gt; &lt;span class="err"&gt;"http://admin:cAmeRa1@192.168.1.50/snapshot.cgi"&lt;/span&gt;
      &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;noise&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;"std_noise.so"&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;motion_mask&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;"std_motion_mask.so"&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;detection&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;"std_motion_detect.so"&lt;/span&gt;
      &lt;span class="err"&gt;params&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;sensitivity&lt;/span&gt; &lt;span class="err"&gt;0.15&lt;/span&gt;
      &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;output&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;"output_jpeg.so"&lt;/span&gt;
      &lt;span class="err"&gt;params&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;save_dir&lt;/span&gt; &lt;span class="err"&gt;"/data/cameras/mybackyard"&lt;/span&gt;
      &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="err"&gt;Each&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;may&lt;/span&gt; &lt;span class="err"&gt;receive&lt;/span&gt; &lt;span class="err"&gt;configuration&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;appropriate&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;it&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
&lt;span class="err"&gt;params{..}&lt;/span&gt; &lt;span class="err"&gt;block.&lt;/span&gt; &lt;span class="err"&gt;Statements&lt;/span&gt; &lt;span class="err"&gt;here&lt;/span&gt; &lt;span class="err"&gt;must&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;format&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;&amp;lt;key&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;

&lt;span class="err"&gt;where&lt;/span&gt; &lt;span class="err"&gt;value's&lt;/span&gt; &lt;span class="err"&gt;supported&lt;/span&gt; &lt;span class="err"&gt;data&lt;/span&gt; &lt;span class="err"&gt;types&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt; &lt;span class="err"&gt;(note,&lt;/span&gt; &lt;span class="err"&gt;strings&lt;/span&gt; &lt;span class="err"&gt;must&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;enclosed&lt;/span&gt; &lt;span class="err"&gt;within&lt;/span&gt;
&lt;span class="err"&gt;double-quotes)&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;integer&lt;/span&gt; &lt;span class="err"&gt;(eg,&lt;/span&gt; &lt;span class="err"&gt;1234)&lt;/span&gt;
  &lt;span class="err"&gt;floating&lt;/span&gt; &lt;span class="err"&gt;point&lt;/span&gt; &lt;span class="err"&gt;(eg,&lt;/span&gt; &lt;span class="err"&gt;12.34)&lt;/span&gt;
  &lt;span class="err"&gt;string&lt;/span&gt; &lt;span class="err"&gt;(eg,&lt;/span&gt; &lt;span class="err"&gt;"1234")&lt;/span&gt;

&lt;span class="k"&gt;[ Camera Instance Data Structures ]&lt;/span&gt;

&lt;span class="err"&gt;From&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;above&lt;/span&gt; &lt;span class="err"&gt;configuration,&lt;/span&gt; &lt;span class="err"&gt;you&lt;/span&gt; &lt;span class="err"&gt;can&lt;/span&gt; &lt;span class="err"&gt;see&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;each&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instance&lt;/span&gt; &lt;span class="err"&gt;has&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
&lt;span class="err"&gt;following&lt;/span&gt; &lt;span class="err"&gt;configuration&lt;/span&gt; &lt;span class="err"&gt;stanzas&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;1.&lt;/span&gt; &lt;span class="err"&gt;name&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;label&lt;/span&gt;
  &lt;span class="err"&gt;2.&lt;/span&gt; &lt;span class="err"&gt;input&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;where/how&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;get&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;image&lt;/span&gt;
  &lt;span class="err"&gt;3.&lt;/span&gt; &lt;span class="err"&gt;noise&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;detecting&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;noise&lt;/span&gt; &lt;span class="err"&gt;level&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;heat&lt;/span&gt; &lt;span class="err"&gt;maps&lt;/span&gt;
  &lt;span class="err"&gt;4.&lt;/span&gt; &lt;span class="err"&gt;motion_mask&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;algorithm&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;determining&lt;/span&gt; &lt;span class="err"&gt;non-motion&lt;/span&gt; &lt;span class="err"&gt;sensitive&lt;/span&gt; &lt;span class="err"&gt;areas&lt;/span&gt;
  &lt;span class="err"&gt;5.&lt;/span&gt; &lt;span class="err"&gt;detection&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;algorithm&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;determining&lt;/span&gt; &lt;span class="err"&gt;if&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;(of&lt;/span&gt; &lt;span class="err"&gt;interest)&lt;/span&gt; &lt;span class="err"&gt;occured&lt;/span&gt;
  &lt;span class="err"&gt;6.&lt;/span&gt; &lt;span class="err"&gt;output&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;means&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;writing&lt;/span&gt; &lt;span class="err"&gt;output&lt;/span&gt; &lt;span class="err"&gt;(logs,&lt;/span&gt; &lt;span class="err"&gt;images,&lt;/span&gt; &lt;span class="err"&gt;etc)&lt;/span&gt;

&lt;span class="err"&gt;Each&lt;/span&gt; &lt;span class="err"&gt;configuration&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;consists&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;exactly&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;optional&lt;/span&gt;
&lt;span class="err"&gt;"params"&lt;/span&gt; &lt;span class="err"&gt;sub-stanza,&lt;/span&gt; &lt;span class="err"&gt;which&lt;/span&gt; &lt;span class="err"&gt;consists&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;arbituary&lt;/span&gt; &lt;span class="err"&gt;number&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;key/value&lt;/span&gt; &lt;span class="err"&gt;pairs.&lt;/span&gt;

&lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;data&lt;/span&gt; &lt;span class="err"&gt;structure&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;created&lt;/span&gt; &lt;span class="err"&gt;while&lt;/span&gt; &lt;span class="err"&gt;parsing&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;config&lt;/span&gt; &lt;span class="err"&gt;file.&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;parsing&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt;
&lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;config&lt;/span&gt; &lt;span class="err"&gt;file&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;primarily&lt;/span&gt; &lt;span class="err"&gt;driven&lt;/span&gt; &lt;span class="err"&gt;by&lt;/span&gt; &lt;span class="err"&gt;"grammar.y"&lt;/span&gt; &lt;span class="err"&gt;with&lt;/span&gt; &lt;span class="err"&gt;tokenization&lt;/span&gt; &lt;span class="err"&gt;performed&lt;/span&gt;
&lt;span class="err"&gt;by&lt;/span&gt; &lt;span class="err"&gt;"lex.l".&lt;/span&gt; &lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;essentially&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;event&lt;/span&gt; &lt;span class="err"&gt;driven&lt;/span&gt; &lt;span class="err"&gt;model&lt;/span&gt; &lt;span class="err"&gt;as&lt;/span&gt; &lt;span class="err"&gt;"grammar.y"&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt;
&lt;span class="err"&gt;"lex.l"&lt;/span&gt; &lt;span class="err"&gt;fire&lt;/span&gt; &lt;span class="err"&gt;off&lt;/span&gt; &lt;span class="err"&gt;function&lt;/span&gt; &lt;span class="err"&gt;calls&lt;/span&gt; &lt;span class="err"&gt;as&lt;/span&gt; &lt;span class="err"&gt;parsing&lt;/span&gt; &lt;span class="err"&gt;progresses.&lt;/span&gt; &lt;span class="err"&gt;Thus,&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;gives&lt;/span&gt; &lt;span class="err"&gt;rise&lt;/span&gt;
&lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;following&lt;/span&gt; &lt;span class="err"&gt;events&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;interest&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;Lex:&lt;/span&gt; &lt;span class="err"&gt;RW_CAMERA&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;new&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;block&lt;/span&gt;
  &lt;span class="err"&gt;Par:&lt;/span&gt; &lt;span class="err"&gt;name&lt;/span&gt; &lt;span class="err"&gt;statement&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;name&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instance&lt;/span&gt;
  &lt;span class="err"&gt;Lex:&lt;/span&gt; &lt;span class="err"&gt;RW_INPUT&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;now&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;input{..}&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;context&lt;/span&gt;
  &lt;span class="err"&gt;Lex:&lt;/span&gt; &lt;span class="err"&gt;RW_OUTPUT&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;now&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;output{..}&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;context&lt;/span&gt;
  &lt;span class="err"&gt;Lex:&lt;/span&gt; &lt;span class="err"&gt;RW_NOISE&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;now&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;noise{..}&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;context&lt;/span&gt;
  &lt;span class="err"&gt;Lex:&lt;/span&gt; &lt;span class="err"&gt;RW_MOTIONMASK&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;now&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;motionmask{..}&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;context&lt;/span&gt;
  &lt;span class="err"&gt;Lex:&lt;/span&gt; &lt;span class="err"&gt;RW_DETECTION&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;now&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;detection{..}&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;context&lt;/span&gt;
  &lt;span class="err"&gt;Par:&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;statement&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;name&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;shared&lt;/span&gt; &lt;span class="err"&gt;object&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;load&lt;/span&gt;
  &lt;span class="err"&gt;Lex:&lt;/span&gt; &lt;span class="err"&gt;RW_PARAMS&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;now&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;params{}&lt;/span&gt; &lt;span class="err"&gt;sub-stanza&lt;/span&gt;
  &lt;span class="err"&gt;Lex:&lt;/span&gt; &lt;span class="err"&gt;RW_KEY(foo)&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;encountered&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;attribute&lt;/span&gt; &lt;span class="err"&gt;key&lt;/span&gt; &lt;span class="err"&gt;named&lt;/span&gt; &lt;span class="err"&gt;"foo"&lt;/span&gt;
  &lt;span class="err"&gt;Par:&lt;/span&gt; &lt;span class="err"&gt;value&amp;lt;type&amp;gt;(bar)&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;encountered&lt;/span&gt; &lt;span class="err"&gt;attribute's&lt;/span&gt; &lt;span class="err"&gt;value&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;"bar"&lt;/span&gt;
  &lt;span class="err"&gt;Par:&lt;/span&gt; &lt;span class="err"&gt;input{}&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;complete&lt;/span&gt;
  &lt;span class="err"&gt;Par:&lt;/span&gt; &lt;span class="err"&gt;output{}&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;complete&lt;/span&gt;
  &lt;span class="err"&gt;Par:&lt;/span&gt; &lt;span class="err"&gt;noise{}&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;complete&lt;/span&gt;
  &lt;span class="err"&gt;Par:&lt;/span&gt; &lt;span class="err"&gt;motion_mask{}&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;complete&lt;/span&gt;
  &lt;span class="err"&gt;Par:&lt;/span&gt; &lt;span class="err"&gt;detection{}&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;omplete&lt;/span&gt;
  &lt;span class="err"&gt;Par:&lt;/span&gt; &lt;span class="err"&gt;camera{}&lt;/span&gt; &lt;span class="err"&gt;block&lt;/span&gt; &lt;span class="err"&gt;complete&lt;/span&gt;

&lt;span class="k"&gt;[ Modules And Function Invocation ]&lt;/span&gt;

&lt;span class="err"&gt;For&lt;/span&gt; &lt;span class="err"&gt;each&lt;/span&gt; &lt;span class="err"&gt;work&lt;/span&gt; &lt;span class="err"&gt;unit&lt;/span&gt; &lt;span class="err"&gt;within&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instance&lt;/span&gt; &lt;span class="err"&gt;(ie,&lt;/span&gt; &lt;span class="err"&gt;input,&lt;/span&gt; &lt;span class="err"&gt;noise,&lt;/span&gt; &lt;span class="err"&gt;detection,&lt;/span&gt;
&lt;span class="err"&gt;etc),&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;program&lt;/span&gt; &lt;span class="err"&gt;will&lt;/span&gt; &lt;span class="err"&gt;open&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;corresponding&lt;/span&gt; &lt;span class="err"&gt;shared&lt;/span&gt; &lt;span class="err"&gt;object&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;attempt&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt;
&lt;span class="err"&gt;locate&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;function&lt;/span&gt; &lt;span class="err"&gt;called&lt;/span&gt; &lt;span class="err"&gt;"handler()".&lt;/span&gt; &lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;function&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;expected&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;have&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
&lt;span class="err"&gt;following&lt;/span&gt; &lt;span class="err"&gt;prototype&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;int&lt;/span&gt; &lt;span class="err"&gt;handler&lt;/span&gt; &lt;span class="err"&gt;(Camera&lt;/span&gt; &lt;span class="err"&gt;*cam,&lt;/span&gt; &lt;span class="err"&gt;Stanza&lt;/span&gt; &lt;span class="err"&gt;*stanza,&lt;/span&gt; &lt;span class="err"&gt;char&lt;/span&gt; &lt;span class="err"&gt;*stage,&lt;/span&gt; &lt;span class="err"&gt;Core_Runtime&lt;/span&gt; &lt;span class="err"&gt;*rt)&lt;/span&gt;

&lt;span class="err"&gt;Where:&lt;/span&gt;

  &lt;span class="err"&gt;cam&lt;/span&gt;    &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;pointer&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instance&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;invoked&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;module.&lt;/span&gt; &lt;span class="err"&gt;A&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt;
           &lt;span class="err"&gt;uses&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;access&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instance&lt;/span&gt; &lt;span class="err"&gt;wide&lt;/span&gt; &lt;span class="err"&gt;variables&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;structures.&lt;/span&gt;
  &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;pointer&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;current&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;executing.&lt;/span&gt; &lt;span class="err"&gt;A&lt;/span&gt; &lt;span class="err"&gt;module's&lt;/span&gt;
           &lt;span class="err"&gt;handler()&lt;/span&gt; &lt;span class="err"&gt;uses&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;find&lt;/span&gt; &lt;span class="err"&gt;out&lt;/span&gt; &lt;span class="err"&gt;more&lt;/span&gt; &lt;span class="err"&gt;about&lt;/span&gt; &lt;span class="err"&gt;itself&lt;/span&gt; &lt;span class="err"&gt;(eg,&lt;/span&gt; &lt;span class="err"&gt;its&lt;/span&gt; &lt;span class="err"&gt;own&lt;/span&gt;
           &lt;span class="err"&gt;configuration,&lt;/span&gt; &lt;span class="err"&gt;loop&lt;/span&gt; &lt;span class="err"&gt;counter,&lt;/span&gt; &lt;span class="err"&gt;etc).&lt;/span&gt;
  &lt;span class="err"&gt;stage&lt;/span&gt;  &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;string&lt;/span&gt; &lt;span class="err"&gt;which&lt;/span&gt; &lt;span class="err"&gt;indicates&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;current&lt;/span&gt; &lt;span class="err"&gt;invocation&lt;/span&gt; &lt;span class="err"&gt;stage,&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt;
           &lt;span class="err"&gt;takes&lt;/span&gt; &lt;span class="err"&gt;on&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;values&lt;/span&gt; &lt;span class="err"&gt;"input",&lt;/span&gt; &lt;span class="err"&gt;"noise",&lt;/span&gt; &lt;span class="err"&gt;"motion_mask",&lt;/span&gt; &lt;span class="err"&gt;"detection"&lt;/span&gt;
           &lt;span class="err"&gt;or&lt;/span&gt; &lt;span class="err"&gt;"output".&lt;/span&gt;
  &lt;span class="err"&gt;rt&lt;/span&gt;     &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;pointer&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;shared&lt;/span&gt; &lt;span class="err"&gt;jmotion&lt;/span&gt; &lt;span class="err"&gt;runtime&lt;/span&gt; &lt;span class="err"&gt;data&lt;/span&gt; &lt;span class="err"&gt;structures.&lt;/span&gt;

&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;handler()&lt;/span&gt; &lt;span class="err"&gt;function&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;expected&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;return&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;indicate&lt;/span&gt; &lt;span class="err"&gt;successful&lt;/span&gt;
&lt;span class="err"&gt;operation,&lt;/span&gt; &lt;span class="err"&gt;otherwise&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;indicate&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;something&lt;/span&gt; &lt;span class="err"&gt;went&lt;/span&gt; &lt;span class="err"&gt;wrong.&lt;/span&gt; &lt;span class="err"&gt;At&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;same&lt;/span&gt;
&lt;span class="err"&gt;time,&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;optional&lt;/span&gt; &lt;span class="err"&gt;cleanup()&lt;/span&gt; &lt;span class="err"&gt;function&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;called&lt;/span&gt; &lt;span class="err"&gt;when&lt;/span&gt; &lt;span class="err"&gt;jmotion&lt;/span&gt; &lt;span class="err"&gt;terminates.&lt;/span&gt;

&lt;span class="err"&gt;Each&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;instance&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;allowed&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;track&lt;/span&gt; &lt;span class="err"&gt;its&lt;/span&gt; &lt;span class="err"&gt;own&lt;/span&gt; &lt;span class="err"&gt;(opaque)&lt;/span&gt; &lt;span class="err"&gt;data&lt;/span&gt; &lt;span class="err"&gt;structure&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt;
&lt;span class="err"&gt;"stanza-&amp;gt;dptr".&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;data&lt;/span&gt; &lt;span class="err"&gt;at&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;pointer&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;module's&lt;/span&gt; &lt;span class="err"&gt;sole&lt;/span&gt; &lt;span class="err"&gt;responsibility.&lt;/span&gt;
&lt;span class="err"&gt;Thus,&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;following&lt;/span&gt; &lt;span class="err"&gt;code&lt;/span&gt; &lt;span class="err"&gt;listing&lt;/span&gt; &lt;span class="err"&gt;illustrates&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;layout&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;such&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="c1"&gt;#include "jmotion.h"&lt;/span&gt;

  &lt;span class="err"&gt;int&lt;/span&gt; &lt;span class="err"&gt;handler&lt;/span&gt; &lt;span class="err"&gt;(Camera&lt;/span&gt; &lt;span class="err"&gt;*cam,&lt;/span&gt; &lt;span class="err"&gt;Stanza&lt;/span&gt; &lt;span class="err"&gt;*stanza,&lt;/span&gt; &lt;span class="err"&gt;char&lt;/span&gt; &lt;span class="err"&gt;*stage,&lt;/span&gt; &lt;span class="err"&gt;Core_Runtime&lt;/span&gt; &lt;span class="err"&gt;*rt)&lt;/span&gt;
  &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;if (stanza-&amp;gt;loop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;= 0)&lt;/span&gt;
&lt;span class="s"&gt;    {&lt;/span&gt;
&lt;span class="s"&gt;      /* do my own init */&lt;/span&gt;
&lt;span class="s"&gt;      stanza-&amp;gt;dptr = my_data_structure ;&lt;/span&gt;
&lt;span class="s"&gt;    }&lt;/span&gt;
&lt;span class="s"&gt;    /* do work */&lt;/span&gt;
&lt;span class="s"&gt;    return (1) ;&lt;/span&gt;
&lt;span class="s"&gt;  }&lt;/span&gt;

  &lt;span class="err"&gt;int&lt;/span&gt; &lt;span class="err"&gt;cleanup&lt;/span&gt; &lt;span class="err"&gt;(Camera&lt;/span&gt; &lt;span class="err"&gt;*cam,&lt;/span&gt; &lt;span class="err"&gt;Stanza&lt;/span&gt; &lt;span class="err"&gt;*stanza,&lt;/span&gt; &lt;span class="err"&gt;char&lt;/span&gt; &lt;span class="err"&gt;*stage,&lt;/span&gt; &lt;span class="err"&gt;Core_Runtime&lt;/span&gt; &lt;span class="err"&gt;*rt)&lt;/span&gt;
  &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;/*&lt;/span&gt; &lt;span class="err"&gt;clean&lt;/span&gt; &lt;span class="err"&gt;up&lt;/span&gt; &lt;span class="err"&gt;stuff&lt;/span&gt; &lt;span class="err"&gt;*/&lt;/span&gt;
    &lt;span class="err"&gt;return&lt;/span&gt; &lt;span class="err"&gt;(1)&lt;/span&gt; &lt;span class="c1"&gt;;&lt;/span&gt;
  &lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;above&lt;/span&gt; &lt;span class="err"&gt;code&lt;/span&gt; &lt;span class="err"&gt;may&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;compiled&lt;/span&gt; &lt;span class="err"&gt;using&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="err"&gt;gcc&lt;/span&gt; &lt;span class="err"&gt;-fPIC&lt;/span&gt; &lt;span class="err"&gt;-shared&lt;/span&gt; &lt;span class="err"&gt;-rdynamic&lt;/span&gt; &lt;span class="err"&gt;-o&lt;/span&gt; &lt;span class="err"&gt;foo.so&lt;/span&gt; &lt;span class="err"&gt;foo.c&lt;/span&gt;

&lt;span class="k"&gt;[ Modules and Multi-threading Notes ]&lt;/span&gt;

&lt;span class="err"&gt;Since&lt;/span&gt; &lt;span class="err"&gt;jmotion&lt;/span&gt; &lt;span class="err"&gt;supports&lt;/span&gt; &lt;span class="err"&gt;multiple&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instances,&lt;/span&gt; &lt;span class="err"&gt;we&lt;/span&gt; &lt;span class="err"&gt;may&lt;/span&gt; &lt;span class="err"&gt;end&lt;/span&gt; &lt;span class="err"&gt;up&lt;/span&gt; &lt;span class="err"&gt;with&lt;/span&gt; &lt;span class="err"&gt;multiple&lt;/span&gt;
&lt;span class="err"&gt;modules&lt;/span&gt; &lt;span class="err"&gt;being&lt;/span&gt; &lt;span class="err"&gt;instantiated&lt;/span&gt; &lt;span class="err"&gt;concurrently.&lt;/span&gt; &lt;span class="err"&gt;Since&lt;/span&gt; &lt;span class="err"&gt;modules&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt; &lt;span class="err"&gt;developed&lt;/span&gt; &lt;span class="err"&gt;as&lt;/span&gt; &lt;span class="err"&gt;third&lt;/span&gt;
&lt;span class="err"&gt;party&lt;/span&gt; &lt;span class="err"&gt;components,&lt;/span&gt; &lt;span class="err"&gt;we&lt;/span&gt; &lt;span class="err"&gt;need&lt;/span&gt; &lt;span class="err"&gt;some&lt;/span&gt; &lt;span class="err"&gt;mechanism&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;ensuring&lt;/span&gt; &lt;span class="err"&gt;synchronization&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt;
&lt;span class="err"&gt;non-thread&lt;/span&gt; &lt;span class="err"&gt;safe&lt;/span&gt; &lt;span class="err"&gt;APIs.&lt;/span&gt; &lt;span class="err"&gt;Take&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;example&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt; &lt;span class="err"&gt;modules&lt;/span&gt; &lt;span class="err"&gt;which&lt;/span&gt; &lt;span class="err"&gt;may&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;unrelated&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt;
&lt;span class="err"&gt;each&lt;/span&gt; &lt;span class="err"&gt;other&lt;/span&gt; &lt;span class="err"&gt;(for&lt;/span&gt; &lt;span class="err"&gt;illustration&lt;/span&gt; &lt;span class="err"&gt;only):&lt;/span&gt;

  &lt;span class="err"&gt;input_http.so&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;uses&lt;/span&gt; &lt;span class="err"&gt;HTTP&lt;/span&gt; &lt;span class="err"&gt;GET&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;obtain&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;image&lt;/span&gt; &lt;span class="err"&gt;from&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;ip&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt;
  &lt;span class="err"&gt;output_s3.so&lt;/span&gt;  &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;saves&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;image&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;amazon&lt;/span&gt; &lt;span class="err"&gt;S3&lt;/span&gt; &lt;span class="err"&gt;via&lt;/span&gt; &lt;span class="err"&gt;REST&lt;/span&gt;

&lt;span class="err"&gt;In&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;above&lt;/span&gt; &lt;span class="err"&gt;example,&lt;/span&gt; &lt;span class="err"&gt;we&lt;/span&gt; &lt;span class="err"&gt;have&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt; &lt;span class="err"&gt;modules,&lt;/span&gt; &lt;span class="err"&gt;developed&lt;/span&gt; &lt;span class="err"&gt;by&lt;/span&gt; &lt;span class="err"&gt;unrelated&lt;/span&gt; &lt;span class="err"&gt;parties.&lt;/span&gt; &lt;span class="err"&gt;Each&lt;/span&gt;
&lt;span class="err"&gt;however,&lt;/span&gt; &lt;span class="err"&gt;has&lt;/span&gt; &lt;span class="err"&gt;chosen&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;libcurl&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;implement&lt;/span&gt; &lt;span class="err"&gt;http&lt;/span&gt; &lt;span class="err"&gt;transactions.&lt;/span&gt; &lt;span class="err"&gt;Now&lt;/span&gt; &lt;span class="err"&gt;libcurl&lt;/span&gt;
&lt;span class="err"&gt;requires&lt;/span&gt; &lt;span class="err"&gt;exactly&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;call&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;curl_global_init(),&lt;/span&gt; &lt;span class="err"&gt;but&lt;/span&gt; &lt;span class="err"&gt;each&lt;/span&gt; &lt;span class="err"&gt;thread&lt;/span&gt; &lt;span class="err"&gt;also&lt;/span&gt; &lt;span class="err"&gt;needs&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt;
&lt;span class="err"&gt;call&lt;/span&gt; &lt;span class="err"&gt;curl_easy_init()&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;obtain&lt;/span&gt; &lt;span class="err"&gt;its&lt;/span&gt; &lt;span class="err"&gt;own&lt;/span&gt; &lt;span class="err"&gt;handle.&lt;/span&gt; &lt;span class="err"&gt;Since&lt;/span&gt; &lt;span class="err"&gt;all&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;threads&lt;/span&gt; &lt;span class="err"&gt;get&lt;/span&gt;
&lt;span class="err"&gt;instantiated&lt;/span&gt; &lt;span class="err"&gt;at&lt;/span&gt; &lt;span class="err"&gt;program&lt;/span&gt; &lt;span class="err"&gt;start,&lt;/span&gt; &lt;span class="err"&gt;jmotion&lt;/span&gt; &lt;span class="err"&gt;provides&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt; &lt;span class="err"&gt;shared&lt;/span&gt; &lt;span class="err"&gt;variables&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
&lt;span class="err"&gt;shared&lt;/span&gt; &lt;span class="err"&gt;Core_Runtime&lt;/span&gt; &lt;span class="err"&gt;data&lt;/span&gt; &lt;span class="err"&gt;structure&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;ensuring&lt;/span&gt; &lt;span class="err"&gt;serial&lt;/span&gt; &lt;span class="err"&gt;execution&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;such&lt;/span&gt;
&lt;span class="err"&gt;initialization&lt;/span&gt; &lt;span class="err"&gt;routines.&lt;/span&gt;

&lt;span class="err"&gt;1)&lt;/span&gt; &lt;span class="err"&gt;"global_lock"&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;mutex&lt;/span&gt; &lt;span class="err"&gt;may&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;used&lt;/span&gt; &lt;span class="err"&gt;by&lt;/span&gt; &lt;span class="err"&gt;modules&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;prevent&lt;/span&gt; &lt;span class="err"&gt;concurrent&lt;/span&gt;
   &lt;span class="err"&gt;thread&lt;/span&gt; &lt;span class="err"&gt;execution&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;critical&lt;/span&gt; &lt;span class="err"&gt;sections.&lt;/span&gt; &lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;similar&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;legacy&lt;/span&gt; &lt;span class="err"&gt;linux&lt;/span&gt;
   &lt;span class="err"&gt;kernel's&lt;/span&gt; &lt;span class="err"&gt;big&lt;/span&gt; &lt;span class="err"&gt;kernel&lt;/span&gt; &lt;span class="err"&gt;lock&lt;/span&gt; &lt;span class="err"&gt;(BKL).&lt;/span&gt;

&lt;span class="err"&gt;2)&lt;/span&gt; &lt;span class="err"&gt;"symbol_list"&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;null&lt;/span&gt; &lt;span class="err"&gt;terminated&lt;/span&gt; &lt;span class="err"&gt;list&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;strings,&lt;/span&gt; &lt;span class="err"&gt;storing&lt;/span&gt; &lt;span class="err"&gt;process-wide&lt;/span&gt;
   &lt;span class="err"&gt;initializations&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;have&lt;/span&gt; &lt;span class="err"&gt;been&lt;/span&gt; &lt;span class="err"&gt;performed.&lt;/span&gt; &lt;span class="err"&gt;In&lt;/span&gt; &lt;span class="err"&gt;our&lt;/span&gt; &lt;span class="err"&gt;above&lt;/span&gt; &lt;span class="err"&gt;example,&lt;/span&gt; &lt;span class="err"&gt;if&lt;/span&gt;
   &lt;span class="err"&gt;"input_http.so"&lt;/span&gt; &lt;span class="err"&gt;gets&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;run&lt;/span&gt; &lt;span class="err"&gt;first,&lt;/span&gt; &lt;span class="err"&gt;it&lt;/span&gt; &lt;span class="err"&gt;acquires&lt;/span&gt; &lt;span class="err"&gt;"global_lock",&lt;/span&gt; &lt;span class="err"&gt;it&lt;/span&gt; &lt;span class="err"&gt;sees&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt;
   &lt;span class="err"&gt;"curl_global_init"&lt;/span&gt; &lt;span class="err"&gt;has&lt;/span&gt; &lt;span class="err"&gt;not&lt;/span&gt; &lt;span class="err"&gt;been&lt;/span&gt; &lt;span class="err"&gt;called,&lt;/span&gt; &lt;span class="err"&gt;so&lt;/span&gt; &lt;span class="err"&gt;it&lt;/span&gt; &lt;span class="err"&gt;calls&lt;/span&gt; &lt;span class="err"&gt;"curl_global_init()",&lt;/span&gt;
   &lt;span class="err"&gt;adds&lt;/span&gt; &lt;span class="err"&gt;"curl_global_init"&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;"symbol_list"&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;releases&lt;/span&gt; &lt;span class="err"&gt;"global_lock".&lt;/span&gt; &lt;span class="err"&gt;When&lt;/span&gt;
   &lt;span class="err"&gt;"output_s3.so"&lt;/span&gt; &lt;span class="err"&gt;runs,&lt;/span&gt; &lt;span class="err"&gt;it&lt;/span&gt; &lt;span class="err"&gt;doesn't&lt;/span&gt; &lt;span class="err"&gt;call&lt;/span&gt; &lt;span class="err"&gt;"curl_global_init()"&lt;/span&gt; &lt;span class="err"&gt;because&lt;/span&gt; &lt;span class="err"&gt;sees&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
   &lt;span class="err"&gt;symbol&lt;/span&gt; &lt;span class="err"&gt;already&lt;/span&gt; &lt;span class="err"&gt;exists&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;list.&lt;/span&gt;

&lt;span class="err"&gt;Note&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;jmotion&lt;/span&gt; &lt;span class="err"&gt;does&lt;/span&gt; &lt;span class="err"&gt;NOT&lt;/span&gt; &lt;span class="err"&gt;make&lt;/span&gt; &lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;2x&lt;/span&gt; &lt;span class="err"&gt;above&lt;/span&gt; &lt;span class="err"&gt;variables.&lt;/span&gt; &lt;span class="err"&gt;They&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt;
&lt;span class="err"&gt;provided&lt;/span&gt; &lt;span class="err"&gt;solely&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;modules.&lt;/span&gt; &lt;span class="err"&gt;Incidentally,&lt;/span&gt; &lt;span class="err"&gt;each&lt;/span&gt; &lt;span class="err"&gt;stanza&lt;/span&gt; &lt;span class="err"&gt;(ie,&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;instance)&lt;/span&gt;
&lt;span class="err"&gt;has&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;"loop"&lt;/span&gt; &lt;span class="err"&gt;counter.&lt;/span&gt; &lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;counter&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;incremented&lt;/span&gt; &lt;span class="err"&gt;each&lt;/span&gt; &lt;span class="err"&gt;time&lt;/span&gt; &lt;span class="err"&gt;jmotion&lt;/span&gt; &lt;span class="err"&gt;invokes&lt;/span&gt;
&lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;module's&lt;/span&gt; &lt;span class="err"&gt;handler()&lt;/span&gt; &lt;span class="err"&gt;function.&lt;/span&gt; &lt;span class="err"&gt;Thus,&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;can&lt;/span&gt; &lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;counter&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt;
&lt;span class="err"&gt;perform&lt;/span&gt; &lt;span class="err"&gt;one&lt;/span&gt; &lt;span class="err"&gt;time&lt;/span&gt; &lt;span class="err"&gt;initialization.&lt;/span&gt;

&lt;span class="err"&gt;To&lt;/span&gt; &lt;span class="err"&gt;simplify&lt;/span&gt; &lt;span class="err"&gt;interaction&lt;/span&gt; &lt;span class="err"&gt;with&lt;/span&gt; &lt;span class="err"&gt;"symbol_list",&lt;/span&gt; &lt;span class="err"&gt;jmotion&lt;/span&gt; &lt;span class="err"&gt;provides&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;following&lt;/span&gt;
&lt;span class="err"&gt;functions,&lt;/span&gt; &lt;span class="err"&gt;they&lt;/span&gt; &lt;span class="err"&gt;all&lt;/span&gt; &lt;span class="err"&gt;return&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;on&lt;/span&gt; &lt;span class="err"&gt;success,&lt;/span&gt; &lt;span class="err"&gt;otherwise&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;int&lt;/span&gt; &lt;span class="err"&gt;symbol_list_get&lt;/span&gt; &lt;span class="err"&gt;(char&lt;/span&gt; &lt;span class="err"&gt;*symbol)&lt;/span&gt; &lt;span class="c1"&gt;; // check if symbol is present&lt;/span&gt;
  &lt;span class="err"&gt;int&lt;/span&gt; &lt;span class="err"&gt;symbol_list_set&lt;/span&gt; &lt;span class="err"&gt;(char&lt;/span&gt; &lt;span class="err"&gt;*symbol)&lt;/span&gt; &lt;span class="c1"&gt;; // adds the specified symbol&lt;/span&gt;
  &lt;span class="err"&gt;int&lt;/span&gt; &lt;span class="err"&gt;symbol_list_del&lt;/span&gt; &lt;span class="err"&gt;(char&lt;/span&gt; &lt;span class="err"&gt;*symbol)&lt;/span&gt; &lt;span class="c1"&gt;; // removes the specified symbol&lt;/span&gt;

&lt;span class="err"&gt;Note&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;caller&lt;/span&gt; &lt;span class="err"&gt;should&lt;/span&gt; &lt;span class="err"&gt;still&lt;/span&gt; &lt;span class="err"&gt;acquire&lt;/span&gt; &lt;span class="err"&gt;"global_lock"&lt;/span&gt; &lt;span class="err"&gt;when&lt;/span&gt; &lt;span class="err"&gt;calling&lt;/span&gt; &lt;span class="err"&gt;any&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt;
&lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;routines.&lt;/span&gt;

&lt;span class="k"&gt;[ Module Operation ]&lt;/span&gt;

&lt;span class="err"&gt;Each&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instance&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;essentially&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;dedicated&lt;/span&gt; &lt;span class="err"&gt;thread&lt;/span&gt; &lt;span class="err"&gt;executing&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;main&lt;/span&gt; &lt;span class="err"&gt;loop.&lt;/span&gt;
&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;loop&lt;/span&gt; &lt;span class="err"&gt;consists&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;executing&lt;/span&gt; &lt;span class="err"&gt;modules&lt;/span&gt; &lt;span class="err"&gt;(if&lt;/span&gt; &lt;span class="err"&gt;present)&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;each&lt;/span&gt; &lt;span class="err"&gt;stage,&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
&lt;span class="err"&gt;following&lt;/span&gt; &lt;span class="err"&gt;order&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;1.&lt;/span&gt; &lt;span class="err"&gt;input&lt;/span&gt;
  &lt;span class="err"&gt;2.&lt;/span&gt; &lt;span class="err"&gt;noise&lt;/span&gt;
  &lt;span class="err"&gt;3.&lt;/span&gt; &lt;span class="err"&gt;motion_mask&lt;/span&gt;
  &lt;span class="err"&gt;4.&lt;/span&gt; &lt;span class="err"&gt;detection&lt;/span&gt;
  &lt;span class="err"&gt;5.&lt;/span&gt; &lt;span class="err"&gt;output&lt;/span&gt;

&lt;span class="err"&gt;Each&lt;/span&gt; &lt;span class="err"&gt;stage&lt;/span&gt; &lt;span class="err"&gt;may&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;comprised&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;zero&lt;/span&gt; &lt;span class="err"&gt;or&lt;/span&gt; &lt;span class="err"&gt;more&lt;/span&gt; &lt;span class="err"&gt;modules.&lt;/span&gt; &lt;span class="err"&gt;If&lt;/span&gt; &lt;span class="err"&gt;more&lt;/span&gt; &lt;span class="err"&gt;than&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt;
&lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;present&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;particular&lt;/span&gt; &lt;span class="err"&gt;stage,&lt;/span&gt; &lt;span class="err"&gt;they&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt; &lt;span class="err"&gt;invoked&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;order&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;they&lt;/span&gt; &lt;span class="err"&gt;were&lt;/span&gt;
&lt;span class="err"&gt;declared&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;configuration&lt;/span&gt; &lt;span class="err"&gt;file.&lt;/span&gt;

&lt;span class="err"&gt;At&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;start&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;each&lt;/span&gt; &lt;span class="err"&gt;loop,&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;first&lt;/span&gt; &lt;span class="err"&gt;input&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;expected&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;acquire&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt;
&lt;span class="err"&gt;fresh&lt;/span&gt; &lt;span class="err"&gt;frame&lt;/span&gt; &lt;span class="err"&gt;from&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;camera.&lt;/span&gt; &lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;responsible&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;placing&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;newly&lt;/span&gt;
&lt;span class="err"&gt;acquired&lt;/span&gt; &lt;span class="err"&gt;frame&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;"Camera-&amp;gt;frame_buf".&lt;/span&gt; &lt;span class="err"&gt;If&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;pointer&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;NULL,&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt;
&lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;expected&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;allocate&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;suitably&lt;/span&gt; &lt;span class="err"&gt;sized&lt;/span&gt; &lt;span class="err"&gt;buffer,&lt;/span&gt; &lt;span class="err"&gt;saving&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;size&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt;
&lt;span class="err"&gt;buffer&lt;/span&gt; &lt;span class="err"&gt;into&lt;/span&gt; &lt;span class="err"&gt;"Camera-&amp;gt;frame_total".&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;actual&lt;/span&gt; &lt;span class="err"&gt;amount&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;data&lt;/span&gt; &lt;span class="err"&gt;used&lt;/span&gt; &lt;span class="err"&gt;should&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt;
&lt;span class="err"&gt;reflected&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;"Camera-&amp;gt;frame_used".&lt;/span&gt; &lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;frame&lt;/span&gt; &lt;span class="err"&gt;buffer&lt;/span&gt; &lt;span class="err"&gt;should&lt;/span&gt; &lt;span class="err"&gt;then&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;treated&lt;/span&gt; &lt;span class="err"&gt;as&lt;/span&gt;
&lt;span class="err"&gt;read-only&lt;/span&gt; &lt;span class="err"&gt;by&lt;/span&gt; &lt;span class="err"&gt;subsequent&lt;/span&gt; &lt;span class="err"&gt;modules.&lt;/span&gt; &lt;span class="err"&gt;Typically,&lt;/span&gt; &lt;span class="err"&gt;we&lt;/span&gt; &lt;span class="err"&gt;do&lt;/span&gt; &lt;span class="err"&gt;not&lt;/span&gt; &lt;span class="err"&gt;want&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;keep&lt;/span&gt; &lt;span class="err"&gt;reallocating&lt;/span&gt;
&lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;buffer&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;fit&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;frame&lt;/span&gt; &lt;span class="err"&gt;we&lt;/span&gt; &lt;span class="err"&gt;place&lt;/span&gt; &lt;span class="err"&gt;here,&lt;/span&gt; &lt;span class="err"&gt;so&lt;/span&gt; &lt;span class="err"&gt;we&lt;/span&gt; &lt;span class="err"&gt;only&lt;/span&gt; &lt;span class="err"&gt;grow&lt;/span&gt; &lt;span class="err"&gt;"Camera-&amp;gt;total"&lt;/span&gt;
&lt;span class="err"&gt;when&lt;/span&gt; &lt;span class="err"&gt;needed,&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;set&lt;/span&gt; &lt;span class="err"&gt;"Camera-&amp;gt;frame_used"&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;reflect&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;current&lt;/span&gt; &lt;span class="err"&gt;frame&lt;/span&gt; &lt;span class="err"&gt;length.&lt;/span&gt;

&lt;span class="k"&gt;[ Stages, and what's expected of them ]&lt;/span&gt;

&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;"input"&lt;/span&gt; &lt;span class="err"&gt;stage&lt;/span&gt;

&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Writes&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;freshly&lt;/span&gt; &lt;span class="err"&gt;captured&lt;/span&gt; &lt;span class="err"&gt;frame&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;frame_buf",&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;buffer's&lt;/span&gt; &lt;span class="err"&gt;size&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt;
  &lt;span class="err"&gt;"cam-&amp;gt;frame_total"&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;frame_used"&lt;/span&gt; &lt;span class="err"&gt;indicates&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;actual&lt;/span&gt; &lt;span class="err"&gt;number&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;data&lt;/span&gt; &lt;span class="err"&gt;bytes&lt;/span&gt; &lt;span class="err"&gt;used&lt;/span&gt; &lt;span class="err"&gt;(in&lt;/span&gt; &lt;span class="err"&gt;case&lt;/span&gt;
  &lt;span class="err"&gt;subsequent&lt;/span&gt; &lt;span class="err"&gt;frames&lt;/span&gt; &lt;span class="err"&gt;shrink).&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;expected&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;poll/pause&lt;/span&gt; &lt;span class="err"&gt;as&lt;/span&gt; &lt;span class="err"&gt;required.&lt;/span&gt; &lt;span class="err"&gt;For&lt;/span&gt; &lt;span class="err"&gt;example,&lt;/span&gt; &lt;span class="err"&gt;if&lt;/span&gt; &lt;span class="err"&gt;we&lt;/span&gt; &lt;span class="err"&gt;want&lt;/span&gt;
  &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;capture&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;fresh&lt;/span&gt; &lt;span class="err"&gt;frame&lt;/span&gt; &lt;span class="err"&gt;every&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt; &lt;span class="err"&gt;seconds,&lt;/span&gt; &lt;span class="err"&gt;then&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;responsible&lt;/span&gt;
  &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;sleep()'ing&lt;/span&gt; &lt;span class="err"&gt;as&lt;/span&gt; &lt;span class="err"&gt;necessary.&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;expected&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;decompress&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;(jpeg)&lt;/span&gt; &lt;span class="err"&gt;image.&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;raw&lt;/span&gt; &lt;span class="err"&gt;pixels&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt;
  &lt;span class="err"&gt;placed&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;img_buf".&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;size&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;this&lt;/span&gt; &lt;span class="err"&gt;buffer&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;img_total".&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;decompressed&lt;/span&gt; &lt;span class="err"&gt;image&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;img_width"&lt;/span&gt; &lt;span class="err"&gt;by&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;img_height",&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;its&lt;/span&gt;
  &lt;span class="err"&gt;color&lt;/span&gt; &lt;span class="err"&gt;depth&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;depth".&lt;/span&gt;

&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;"noise"&lt;/span&gt; &lt;span class="err"&gt;stage&lt;/span&gt;

&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Compare&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;prev_buf"&lt;/span&gt; &lt;span class="err"&gt;with&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;img_buf",&lt;/span&gt; &lt;span class="err"&gt;build/update&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;heatmap&lt;/span&gt;
  &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;heatmap".&lt;/span&gt; &lt;span class="err"&gt;To&lt;/span&gt; &lt;span class="err"&gt;determine&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;change,&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;pixel&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;considered&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt;
  &lt;span class="err"&gt;change&lt;/span&gt; &lt;span class="err"&gt;if&lt;/span&gt; &lt;span class="err"&gt;its&lt;/span&gt; &lt;span class="err"&gt;neighboring&lt;/span&gt; &lt;span class="err"&gt;pixels&lt;/span&gt; &lt;span class="err"&gt;all&lt;/span&gt; &lt;span class="err"&gt;exhibit&lt;/span&gt; &lt;span class="err"&gt;change.&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;heatmap&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;maintained&lt;/span&gt; &lt;span class="err"&gt;at&lt;/span&gt; &lt;span class="err"&gt;cam-&amp;gt;heatmap,&lt;/span&gt; &lt;span class="err"&gt;which&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;expected&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt;
  &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;array&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;double,&lt;/span&gt; &lt;span class="err"&gt;with&lt;/span&gt; &lt;span class="err"&gt;values&lt;/span&gt; &lt;span class="err"&gt;between&lt;/span&gt; &lt;span class="err"&gt;0.0&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;1.0.&lt;/span&gt;

&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;"motion_mask"&lt;/span&gt; &lt;span class="err"&gt;stage&lt;/span&gt;

&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Certain&lt;/span&gt; &lt;span class="err"&gt;kinda&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;artifacts&lt;/span&gt; &lt;span class="err"&gt;ought&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;ignored.&lt;/span&gt; &lt;span class="err"&gt;For&lt;/span&gt; &lt;span class="err"&gt;example,&lt;/span&gt; &lt;span class="err"&gt;on&lt;/span&gt; &lt;span class="err"&gt;IR&lt;/span&gt;
  &lt;span class="err"&gt;illuminated&lt;/span&gt; &lt;span class="err"&gt;cameras,&lt;/span&gt; &lt;span class="err"&gt;rain&lt;/span&gt; &lt;span class="err"&gt;appears&lt;/span&gt; &lt;span class="err"&gt;as&lt;/span&gt; &lt;span class="err"&gt;white&lt;/span&gt; &lt;span class="err"&gt;streaks.&lt;/span&gt; &lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;where&lt;/span&gt; &lt;span class="err"&gt;custom&lt;/span&gt;
  &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;masking&lt;/span&gt; &lt;span class="err"&gt;algorithms&lt;/span&gt; &lt;span class="err"&gt;may&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;applied.&lt;/span&gt;

&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;"detection"&lt;/span&gt; &lt;span class="err"&gt;stage&lt;/span&gt;

&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Inspect&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;heatmap,&lt;/span&gt; &lt;span class="err"&gt;determine&lt;/span&gt; &lt;span class="err"&gt;which&lt;/span&gt; &lt;span class="err"&gt;pixels&lt;/span&gt; &lt;span class="err"&gt;will&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;used&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt;
  &lt;span class="err"&gt;detection.&lt;/span&gt; &lt;span class="err"&gt;From&lt;/span&gt; &lt;span class="err"&gt;that&lt;/span&gt; &lt;span class="err"&gt;point,&lt;/span&gt; &lt;span class="err"&gt;determine&lt;/span&gt; &lt;span class="err"&gt;how&lt;/span&gt; &lt;span class="err"&gt;much&lt;/span&gt; &lt;span class="err"&gt;change&lt;/span&gt; &lt;span class="err"&gt;has&lt;/span&gt; &lt;span class="err"&gt;occured&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;set&lt;/span&gt;
  &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;motion_detected"&lt;/span&gt; &lt;span class="err"&gt;flag&lt;/span&gt; &lt;span class="err"&gt;if&lt;/span&gt; &lt;span class="err"&gt;so.&lt;/span&gt;

&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;"output"&lt;/span&gt; &lt;span class="err"&gt;stage&lt;/span&gt;

&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Save&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;original&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;image&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;frame_buf",&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;length&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;frame_used"&lt;/span&gt;
  &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;file.&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;If&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;motion_detected"&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;set,&lt;/span&gt; &lt;span class="err"&gt;save&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;original&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;image&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
  &lt;span class="err"&gt;"motion_dir"&lt;/span&gt; &lt;span class="err"&gt;directory.&lt;/span&gt;

&lt;span class="err"&gt;(end&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;cycle)&lt;/span&gt;

&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;thread&lt;/span&gt; &lt;span class="err"&gt;engine&lt;/span&gt; &lt;span class="err"&gt;automatically&lt;/span&gt; &lt;span class="err"&gt;copies&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;contents&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;img_buf"&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt;
  &lt;span class="err"&gt;"cam-&amp;gt;prev_buf".&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;dimensions&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;depth&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;subsequent&lt;/span&gt; &lt;span class="err"&gt;frames&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt;
  &lt;span class="err"&gt;expected&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;remain&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;same.&lt;/span&gt;

&lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;Set&lt;/span&gt; &lt;span class="err"&gt;"cam-&amp;gt;motion_detected"&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;0.&lt;/span&gt;

&lt;span class="k"&gt;[ Logging ]&lt;/span&gt;

&lt;span class="err"&gt;Whether&lt;/span&gt; &lt;span class="err"&gt;events&lt;/span&gt; &lt;span class="err"&gt;originate&lt;/span&gt; &lt;span class="err"&gt;from&lt;/span&gt; &lt;span class="err"&gt;within&lt;/span&gt; &lt;span class="err"&gt;jmotion,&lt;/span&gt; &lt;span class="err"&gt;or&lt;/span&gt; &lt;span class="err"&gt;from&lt;/span&gt; &lt;span class="err"&gt;modules,&lt;/span&gt; &lt;span class="err"&gt;logging&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt;
&lt;span class="err"&gt;configured&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;main&lt;/span&gt; &lt;span class="err"&gt;config&lt;/span&gt; &lt;span class="err"&gt;file,&lt;/span&gt; &lt;span class="err"&gt;using&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;following&lt;/span&gt; &lt;span class="err"&gt;statements&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;global&lt;/span&gt;
  &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;log_basedir&lt;/span&gt; &lt;span class="err"&gt;"&amp;lt;dirname&amp;gt;"&lt;/span&gt;
    &lt;span class="err"&gt;log_maxsize&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;bytes&amp;gt;&lt;/span&gt;
    &lt;span class="err"&gt;log_rotations&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;num&amp;gt;&lt;/span&gt;
    &lt;span class="err"&gt;log_level&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;num&amp;gt;&lt;/span&gt;
  &lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="err"&gt;Modules&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt; &lt;span class="err"&gt;encouraged&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;jmotion&lt;/span&gt; &lt;span class="err"&gt;function&lt;/span&gt; &lt;span class="err"&gt;which&lt;/span&gt; &lt;span class="err"&gt;returns&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;on&lt;/span&gt; &lt;span class="err"&gt;success,&lt;/span&gt;
&lt;span class="err"&gt;otherwise&lt;/span&gt; &lt;span class="err"&gt;0.&lt;/span&gt;

  &lt;span class="err"&gt;int&lt;/span&gt; &lt;span class="err"&gt;f_log&lt;/span&gt; &lt;span class="err"&gt;(char&lt;/span&gt; &lt;span class="err"&gt;*ident,&lt;/span&gt; &lt;span class="err"&gt;int&lt;/span&gt; &lt;span class="err"&gt;level,&lt;/span&gt; &lt;span class="err"&gt;char&lt;/span&gt; &lt;span class="err"&gt;*format,&lt;/span&gt; &lt;span class="err"&gt;...)&lt;/span&gt;

&lt;span class="err"&gt;Where,&lt;/span&gt;

  &lt;span class="err"&gt;ident&lt;/span&gt;       &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;identity&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;caller&lt;/span&gt; &lt;span class="err"&gt;(typically&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;macro&lt;/span&gt; &lt;span class="err"&gt;"__func__")&lt;/span&gt;
  &lt;span class="err"&gt;level&lt;/span&gt;       &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;LOG_DEBUG&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;LOG_CRIT,&lt;/span&gt; &lt;span class="err"&gt;see&lt;/span&gt; &lt;span class="err"&gt;syslog(3)&lt;/span&gt;
  &lt;span class="err"&gt;format,...&lt;/span&gt;  &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;event&lt;/span&gt; &lt;span class="err"&gt;string&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;subsequent&lt;/span&gt; &lt;span class="err"&gt;arguments&lt;/span&gt;

&lt;span class="err"&gt;Eg,&lt;/span&gt;

  &lt;span class="err"&gt;f_log&lt;/span&gt; &lt;span class="err"&gt;("output_jpeg",&lt;/span&gt; &lt;span class="err"&gt;LOG_ERR,&lt;/span&gt; &lt;span class="err"&gt;"Cannot&lt;/span&gt; &lt;span class="err"&gt;write&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;%s",&lt;/span&gt; &lt;span class="err"&gt;myfile)&lt;/span&gt; &lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="err"&gt;Thus,&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;running&lt;/span&gt; &lt;span class="err"&gt;under&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;instance&lt;/span&gt; &lt;span class="err"&gt;name&lt;/span&gt; &lt;span class="err"&gt;"foo"&lt;/span&gt; &lt;span class="err"&gt;will&lt;/span&gt; &lt;span class="err"&gt;have&lt;/span&gt; &lt;span class="err"&gt;its&lt;/span&gt; &lt;span class="err"&gt;events&lt;/span&gt;
&lt;span class="err"&gt;delivered&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;file&lt;/span&gt; &lt;span class="err"&gt;"/path/to/basedir/foo.log".&lt;/span&gt; &lt;span class="err"&gt;Incidentally,&lt;/span&gt; &lt;span class="err"&gt;events&lt;/span&gt; &lt;span class="err"&gt;which&lt;/span&gt;
&lt;span class="err"&gt;originate&lt;/span&gt; &lt;span class="err"&gt;from&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;core&lt;/span&gt; &lt;span class="err"&gt;jmotion&lt;/span&gt; &lt;span class="err"&gt;engine&lt;/span&gt; &lt;span class="err"&gt;are&lt;/span&gt; &lt;span class="err"&gt;logged&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;"jmotion.log".&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt;
&lt;span class="err"&gt;initial&lt;/span&gt; &lt;span class="err"&gt;log&lt;/span&gt; &lt;span class="err"&gt;level&lt;/span&gt; &lt;span class="err"&gt;can&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;set&lt;/span&gt; &lt;span class="err"&gt;via&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;"LOG_LEVEL"&lt;/span&gt; &lt;span class="err"&gt;environment&lt;/span&gt; &lt;span class="err"&gt;variable.&lt;/span&gt;

&lt;span class="k"&gt;[ Minimal Configuration ]&lt;/span&gt;

&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;following&lt;/span&gt; &lt;span class="err"&gt;configuration&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;simplest&lt;/span&gt; &lt;span class="err"&gt;possible&lt;/span&gt; &lt;span class="err"&gt;working&lt;/span&gt; &lt;span class="err"&gt;setup,&lt;/span&gt; &lt;span class="err"&gt;which&lt;/span&gt;
&lt;span class="err"&gt;pulls&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;image&lt;/span&gt; &lt;span class="err"&gt;from&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;usb&lt;/span&gt; &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;writes&lt;/span&gt; &lt;span class="err"&gt;it&lt;/span&gt; &lt;span class="err"&gt;periodically&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;file.&lt;/span&gt; &lt;span class="err"&gt;It&lt;/span&gt;
&lt;span class="err"&gt;does&lt;/span&gt; &lt;span class="err"&gt;not&lt;/span&gt; &lt;span class="err"&gt;perform&lt;/span&gt; &lt;span class="err"&gt;any&lt;/span&gt; &lt;span class="err"&gt;processing&lt;/span&gt; &lt;span class="err"&gt;(ie,&lt;/span&gt; &lt;span class="err"&gt;no&lt;/span&gt; &lt;span class="err"&gt;motion&lt;/span&gt; &lt;span class="err"&gt;detection,&lt;/span&gt; &lt;span class="err"&gt;no&lt;/span&gt; &lt;span class="err"&gt;image&lt;/span&gt; &lt;span class="err"&gt;archiving,&lt;/span&gt;
&lt;span class="err"&gt;etc).&lt;/span&gt;

  &lt;span class="err"&gt;camera&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;name&lt;/span&gt; &lt;span class="err"&gt;"mycam1"&lt;/span&gt;
    &lt;span class="err"&gt;input&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;"input_v4l2.so"&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;output&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;module&lt;/span&gt; &lt;span class="err"&gt;"output_jpeg.so"&lt;/span&gt;
      &lt;span class="err"&gt;params&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;cur_frame&lt;/span&gt; &lt;span class="err"&gt;"/tmp/mycam1.jpg"&lt;/span&gt;
      &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;[ Signal Handler ]&lt;/span&gt;

&lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;jmotion&lt;/span&gt; &lt;span class="err"&gt;program&lt;/span&gt; &lt;span class="err"&gt;supports&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;following&lt;/span&gt; &lt;span class="err"&gt;signals&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt;

  &lt;span class="err"&gt;SIGHUP&lt;/span&gt;  &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;dumps&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;current&lt;/span&gt; &lt;span class="err"&gt;runtime&lt;/span&gt; &lt;span class="err"&gt;info&lt;/span&gt;
  &lt;span class="err"&gt;SIGUSR1&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;decrements&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;log&lt;/span&gt; &lt;span class="err"&gt;level&lt;/span&gt;
  &lt;span class="err"&gt;SIGUSR2&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;increments&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;log&lt;/span&gt; &lt;span class="err"&gt;level&lt;/span&gt;
  &lt;span class="err"&gt;SIGINT&lt;/span&gt;  &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;performs&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;orderly&lt;/span&gt; &lt;span class="err"&gt;shutdown&lt;/span&gt;
  &lt;span class="err"&gt;SIGTERM&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;performs&lt;/span&gt; &lt;span class="err"&gt;an&lt;/span&gt; &lt;span class="err"&gt;orderly&lt;/span&gt; &lt;span class="err"&gt;shutdown&lt;/span&gt;
  &lt;span class="err"&gt;SIGALRM&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;watchdog&lt;/span&gt; &lt;span class="err"&gt;timer&lt;/span&gt; &lt;span class="err"&gt;(for&lt;/span&gt; &lt;span class="err"&gt;internal&lt;/span&gt; &lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;only)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">James Tay</dc:creator><pubDate>Thu, 01 Jan 2015 20:14:11 -0000</pubDate><guid>https://sourceforge.net2b31ec7ec57a0e9098e229742c9f8995d49314a8</guid></item><item><title>Home modified by James Tay</title><link>https://sourceforge.net/p/jmotion/wiki/Home/</link><description>&lt;div class="markdown_content"&gt;&lt;p&gt;Welcome to your wiki!&lt;/p&gt;
&lt;p&gt;This is the default page, edit it as you see fit. To add a new page simply reference it within brackets, e.g.: &lt;span&gt;[SamplePage]&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The wiki uses &lt;a class="" href="/p/jmotion/wiki/markdown_syntax"&gt;Markdown&lt;/a&gt; syntax.&lt;/p&gt;
&lt;p&gt;&lt;h6&gt;Project Members:&lt;/h6&gt;
&lt;ul class="md-users-list"&gt;
&lt;li&gt;&lt;a href="/u/userid-2115812"&gt;James Tay&lt;/a&gt; (admin)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;span class="download-button-54a57d2d3e5e83725e0bd30a" style="margin-bottom: 1em; display: block;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">James Tay</dc:creator><pubDate>Thu, 01 Jan 2015 17:00:30 -0000</pubDate><guid>https://sourceforge.net4547fbd4ad391b35f9dd292fa9ffb4d57cea3de7</guid></item></channel></rss>