blob: 3367bd9c66dc798e923c921a9ff22cb72432eb68 [file] [log] [blame]
//-------------------------------------------------------------
// ____ _ _
// / ___|____ _ _ ____ ____| |__ | |
// | | / ___| | | | _ \/ ___| _ \| |
// | |___| | | |_| | | | | |___| | | ||_|
// \____|_| \_____|_| |_|\____|_| |_|(_) Media benchmarks
//
// 2006, Intel Corporation, licensed under Apache 2.0
//
// file : TrackingModelPthread.h
// author : Christian Bienia - cbienia@cs.princeton.edu
// Scott Ettinger - scott.m.ettinger@intel.com
// description : Observation model for kinematic tree body
// tracking threaded with Pthreads.
//
// modified :
//--------------------------------------------------------------
#ifndef TRACKINGMODELPTHREAD_H
#define TRACKINGMODELPTHREAD_H
#if defined(HAVE_CONFIG_H)
# include "config.h"
#endif
#include "TrackingModel.h"
#include "threads/WorkerGroup.h"
#include "threads/TicketDispenser.h"
#include "threads/Barrier.h"
#include "WorkPoolPthread.h"
#include "AsyncIO.h"
class TrackingModelPthread : public TrackingModel, public threads::Threadable {
public:
//constructor
TrackingModelPthread(WorkPoolPthread &_workers);
~TrackingModelPthread();
//Generate an edge map from the original camera image
void CreateEdgeMap(FlexImage8u &src, FlexImage8u &dst);
//entry function for worker threads
void Exec(threads::thread_cmd_t, threads::thread_rank_t);
//set number of frames to be loaded
void SetNumFrames(unsigned int n) {nFrames = n; };
//Load and process new observation data from image files for a given time(frame). Generates edge maps from the raw image files.
virtual bool GetObservation(float timeval);
//terminate IO thread
void close() { IOthread->Join(); };
private:
//the pool with the worker threads
WorkPoolPthread &workers;
threads::Barrier workInit;
threads::TicketDispenser<int> loopTickets;
AsyncImageLoader imageLoader;
threads::Thread *IOthread;
bool IOthreadStarted;
unsigned int nFrames;
//granularity of work unit for dynamic load balancing
const int WORKUNIT_SIZE_FILTERROW;
const int WORKUNIT_SIZE_FILTERCOLUMN;
const int WORKUNIT_SIZE_GRADIENT;
//inputs and outputs for GradientMagThresholdPthread
struct {
FlexImage8u *src;
float threshold;
FlexImage8u *gr;
} GradientArgs;
//inputs and outputs for FlexFilter* functions
struct {
FlexImage8u *src;
FlexImage8u *dst;
float *kernel;
int kernelSize;
bool allocate;
} FilterArgs;
//Generate an edge map from the original camera image
//Separable 7x7 gaussian filter
inline void GaussianBlurPthread(FlexImage8u *src, FlexImage8u *dst);
};
#endif //TRACKINGMODELPTHREAD_H