InfAnime.cpp
上传用户: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. #include "stdafx.h"
  20. #include ".infanime.h"
  21. #include "zzlfilereader.h"
  22. extern TCHAR g_sAppPath[MAX_PATH];
  23. InfAnime::InfAnime(void):
  24. m_useproxymedia(true),pTipFileReader(NULL),m_animetype(REQUEST_NOPP),m_needvideotype(false),m_needaudiotype(false),
  25. m_accumulatevideotime(0) ,m_accumulateaudiotime(0)
  26. {
  27. }
  28. InfAnime::~InfAnime(void)
  29. {
  30.     delete pTipFileReader;
  31. }
  32. bool InfAnime::IsProxyAvaible()
  33. {
  34.     return m_useproxymedia;
  35. }
  36. void InfAnime::DirectFileName(LPTSTR namebuffer)
  37. {
  38.     SYSTEMTIME systime;
  39.     systime.wYear = 0;
  40.     GetLocalTime(&systime);
  41.     while(1)
  42.     {
  43.         //2006春节缓冲
  44.         if((systime.wYear == 2006) && ((systime.wMonth == 1 && systime.wDay >= 28)
  45.             || (systime.wMonth == 2 && systime.wDay <= 8)))
  46.         {
  47.             _tcscpy(namebuffer, _T("clip02.zzl"));
  48.             return;
  49.         }
  50.         break;
  51.     }
  52.     //使用默认名
  53.     _tcscpy(namebuffer, _T("clip01.zzl"));
  54. }
  55. bool InfAnime::StartProxy(ANIME_TYPE anime_type)
  56. {
  57.     if(!m_useproxymedia)
  58.         return false;
  59.     if(m_animetype == anime_type)
  60.         return true;
  61.     delete pTipFileReader;
  62.     pTipFileReader = new ZZLFileReader;
  63.     bool ret = false;
  64.     CString path(g_sAppPath);
  65.     TCHAR name[32];
  66.     DirectFileName(name);
  67.     path += _T("\");
  68.     path += name;
  69.     switch(anime_type)
  70.     {
  71.     case  REQUEST_FAIL:
  72.         ret = pTipFileReader->Init(path);
  73.         break;
  74.     case    REQUEST_PROCESS:
  75.         ret = pTipFileReader->Init(path);
  76.         break;
  77.     case    REQUEST_BUFFER:
  78.         ret = pTipFileReader->Init(path);
  79.         break;
  80.     default:
  81.         assert(0);
  82.         return false;
  83.     }
  84.     if(ret == false)
  85.     {
  86.         delete pTipFileReader;
  87.         pTipFileReader = NULL;
  88.         return false;
  89.     }
  90.     m_needvideotype = true;
  91.     m_needaudiotype = true;
  92.     m_animetype = anime_type;
  93.     return true;
  94. }
  95. void InfAnime::EndProxy()
  96. {
  97.     m_animetype = REQUEST_NOPP;
  98. }
  99. P2P_RETURN_TYPE InfAnime::SetProxyMediaType(SampleHeader& header, PBYTE& pData, const UINT maxSize, const bool bAudio, const bool bKeySample)
  100. {
  101.     memset(&header, 0, sizeof(SampleHeader));
  102.     if(maxSize < sizeof(TVMEDIATYPESECTION))
  103.     {
  104.        assert(0);
  105.        return PRT_SYS;
  106.     }
  107.     if(pTipFileReader->GetMediaType(*((TVMEDIATYPESECTION*) pData), bAudio) == FALSE)
  108.         return PRT_SYS;
  109.     TVMEDIATYPESECTION* ptvmedia = (TVMEDIATYPESECTION*) pData;
  110.     header.size = sizeof(TVMEDIATYPESECTION) + ptvmedia->cbFormat;
  111.     if(maxSize < header.size)
  112.     {
  113.        assert(0);
  114.        return PRT_SYS;
  115.     }
  116.     if(pTipFileReader->GetMediaData(pData + sizeof(TVMEDIATYPESECTION), bAudio) == FALSE)
  117.         return PRT_SYS;
  118.     m_accumulateaudiotime = 0; 
  119.     m_accumulatevideotime = 0;
  120.     if(bAudio)
  121.         m_needaudiotype = false;
  122.     else
  123.         m_needvideotype = false;
  124.     return PRT_OK;
  125. }
  126. P2P_RETURN_TYPE InfAnime::ProxyGetData(SampleHeader& header, PBYTE& pData, const UINT maxSize, const bool bAudio, const bool bKeySample)
  127. {
  128.     if(!m_useproxymedia || pTipFileReader == NULL)
  129.         return PRT_SYS;
  130.     if(bAudio && m_needaudiotype)  //如果是刚刚重新初始化, 需要把媒体类型送出以进行切换
  131.     {
  132.         return SetProxyMediaType(header, pData, maxSize, bAudio, bKeySample);
  133.     }
  134.     if((!bAudio) && m_needvideotype)
  135.     {
  136.         return SetProxyMediaType(header, pData, maxSize, bAudio, bKeySample);
  137.     }
  138.     header.bAudioSample = bAudio;
  139.     P2P_RETURN_TYPE ret = pTipFileReader->GetSample(header, pData, maxSize, _I64_MAX);
  140.     if(ret == PRT_ENDOFFILE)    //已经到头了
  141.     {
  142.         LONGLONG tmp = 0;
  143.         if(bAudio)
  144.         {
  145.             m_accumulateaudiotime += pTipFileReader->TryGetExplictEndTime(bAudio);
  146.             pTipFileReader->SeekAudioTo(tmp);
  147.         }
  148.         else
  149.         {
  150.             m_accumulatevideotime += pTipFileReader->TryGetExplictEndTime(bAudio);
  151.             pTipFileReader->SeekVideoTo(tmp);
  152.         }
  153.         header.bAudioSample = bAudio;
  154.         ret = pTipFileReader->GetSample(header, pData, maxSize, _I64_MAX);
  155. //        if(ret == PRT_ENDOFFILE)
  156. //          MessageBox(NULL, "two file end!", "", MB_OK);
  157.     }
  158.     if(ret == PRT_OK)
  159.     {
  160.          //将时间戳加上累积循环播放的时间
  161.         if(bAudio)
  162.             header.start += m_accumulateaudiotime;
  163.         else
  164.             header.start += m_accumulatevideotime;
  165.         return PRT_OK;
  166.     }
  167.     else
  168.         return PRT_SYS;
  169. }