00001
00034 #pragma once
00035
00036
00037 #include <queue>
00038
00039
00040 #include <Shared/MediaSample.h>
00041
00043 class RtpDataQueue
00044 {
00045 public:
00046
00047 RtpDataQueue()
00048 :m_bHasBeenSyncedUsingRtcp(false)
00049 {;}
00050
00051 ~RtpDataQueue()
00052 {
00053 CAutoLock lock(&m_lock);
00054 while ( !m_qSamples.empty() )
00055 {
00056 MediaSample* pSample = m_qSamples.front();
00057 m_qSamples.pop();
00058 delete pSample;
00059 }
00060 }
00061
00062 void addMediaSample(unsigned char* data, unsigned dataSize, double dStartTime, bool bHasBeenRtcpSynchronised)
00063 {
00064 CAutoLock lock(&m_lock);
00065 if (!m_bHasBeenSyncedUsingRtcp)
00066 {
00067 if (bHasBeenRtcpSynchronised)
00068 {
00069 m_bHasBeenSyncedUsingRtcp = true;
00070
00071 MediaSample* pMediaSample = MediaSample::createMediaSample(data, dataSize, dStartTime, true);
00072 m_qSamples.push(pMediaSample);
00073 }
00074 }
00075
00076 MediaSample* pMediaSample = MediaSample::createMediaSample(data, dataSize, dStartTime );
00077 m_qSamples.push(pMediaSample);
00078 }
00079
00080 MediaSample* getNextSample()
00081 {
00082 CAutoLock lock(&m_lock);
00083 if (!m_qSamples.empty())
00084 {
00085 MediaSample* pSample = m_qSamples.front();
00086 m_qSamples.pop();
00087 return pSample;
00088 }
00089 return NULL;
00090 }
00091
00092 bool hasSamples()
00093 {
00094 CAutoLock lock(&m_lock);
00095 return !m_qSamples.empty();
00096 }
00097
00098 private:
00099 bool m_bHasBeenSyncedUsingRtcp;
00100
00101 CCritSec m_lock;
00102 std::queue<MediaSample*> m_qSamples;
00103 };