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 ////////////////////////////////////////////////////////////////////////////////