Layer1Pin.cpp
上传用户: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. #include "stdafx.h"
  20. #include ".layer1pin.h"
  21. Layer1Pin::Layer1Pin(NPLayer1::Layer1* pLayer1, bool bAudio) : 
  22. m_pLayer1(pLayer1), 
  23. m_bAudio(bAudio),
  24. m_needmediatype(true)
  25. {
  26.     if(bAudio)
  27.         m_maxSize = 200*1024;   //音频数据缓冲区按200K计算
  28.     else
  29.         m_maxSize = 1000*1024;   //视频缓冲按1000K计算
  30. }
  31. Layer1Pin::~Layer1Pin(void)
  32. {
  33. }
  34. void Layer1Pin::Start()
  35. {
  36.     m_needmediatype = true;
  37. }
  38. P2P_RETURN_TYPE Layer1Pin::GetDataEx(
  39. SampleHeader& header, // out, 数据头
  40. PBYTE& pData, // out, 存储数据的缓冲区
  41. const UINT maxSize, // in, 缓冲区的长度
  42. const bool bKeySample, // in, 是否寻找关键帧
  43.         bool  bSaveSample       //in, 是否缓冲当前的sample到本地
  44. )
  45. {
  46.     P2P_RETURN_TYPE ret =  m_pLayer1->GetData(header, pData, maxSize, m_bAudio, bKeySample);
  47.     if(ret != PRT_OK)
  48.         return ret;
  49.     if(header.start == 0 && header.length == 0) //这是媒体类型的头
  50.     {
  51.         m_mediatype.SaveMediaTypeData(header, pData, 256); //保存媒体类型数据,存开头的256个byte也应该够了
  52.     }
  53.     else if(bSaveSample)
  54.     {
  55.         SampleBuffer::Clean();  //先清理当前的缓冲数据
  56.         SampleBuffer::SaveData(header, pData, maxSize); //保存被缓冲的sample
  57.     }
  58.     return ret;
  59. }
  60. P2P_RETURN_TYPE Layer1Pin::PeerData(
  61. SampleHeader& header, // out, 数据头
  62. PBYTE& pData, // out, 存储数据的缓冲区
  63. const UINT maxSize, // in, 缓冲区的长度
  64. const bool bKeySample // in, 是否寻找关键帧
  65. )
  66. {
  67.     if(IsAnyDataSaved())    //如果已经缓冲了数据,只显示缓冲的那块数据
  68.     {
  69.         SampleBuffer::PeerData(header, pData, maxSize);
  70.         return PRT_OK;
  71.     }
  72.     return GetDataEx(header, pData, maxSize, bKeySample, true);
  73. }
  74. P2P_RETURN_TYPE Layer1Pin::GetData(
  75. SampleHeader& header, // out, 数据头
  76. PBYTE& pData, // out, 存储数据的缓冲区
  77. const UINT maxSize, // in, 缓冲区的长度
  78. const bool bKeySample // in, 是否寻找关键帧
  79. )
  80. {
  81.     if(m_needmediatype)
  82.     {
  83.         int m_errcount = 0;
  84.         while(!m_mediatype.IsInited())
  85.         {
  86.             if(m_errcount > 3)
  87.             {
  88.                 //我ft! 类型数据不知道到哪里去了。只有放弃了
  89.                 MessageBox(NULL, "获取媒体类型失败了。播放将会停止", "", MB_OK);
  90.                 return PRT_SYS;
  91.             }
  92.             P2P_RETURN_TYPE ret = GetDataEx(header, pData, maxSize, bKeySample, true);
  93.             if(ret != PRT_OK)       //得不到数据头,再试几次
  94.             {
  95.                 m_errcount++;
  96.                 Sleep(50);
  97.             }
  98.             else
  99.                 break;
  100.         }
  101.        //得到了数据头,可能是刚刚peerdata得到的,也可能是之前存下来的,恢复它
  102.        m_mediatype.RestoreMediaTypeData(header, pData, maxSize);
  103.             
  104.        m_needmediatype = false;
  105.        return PRT_OK; 
  106.     }
  107.     if(IsAnyDataSaved() && SampleBuffer::GetData(header, pData, maxSize))  //有被缓冲的数据, 将缓冲的数据恢复
  108.     {
  109.         if(!(bKeySample && !header.bSyncPoint))    //要求关键帧,但我们缓冲的不是,就只能放弃,从layer1中获得,否则,可以返回
  110.             return PRT_OK;
  111.     }
  112.     return GetDataEx(header, pData, maxSize, bKeySample, false);
  113. }