LiveResource.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. #pragma once
  20. #include "baseresource.h"
  21. namespace NPLayer1 {
  22. class LiveResource :
  23. public BaseResource
  24. {
  25. public:
  26. LiveResource(Communicator*);
  27. virtual ~LiveResource(void);
  28. // 第一次开始下载的初始化
  29. P2P_RETURN_TYPE Init(
  30. string resname, // 资源名
  31. string hashcode, // 资源的Hash码
  32. string strSPList, // SuperPeer列表的IP地址
  33. float bitRate); // 频道的码率
  34. P2P_RETURN_TYPE GetData(
  35. SampleHeader& header, // out, 数据头
  36. PBYTE& pData, // out, 存储数据的缓冲区
  37. const UINT maxSize, // in, 缓冲区的长度
  38. const bool bAudio, // in, 获取音频还是视频
  39. const bool bKeySample // in, 是否寻找关键帧
  40. );
  41. BOOL SeekToTime(LONGLONG& targetTime);
  42. // 添加一个区间对应的媒体类型
  43. void AddMediaInterval(const MediaInterval&);
  44. // 获取一个Block所在区间的媒体类型
  45. bool GetMediaInterval(const UINT blockID, MediaInterval&);
  46. float GetBitRate() { return bitRate;};
  47. UINT16 GetBufferCount();
  48. UINT16 GetBufferTime();
  49. UINT16 GetBufferingTime();
  50. // 获取节目名字
  51. string GetProgramName();
  52. // 获取节目时间长度,单位是秒
  53. UINT32 GetProgramTimeInSeconds();
  54. // 获取频道名字
  55. string GetChannelName();
  56. // 获取数据中sample的原始时间
  57. LONGLONG GetOriginTime() {return max(A_last_OriginTime, V_last_OriginTime);};
  58. SPUpdate GetSPUpdate() { return spUpdate;};
  59. BYTE GetSPUpdateSum() {return spUpdateSum;};
  60. void SetSPUpdate(const SPUpdate& update, BYTE sum);
  61. // derived from BaseReSource
  62. UINT GetPlayingBlock(bool max=true);
  63. int GetBufferPercent();
  64. bool EnlargeBuffer();
  65. void PrintStatus();
  66. BOOL SetPlayingBlock(UINT blockID);
  67. void SetDefaultCP();
  68. P2P_RETURN_TYPE PutBlock(UINT blockID, UINT blockSize, PBYTE data);
  69. protected:
  70. void Uninit(bool force);
  71. P2P_RETURN_TYPE InitBroadcastMember(float bitRate);
  72. P2P_RETURN_TYPE LoadSample(
  73. SampleHeader& header, // Sample头
  74. PBYTE& sampleData, // Sample数据
  75. UINT sampleOff, // 已经读取的长度
  76. const UINT maxSize, // Sample最大长度
  77. const bool isAudio, // 视频还是音频
  78. bool& bMediaTypeSample // 是否媒体类型的特殊Sample
  79. );
  80. // 获取此Block末尾一个Sample被截断后,在下一个Block所残留的长度,返回值表示此Block是否数据正确
  81. bool GetUnfinishedSampleSize(PBYTE& blockData, UINT& unfinishedSize);
  82. // 检查此Block是否新节目的第一块
  83. bool IsFirstBlockOfNewProgram(PBYTE& blockData);
  84. private:
  85. enum PROGRAM_STATE {
  86. PS_BOTH_BEGINS, 
  87. PS_VIDEO_BEGINS, 
  88. PS_AUDIO_BEGINS,
  89. };
  90. enum {
  91. TIME_BETWEEN_PROGRAM = 1*10000000, // 节目间隔时间,单位是10^-7s
  92. };
  93. float bitRate; // 频道码率
  94. SPUpdate spUpdate; // SP发送的广播
  95. BYTE spUpdateSum;
  96. UINT V_currBlockID; // 当前视频块的编号
  97. BYTE* V_currBlock; // 当前视频块的数据
  98. UINT V_leftDataInCurrBlock; // 当前视频块的剩余数据大小
  99. LONGLONG V_lastSampleTime; // 最近一个视频Sample的start time
  100. LONGLONG V_last_OriginTime; // 最近一个视频Sample的原始时间
  101. DWORD V_lastGetSampleFailedTime;// 最近一次GetSample失败的时间,此刻与下次EnlargeBuffer的时间差就是本次Buffer所用的时间
  102. UINT A_currBlockID; // 当前音频块的编号
  103. BYTE* A_currBlock; // 当前音频块的数据
  104. UINT A_leftDataInCurrBlock; // 当前音频块的剩余数据大小
  105. LONGLONG A_lastSampleTime; // 最近一个音频Sample的start time
  106. LONGLONG A_last_OriginTime; // 最近一个音频Sample的原始时间
  107. DWORD A_lastGetSampleFailedTime;// 最近一次GetSample失败的时间,此刻与下次EnlargeBuffer的时间差就是本次Buffer所用的时间
  108. BYTE* tmpBlockData; // 检查Block数据是否正确时,使用的临时空间
  109. LONGLONG programStartTime; // 当前节目的开始时间
  110. PROGRAM_STATE programState; // 节目状态,在新节目开始的时候可能需要进行视音频的同步
  111. UINT totalBufferCount; // 用户播放过程中发生了多少次缓冲
  112. UINT totalBufferTime; // 用户总共用了多少时间等待缓冲完毕
  113. MediaArray mediaArray; // 编码类型与BlockInterval的对应列表
  114. MediaArray V_sentArray; // 已经提交给上层的列表
  115. MediaArray A_sentArray; // 已经提交给上层的列表
  116. };
  117. }