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

P2P编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include ".infanime.h"
  3. #include "zzlfilereader.h"
  4. extern HANDLE g_hModule;
  5. InfAnime::InfAnime(void):
  6. m_useproxymedia(true),pTipFileReader(NULL),m_animetype(REQUEST_NOPP),m_needvideotype(false),m_needaudiotype(false),
  7. m_accumulatevideotime(0) ,m_accumulateaudiotime(0)
  8. {
  9. }
  10. InfAnime::~InfAnime(void)
  11. {
  12.     delete pTipFileReader;
  13. }
  14. bool InfAnime::IsProxyAvaible()
  15. {
  16.     return m_useproxymedia;
  17. }
  18. bool InfAnime::StartProxy(ANIME_TYPE anime_type)
  19. {
  20.     if(!m_useproxymedia)
  21.         return false;
  22.     if(m_animetype == anime_type)
  23.         return true;
  24.     delete pTipFileReader;
  25.     pTipFileReader = new ZZLFileReader();
  26.     bool ret = false;
  27. TCHAR lpModulePath[MAX_PATH_EX] = _T("");
  28. DWORD dwLen = GetModuleFileName((HMODULE)g_hModule, lpModulePath, MAX_PATH_EX);
  29. if(dwLen == 0)
  30. return false;
  31. TCHAR* idx = _tcsrchr(lpModulePath, _T('\'));
  32. if(idx == NULL)
  33. return false;
  34. *(idx+1) = _T('');
  35.     string path = lpModulePath;
  36.     path += _T("\clip01.zzl");
  37.     switch(anime_type)
  38.     {
  39.     case  REQUEST_FAIL:
  40.         ret = pTipFileReader->Init(path.data());
  41.         break;
  42.     case    REQUEST_PROCESS:
  43.         ret = pTipFileReader->Init(path.data());
  44.         break;
  45.     case    REQUEST_BUFFER:
  46.         ret = pTipFileReader->Init(path.data());
  47.         break;
  48.     default:
  49.         assert(0);
  50.         return false;
  51.     }
  52.     if(ret == false)
  53.     {
  54.         delete pTipFileReader;
  55.         pTipFileReader = NULL;
  56.         return false;
  57.     }
  58.     m_needvideotype = true;
  59.     m_needaudiotype = true;
  60.     m_animetype = anime_type;
  61.     return true;
  62. }
  63. void InfAnime::EndProxy()
  64. {
  65.     m_animetype = REQUEST_NOPP;
  66. }
  67. P2P_RETURN_TYPE InfAnime::SetProxyMediaType(SampleHeader& header, PBYTE& pData, const UINT maxSize, const bool bAudio, const bool bKeySample)
  68. {
  69.     memset(&header, 0, sizeof(SampleHeader));
  70.     if(maxSize < sizeof(TVMEDIATYPESECTION))
  71.     {
  72.        assert(0);
  73.        return PRT_SYS;
  74.     }
  75.     if(pTipFileReader->GetMediaType(*((TVMEDIATYPESECTION*) pData), bAudio) == FALSE)
  76.         return PRT_SYS;
  77.     TVMEDIATYPESECTION* ptvmedia = (TVMEDIATYPESECTION*) pData;
  78.     header.size = sizeof(TVMEDIATYPESECTION) + ptvmedia->cbFormat;
  79.     if(maxSize < header.size)
  80.     {
  81.        assert(0);
  82.        return PRT_SYS;
  83.     }
  84.     if(pTipFileReader->GetMediaData(pData + sizeof(TVMEDIATYPESECTION), bAudio) == FALSE)
  85.         return PRT_SYS;
  86.     m_accumulateaudiotime = 0; 
  87.     m_accumulatevideotime = 0;
  88.     if(bAudio)
  89.         m_needaudiotype = false;
  90.     else
  91.         m_needvideotype = false;
  92.     return PRT_OK;
  93. }
  94. P2P_RETURN_TYPE InfAnime::ProxyGetData(SampleHeader& header, PBYTE& pData, const UINT maxSize, const bool bAudio, const bool bKeySample)
  95. {
  96.     if(!m_useproxymedia || pTipFileReader == NULL)
  97.         return PRT_SYS;
  98.     if(bAudio && m_needaudiotype)  //如果是刚刚重新初始化, 需要把媒体类型送出以进行切换
  99.     {
  100.         return SetProxyMediaType(header, pData, maxSize, bAudio, bKeySample);
  101.     }
  102.     if((!bAudio) && m_needvideotype)
  103.     {
  104.         return SetProxyMediaType(header, pData, maxSize, bAudio, bKeySample);
  105.     }
  106.     header.bAudioSample = bAudio;
  107.     P2P_RETURN_TYPE ret = pTipFileReader->GetSample(header, pData, maxSize, _I64_MAX);
  108.     if(ret >= PRT_OK)
  109.     { 
  110.         //将时间戳加上累积循环播放的时间
  111.         if(bAudio)
  112.             header.start += m_accumulateaudiotime;
  113.         else
  114.             header.start += m_accumulatevideotime;
  115.         return PRT_OK;
  116.     }
  117.     else if(ret == PRT_ENDOFFILE)    //已经到头了
  118.     {
  119.         LONGLONG tmp = 0;
  120.         if(bAudio)
  121.         {
  122.             m_accumulateaudiotime += pTipFileReader->TryGetExplictEndTime(bAudio);
  123.             pTipFileReader->SeekAudioTo(tmp);
  124.         }
  125.         else
  126.         {
  127.             m_accumulatevideotime += pTipFileReader->TryGetExplictEndTime(bAudio);
  128.             pTipFileReader->SeekVideoTo(tmp);
  129.         }
  130.         header.bAudioSample = bAudio;
  131.         return ProxyGetData(header, pData, maxSize, bAudio, bKeySample);
  132.     }
  133.     else
  134.     {
  135.         return PRT_SYS;
  136.     }
  137. }