BufferMgr.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:5k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2. *  Openmysee
  3. *
  4. *  This program is free software; you can redistribute it and/or modify
  5. *  it under the terms of the GNU General Public License as published by
  6. *  the Free Software Foundation; either version 2 of the License, or
  7. *  (at your option) any later version.
  8. *
  9. *  This program is distributed in the hope that it will be useful,
  10. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. *  GNU General Public License for more details.
  13. *
  14. *  You should have received a copy of the GNU General Public License
  15. *  along with this program; if not, write to the Free Software
  16. *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. *
  18. */
  19. #ifndef __BUFFERMGR_H_
  20. #define __BUFFERMGR_H_
  21. #include <map>
  22. using namespace std;
  23. class MediaData {
  24. public:
  25. explicit MediaData() {
  26. memset(&videoType, 0, sizeof(videoType));
  27. memset(&audioType, 0, sizeof(audioType));
  28. videoData = audioData = NULL;
  29. };
  30. // 拷贝构造函数
  31. explicit MediaData(const MediaData& another) {
  32. videoType = another.videoType;
  33. audioType = another.audioType;
  34. videoData = new BYTE[videoType.cbFormat];
  35. audioData = new BYTE[audioType.cbFormat];
  36. memcpy(videoData, another.videoData, videoType.cbFormat);
  37. memcpy(audioData, another.audioData, audioType.cbFormat);
  38. };
  39. virtual ~MediaData() {
  40. delete [] videoData;
  41. delete [] audioData;
  42. };
  43. bool operator == (const MediaData& a) const {
  44. return (memcmp(&videoType, &a.videoType, sizeof(videoType)) == 0 && 
  45.             memcmp(&audioType, &a.audioType, sizeof(audioType)) == 0 && 
  46. memcmp(videoData, a.videoData, videoType.cbFormat) == 0 && 
  47. memcmp(audioData, a.audioData, audioType.cbFormat) == 0);
  48. };
  49. MediaData& operator=(const MediaData& another) {
  50. videoType = another.videoType;
  51. audioType = another.audioType;
  52. delete [] videoData;
  53. delete [] audioData;
  54. videoData = new BYTE[videoType.cbFormat];
  55. audioData = new BYTE[audioType.cbFormat];
  56. memcpy(videoData, another.videoData, videoType.cbFormat);
  57. memcpy(audioData, another.audioData, audioType.cbFormat);
  58. return *this;
  59. }
  60.     bool IsEmpty() const {
  61.         return videoType.cbFormat == 0 && audioType.cbFormat == 0;
  62.     }
  63. public:
  64. TVMEDIATYPESECTION videoType;
  65. PBYTE         videoData;
  66. TVMEDIATYPESECTION audioType;
  67. PBYTE         audioData;
  68. };
  69. class CaptureServer;
  70. class LogMgr;
  71. class BufferMgr {
  72. public:
  73. BufferMgr(CaptureServer* c);
  74. virtual ~BufferMgr();
  75. BOOL PutSample(const SampleHeader& header, BYTE* pData, LogMgr* log);
  76. /*
  77.  * 按blockID查找此block,如果没有找到,则返回错误;如果找到,
  78.  * 则将数据复制到buf, 将size置为该block的实际大小。
  79.  */
  80. BOOL GetBlock(UINT blockID, BYTE* buf, UINT& size);
  81.     // 获取一个块的编码类型
  82.     BOOL GetMediaData(UINT blockID, MediaData& data);
  83.     // 标志切换编码的Block
  84.     BOOL AttachMediaDataToCurrentBlock(const TVMEDIATYPESECTION& tv, const BYTE* data, BOOL bAudio, LogMgr* log);
  85. UINT GetMaxBlockID() {return maxBlockID;};
  86. // 检查是不是过长时间没有接受到Sample了。
  87. BOOL CheckRecvingSample() {
  88. return (time(NULL) - lastRecvSampleTime <= MAX_SAMPLE_INTERVAL);
  89. };
  90. protected:
  91. /*将NewBlock存入缓冲文件,并将blockCount++.*/
  92. BOOL SaveNewBlock(BYTE* buf, UINT size);
  93. void RemoveOldTmpFile();
  94. BOOL SaveSample(UINT dataOff, const UINT allSize);
  95. UINT GetPlayingBlock() { return blockCount==0 ? 0 : blockCount-1; }; // blockCount-1 is blockID
  96. protected:
  97. static BOOL ExCreateFile(HANDLE&, LPCTSTR lpFileName, DWORD dwDesiredAccess,
  98.                     DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  99.                     DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, 
  100.                     HANDLE hTemplateFile);
  101. static BOOL ExCreateFile(HANDLE&, LPCTSTR lpFileName, DWORD dwCreationDisposition);
  102. static int  ExReadFile(HANDLE, LPVOID buf, int toBeRead);
  103. static BOOL ExWriteFile(HANDLE, LPVOID buf, int toBeWrite);
  104. static BOOL ExSetFilePointer(HANDLE, int offset);
  105. static BOOL ExSetFileSize(HANDLE, int size);     // 更改文件大小
  106. private:
  107. string bufferPath; // 缓冲文件路径
  108. HANDLE hBufferFile; // 缓冲文件handle
  109. CCritSec bufferfile_cs; // 缓冲文件操作的互斥变量
  110. UINT* blockArray; // 存储块的数组              //
  111. UINT* blockSize; // 存储块的大小              //暂时没有用
  112. UINT maxBlockNum;// 存储块的最大个数          // 
  113. UINT maxBlockID;
  114. private:
  115. enum {
  116. BUFFER_SPACE = 150994944, // 缓冲区大小144MB
  117. MAX_SAMPLE_INTERVAL = 20, // 两个Sample之间最长的间隔,单位是秒
  118. #ifdef _DEBUG
  119.         TIME4WAIT2STORE = 10,
  120. #else
  121.         TIME4WAIT2STORE = 30,
  122. #endif
  123. };
  124. BYTE* newBlock; // 正在生成的块
  125. UINT newBlockSize; // newBlock的大小
  126. BYTE* sampleBuffer; // 将Sample存入Block的中转站
  127. UINT sampleBufferSize;
  128.     bool        bSwitchMedia;       // 编码方式发生变化
  129. UINT blockCount; // 所有已生成块的个数
  130. BOOL firstKeySample; // 当前块中第一个KeySample
  131.     MediaData   currMediaData;      // 当前块编码类型,可能为空
  132.     map<UINT, MediaData> mediaMap;  // 所有附带编码类型的块
  133. private:
  134. LONGLONG sampleStartTime;
  135. time_t startseconds;
  136. // TEST: 检测时光倒退的问题
  137. LONGLONG lastSampleStart;
  138. // 上次接收到Sample的时间。
  139. time_t lastRecvSampleTime;
  140. CaptureServer* cs;
  141. public:
  142. void StartSave();
  143. void StopSave();
  144. BOOL ShouldConnect() {return bShouldConnect;};
  145. private:
  146. BOOL bShouldSave;
  147. BOOL bShouldConnect;
  148. };
  149. #endif