00001 /* 00002 * This file contains class that represents queue of frames that comes from 00003 * dispatcher and wait for displaying in renderer. 00004 * 00005 * Author: 00006 * Tomas Mrkvicka 00007 * xmrkvi03@stud.fit.vutbr.cz 00008 * 00009 */ 00010 00011 #include <queue> 00012 using namespace std; 00013 00014 // FORWARD DECLARATIONS 00015 namespace NSPipeline 00016 { 00017 class TFrameQueue; 00018 }; 00019 00020 #ifndef _PIPELINE_FRAMEQUEUE_HH_ 00021 #define _PIPELINE_FRAMEQUEUE_HH_ 00022 00023 #include "pipeline/Image.h" 00024 #include "pipeline/CriticalSection.h" 00025 00026 namespace NSPipeline 00027 { 00028 00029 //////////////////////////////////////////////////////////////////////////////// 00030 //////////////////////////////////////////////////////////////////////////////// 00031 //////////////////////////////////////////////////////////////////////////////// 00032 // TFrameQueue 00033 00034 /** Fronta snimku (FIFO). 00035 * 00036 * Obsahuje dve vnitrni fronty - vyrovnavaci buffer a vystupni frontu. 00037 * 00038 * Vnitrni buffer obsahuje snimky, ktere nelze zobrazit a zajistuje tedy plynulost zobrazovani. 00039 * Vystupni fronta pak obsahuje snimky, ktere vystoupily z vnitrniho bufferu a mohou byt 00040 * ziskany pro zobrazenu. 00041 * 00042 * Velikost vnitrniho bufferu lze menit za behu aplikace a tim urcovat zpozdeni. 00043 * 00044 * Pokud je snimek jeste zpracovavan nejakou jednotkou pak by vystupni fronta nemela pustit snimek 00045 * ven z fronty - to je zajisteno zamkem na snimku od dane jednotky. 00046 * 00047 * Fronta nema vlastni vlakno (neni to nutne), ale jeji metody jsou zabezpecene pro vicenasobny pristup. 00048 * 00049 * Vstupem snimku do fronty je tomuto zvysen pocet referenci. Fronta nikdy nezvysuje pocet zamku na snimku. 00050 * 00051 * Snimek je do fronty automaticky zaslan dispatcherem, kteremu je fronta predana jako parameter. 00052 * 00053 * Dulezita vlastnost je, ze jakmile je snimek ve fronte zarazen pak uz se nemuze zvysovat pocet zamku 00054 * na nem. Zamek totiz lze na snimek pridat pouze v dispatcheru. 00055 */ 00056 class TFrameQueue 00057 { 00058 //PUBLIC METHODS 00059 public: 00060 TFrameQueue(void); 00061 ~TFrameQueue(void); 00062 00063 void AddFrame( TFrameReal * frame); 00064 TFrameReal* GetRenderableFrame(void); 00065 00066 DWORD GetInputBufferLength(void) const; 00067 void SetInputBufferLength( DWORD length ); 00068 00069 void Free(void); 00070 00071 //PRIVATE FAKE METHODS 00072 private: 00073 TFrameQueue( const TFrameQueue & orig ); ///< falesny kopirovaci konstruktor 00074 void operator=( const TFrameQueue & orig ); ///< falesny operator prirazeni 00075 00076 //PRIVATE COMPONENTS 00077 private: 00078 DWORD m_length; ///< delka vnitrniho buffer 00079 00080 queue<TFrameReal*> m_buffer; ///< vnitrni buffer 00081 queue<TFrameReal*> m_frames; ///< vystupni fronta snimku 00082 00083 TCriticalSection m_critical; ///< kriticka sekce pro pristup ke snimkum z fronty 00084 00085 }; 00086 //OK 2007-08-25 12:07:09 B04-315B\Tom 00087 00088 // TFrameQueue 00089 //////////////////////////////////////////////////////////////////////////////// 00090 //////////////////////////////////////////////////////////////////////////////// 00091 //////////////////////////////////////////////////////////////////////////////// 00092 00093 }; //end of NSPipeline 00094 using namespace NSPipeline; 00095 00096 #endif