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

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. #pragma once
  20. class CTVStreamSource;
  21. class ZZLFileReader
  22. {
  23. public:
  24. ZZLFileReader();
  25. virtual ~ZZLFileReader(void);
  26. bool Init(const char* filename);
  27. void Uninit();
  28. STDMETHODIMP GetAvailable(LONGLONG& pEarliest,LONGLONG& pLatest);
  29. STDMETHODIMP GetDuration(LONGLONG& pDuration);
  30. STDMETHODIMP GetStopPosition(LONGLONG& pStop);
  31. //
  32. LONGLONG GetStartTime()
  33. {
  34. if(IsInited())
  35. return m_startTime;
  36. //
  37. return 0;
  38. }
  39. LONGLONG GetEndTime()
  40. {
  41. if(IsInited())
  42. return m_endTime;
  43. //
  44. return 0;
  45. }
  46.     //尝试获得精确的结束时间。这是通过获得的sample计算的,所以越接近终结就越准确
  47.     LONGLONG TryGetExplictEndTime(bool isAudio)
  48.     {
  49.         if(isAudio)
  50.             return m_AudioEndTime;
  51.         else
  52.             return m_VideoEndTime;
  53.     }
  54. // 获取媒体类型
  55. int GetMediaType(TVMEDIATYPESECTION&, BOOL isAudio);
  56. // 获取媒体数据
  57. int GetMediaData(PBYTE, BOOL isAudio);
  58. // 获取Sample. 
  59. // startTime != _I64_MAX的话,寻找startTime之后的第一个Sample,
  60. // 视频Sample的话还要满足是关键帧的条件
  61. P2P_RETURN_TYPE GetSample(
  62. SampleHeader& header, // Sample头
  63. PBYTE& pData, // Sample数据
  64. const UINT maxSize, // Sample的最大值
  65. LONGLONG seekTime); // Seek的目标时间
  66. // Seek到某个时间
  67. bool SeekTo(LONGLONG seekTime, int pin = 3); // 目标时间
  68.     bool SeekVideoTo(LONGLONG seekTime);
  69.     bool SeekAudioTo(LONGLONG seekTime);
  70. private:
  71. P2P_RETURN_TYPE LoadSample(
  72. SampleHeader& header, // Sample头
  73. PBYTE& sampleData, // Sample数据
  74. UINT sampleOff, // 已经读取的长度
  75. const UINT maxSize, // Sample最大长度
  76. const bool isAudio); // 视频还是音频
  77. // http下载线程
  78. static void __stdcall RunHttpDownload(ZZLFileReader*);
  79. // 读取文件头
  80. bool ReadFileHeader();
  81. // 如果headerSize已经已知,则说明已经读取过文件头,初始化成功了
  82. bool IsInited() {return m_iHeaderSize > 0;};
  83. private:
  84. HANDLE m_hDownThread; // 下载线程
  85. bool m_isStopped; // 是否已经停止
  86. HANDLE m_hFile; // 打开文件的句柄
  87. UINT m_iFileSize; // 文件大小
  88. UINT m_iDownloadedSize; // 对于HTTP的zzl,已经下载的长度
  89. UINT m_iHeaderSize; // 文件头的长度
  90. TVMEDIATYPESECTION m_VideoType;
  91. TVMEDIATYPESECTION m_AudioType;
  92. //
  93. BYTE* m_pVideoFormat;
  94. BYTE* m_pAudioFormat;
  95. LONGLONG m_startTime;
  96. LONGLONG m_endTime;
  97.     LONGLONG m_VideoEndTime;
  98.     LONGLONG m_AudioEndTime;    //具有10^7精度的媒体时间
  99. //
  100. LONGLONG m_llSeekTo;
  101. BYTE A_currBlock[BLOCK_SIZE];
  102. BYTE V_currBlock[BLOCK_SIZE];
  103. //
  104. UINT A_currBlockID;
  105. UINT V_currBlockID;
  106. //
  107. UINT A_iLeftDataInCurrBlock;
  108. UINT V_iLeftDataInCurrBlock;
  109. // CTVStreamSource* m_pFilter;
  110. //
  111. CCritSec        m_pLock;
  112. const float FILE_VERSION; // 支持的zzl文件的版本
  113. const float LIMIT_DOWN_SPEED; // 限制下载速度的最大值
  114. const UINT MAX_HEADER_SIZE; // zzl header的最大长度(用来检查zzl header是否已经下载)
  115. };