00001 // Copyright (C) 2006-2007 University of Louisiana at Lafayette 00002 // Authors: Suresh Golconda, Pablo Mejia 00003 00004 #ifndef CAJUN_TSTAMP_BUFFERING_H 00005 #define CAJUN_TSTAMP_BUFFERING_H 00006 00007 #include "data_type.H" 00008 00009 #include "util.H" 00010 00011 #include <deque> 00012 #include <vector> 00013 00014 namespace cajun 00015 { 00016 template <class T> class tstamp_buffering_t 00017 { 00018 public: 00019 tstamp_buffering_t () 00020 { 00021 m_last_tstamp = 0; 00022 m_expect_first_data = true; 00023 m_buffer_size = 1; 00024 } 00025 00026 tstamp_buffering_t (unsigned buffer_size_) 00027 { 00028 m_last_tstamp = 0; 00029 m_expect_first_data = true; 00030 m_buffer_size = buffer_size_; 00031 } 00032 00033 bool get_data (std::vector<T> &data_list_) 00034 { 00035 if (m_ready_list.empty ()) return false; 00036 data_list_ = m_ready_list.back (); 00037 if (m_ready_list.size () > 1) 00038 m_ready_list.pop_back (); 00039 return true; 00040 } 00041 00042 bool get_next_data (std::vector<T> &data_list_) 00043 { 00044 if (m_ready_list.empty ()) return false; 00045 data_list_ = m_ready_list.front (); 00046 // if (m_ready_list.size () > 1) 00047 m_ready_list.pop_front (); 00048 return true; 00049 } 00050 00051 bool data_available () 00052 { 00053 return ! m_ready_list.empty (); 00054 } 00055 00056 bool update_data (std::vector<T> &data_list_) 00057 { 00058 for (unsigned i = 0; i < data_list_.size (); i++) 00059 { 00060 // If its first data for the buffer, then update 00061 // last_tstamp value 00062 if (m_expect_first_data) 00063 { 00064 m_expect_first_data = false; 00065 m_last_tstamp = data_list_[i].tstamp; 00066 } 00067 00068 if (! are_equal (m_last_tstamp, data_list_[i].tstamp)) 00069 { 00070 m_last_tstamp = data_list_[i].tstamp; 00071 flush_buffer (); 00072 m_buffer_list.push_back (data_list_[i]); 00073 } 00074 else if (data_list_[i].packet_id + 1 == 00075 data_list_[i].total_packets) 00076 {// If last packet of the sequence 00077 m_expect_first_data = true; 00078 m_last_tstamp = data_list_[i].tstamp; 00079 m_buffer_list.push_back (data_list_[i]); 00080 flush_buffer (); 00081 } 00082 else 00083 m_buffer_list.push_back (data_list_[i]); 00084 } 00085 return true; 00086 } 00087 private: 00088 std::vector<T> m_buffer_list; 00089 std::deque< std::vector<T> > m_ready_list; 00090 00091 void flush_buffer () 00092 { 00093 // Move buffer to ready list 00094 m_ready_list.push_back (std::vector<T> ()); 00095 m_ready_list.back ().swap (m_buffer_list); 00096 if (m_ready_list.size () > m_buffer_size) 00097 { 00098 // printf ("tstamp_buffering_t : flushing buffer\n"); 00099 m_ready_list.pop_front (); 00100 } 00101 } 00102 00103 double m_last_tstamp; 00104 bool m_expect_first_data; 00105 unsigned m_buffer_size; 00106 }; 00107 }; 00108 00109 #endif