Dispatcher.cpp

Go to the documentation of this file.
00001 /*
00002 *       This file contains class that represents dispatcher between input (camera), frame queue
00003 *       and working units.
00004 *
00005 *       Author:
00006 *                       Tomas Mrkvicka
00007 *                       xmrkvi03@stud.fit.vutbr.cz
00008 *
00009 */
00010 #include <cassert>
00011 
00012 #include "pipeline/Dispatcher.h"
00013 
00014 ////////////////////////////////////////////////////////////////////////////////
00015 ////////////////////////////////////////////////////////////////////////////////
00016 ////////////////////////////////////////////////////////////////////////////////
00017 // TDispatcher
00018 
00019 /** Konstruktor.
00020 *
00021 *       \param  queue   [in] ukazatel na platnou frontu kam bude dispatcher predavat snimky
00022 *                                       Pokud je tento parametr NULL pak se senimky z dispatcheru dale neposilaji.
00023 */
00024 TDispatcher::TDispatcher( TFrameQueue * queue )
00025 {
00026         m_width         = 0;
00027         m_height        = 0;
00028 
00029         m_frame = NULL;
00030 
00031         m_queue = queue;
00032 }
00033 //OK 2007-08-25 14:23:38 B04-315B\Tom
00034 
00035 /** Destruktor.
00036 *
00037 *       Uvolni snimek z TDispatcher.
00038 */
00039 TDispatcher::~TDispatcher(void)
00040 {
00041         m_critical.Enter();
00042                 //musime odstranit predchozi snimek - pokud existuje
00043                 if( m_frame )
00044                 {
00045                         //existuje - mame nastaven zamek od tohoto objektu
00046                         m_frame->ReleaseLock();
00047                         //uvolnime
00048                         m_frame->Release();
00049 
00050                         m_frame = NULL;
00051                 }
00052         m_critical.Leave();
00053 }
00054 //OK 2007-08-25 14:23:40 B04-315B\Tom
00055 
00056 /** Pomoci teto metody se do dispatcheru nastavi informace o rozmerech
00057 *       predavanych snimku.
00058 *
00059 *       Tyto informace jsou pro vsechny snimky stejne a mohou byt vyuzity napr. pri
00060 *       pri inicializaci jednotek.
00061 *
00062 *       Tato metoda by mela byt volana ihned po zjisteni rozmeru snimku (z kamery).
00063 *
00064 *       \param  width   [in] sirka snimku v pixelech
00065 *       \param  height  [in] vyska snimku v pixelech
00066 */
00067 void TDispatcher::SetFramesInfo( DWORD width, DWORD height )
00068 {
00069         m_width         = width;
00070         m_height        = height;
00071 }
00072 //OK 2007-08-25 14:23:42 B04-315B\Tom
00073 
00074 /** Vlozeni noveho snimku.
00075 *
00076 *       Predchozi snimek je uvolnen (pokud existoval) a zaroven preposlan do 
00077 *       fronty snimku (pokud byla nastavena).
00078 *       Novy snimek je uzamcen a pocet referenci je zvysen.
00079 *
00080 *       \param  frame   [in] platny snimek - nesmi byt NULL
00081 */
00082 void TDispatcher::SetFrame( TFrameReal * frame)
00083 {
00084         m_critical.Enter();
00085                 //musime odstranit predchozi snimek - pokud existuje
00086                 if( m_frame )
00087                 {
00088                         //existuje - mame nastaven zamek od tohoto objektu
00089                         m_frame->ReleaseLock();
00090                         //uvolnime
00091                         m_frame->Release();
00092                 }
00093 
00094                 //nastavime novy snimek
00095                 m_frame = frame;
00096                 frame->AddLock();
00097                 frame->AddRefs();
00098 
00099                 //pridame snimek do fronty - pokud existuje
00100                 if ( m_queue )
00101                 {
00102                         m_queue->AddFrame(frame);
00103                 }
00104         m_critical.Leave();
00105 }
00106 //OK 2007-08-25 14:23:45 B04-315B\Tom
00107 
00108 /** Tato metoda uvolni aktualni snimek z dispatcheru.
00109 *
00110 *       Metoda by mela byt pouzita na konci aplikace pred odstranenim objektu.
00111 */
00112 void TDispatcher::Free(void)
00113 {
00114         m_critical.Enter();
00115                 if( m_frame )
00116                 {
00117                         //existuje - mame nastaven zamek od tohoto objektu
00118                         m_frame->ReleaseLock();
00119                         //uvolnime
00120                         m_frame->Release();
00121 
00122                         m_frame = NULL;
00123                 }
00124         m_critical.Leave();
00125 }
00126 //OK 2007-08-25 14:23:48 B04-315B\Tom
00127 
00128 /** Virtualni metoda vracejici sirku poskytovanych snimku v pixelech.
00129 */
00130 DWORD TDispatcher::GetWidth(void)
00131 {
00132         return m_width;
00133 }
00134 //OK 2007-08-25 14:23:54 B04-315B\Tom
00135 
00136 /** Virtualni metoda vracejici vysku poskytovanych snimku v pixelech.
00137 */
00138 DWORD TDispatcher::GetHeight(void)
00139 {
00140         return m_height;
00141 }
00142 //OK 2007-08-25 14:23:56 B04-315B\Tom
00143 
00144 /** Metoda vrati aktualne ulozeny snimek.
00145 *
00146 *       Metoda muze vratit NULL pokud zadny snimek neni prave ulozen (napr. pri startu programu)!!!
00147 *
00148 *       Metoda automaticky zvysi pocet referenci na snimek pri kazdem zavolani, volajici objekt
00149 *       je zodpovedny za spravnou praci s obdrzenou referenci!!!
00150 *
00151 */
00152 TFrame * TDispatcher::GetFrame(void)
00153 {
00154         TFrameReal * tmp = NULL;
00155 
00156         m_critical.Enter();
00157                 if( m_frame )
00158                 {
00159                         //snimek existuje
00160                         m_frame->AddRefs();
00161                         tmp = m_frame;
00162                 }
00163                 else
00164                 {
00165                         //zadny snimek neni v objektu ulozen - vraci se NULL
00166                 }
00167         m_critical.Leave();
00168 
00169         return tmp;
00170 }
00171 //OK 2007-08-25 14:23:59 B04-315B\Tom
00172 
00173 /** Metoda vrati aktualne ulozeny snimek.
00174 *
00175 *       Metoda muze vratit NULL pokud zadny snimek neni prave ulozen (napr. pri startu programu)!!!
00176 *
00177 *       Metoda automaticky zvysi pocet referenci na snimek pri kazdem zavolani, volajici objekt
00178 *       je zodpovedny za spravnou praci s obdrzenou referenci!!!
00179 *
00180 *       Zaroven metoda zvysi pocet zamku na snimku, coz muze byt vyhodne v pripade jednotek, ktere
00181 *       zamek na snimku vyzaduji.
00182 *
00183 */
00184 TFrame * TDispatcher::GetLockedFrame(void)
00185 {
00186         TFrameReal * tmp = NULL;
00187 
00188         m_critical.Enter();
00189                 if( m_frame )
00190                 {
00191                         m_frame->AddRefs();
00192                         m_frame->AddLock();
00193                         tmp = m_frame;
00194                 }
00195                 else
00196                 {
00197                         //zadny snimek v objektu
00198                 }
00199         m_critical.Leave();
00200 
00201         return tmp;
00202 }
00203 //OK 2007-08-25 14:24:05 B04-315B\Tom
00204 
00205 // TDispatcher
00206 ////////////////////////////////////////////////////////////////////////////////
00207 ////////////////////////////////////////////////////////////////////////////////
00208 ////////////////////////////////////////////////////////////////////////////////

Generated on Sat Nov 17 16:23:26 2007 for Image Processing Pipeline by  doxygen 1.4.6-NO