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

P2P编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "Dvdmedia.h"
  3. CTVStreamSourcePin::CTVStreamSourcePin(
  4.    TCHAR *pObjectName, HRESULT *phr, CSource *pFilter, bool isAudio)
  5. : CSourceStream(pObjectName, phr, pFilter, L"Out"), 
  6. m_pFilter((CTVStreamSource*)pFilter), 
  7. m_iVideoSampleSize(0), 
  8. m_iAudioSampleSize(0),
  9. m_pAnotherPin(NULL) ,
  10. m_bPinAvaible(TRUE) ,
  11.         m_bFlushforSync(0),
  12. CSourceSeeking(NAME("Chaos Filter Seeking Pin"), NULL, phr, pFilter->pStateLock())
  13. {
  14.     m_Data = new BYTE[65536];
  15. m_rtStart    = 0;
  16. m_rtStop     = 1 * UNITS;
  17. m_rtDuration = 1 * UNITS; 
  18. //
  19. m_isAudioPin = isAudio;
  20. //
  21. m_SeekData.rtSeekTo = _I64_MAX;
  22. m_SeekData.bSycn    = FALSE;
  23. //
  24. //
  25. SetSeekData(0);
  26. m_bSync = FALSE;
  27. m_bTryGetMediaType = true;
  28. m_MediaType.cbFormat = 0;
  29. // 必须是winxp 及其以上版本的OS
  30. if(m_pFilter->CanDynamicReconnect()) {
  31. // Winxp之前不能支持切换编码
  32. SetDefaultMediaType();
  33. }
  34. #ifdef USE_LOG
  35.     if(m_isAudioPin)
  36.         log = fopen("c:\chaosaudiopinlog.log", "w+");
  37.     else
  38.         log = fopen("c:\chaosvideopinlog.log", "w+");
  39.     
  40. fprintf(log, "start pinrn");
  41. fflush(log);
  42. #endif
  43. }
  44. //
  45. CTVStreamSourcePin::~CTVStreamSourcePin() 
  46. {
  47.     delete[] m_Data;
  48. #ifdef USE_LOG
  49. if(log)
  50. fclose(log);
  51. #endif
  52. }
  53. //
  54. void CTVStreamSourcePin::SetDefaultMediaType()
  55. {
  56. // raw video type
  57. static const BYTE videoData[] = {
  58. 0x76, 0x69, 0x64, 0x73, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71, 
  59. 0x7D, 0xEB, 0x36, 0xE4, 0x4F, 0x52, 0xCE, 0x11, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70, 
  60. 0x80, 0x9F, 0x58, 0x05, 0x56, 0xC3, 0xCE, 0x11, 0xBF, 0x01, 0x00, 0xAA, 0x00, 0x55, 0x59, 0x5A, 
  61. 0x01, 0x00, 0x00, 0x00, 0xC2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  62. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  63. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  64. 0x62, 0x17, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 
  65. 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x03, 0x00, 
  66. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  67. };
  68. /*
  69. // raw audio type
  70. static const BYTE audioData[] = {
  71. 0x61, 0x75, 0x64, 0x73, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71, 
  72. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71, 
  73. 0x81, 0x9F, 0x58, 0x05, 0x56, 0xC3, 0xCE, 0x11, 0xBF, 0x01, 0x00, 0xAA, 0x00, 0x55, 0x59, 0x5A, 
  74. 0x04, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0xAC, 0x00, 0x00, 
  75. 0x10, 0xB1, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00
  76. };
  77. */
  78. // 直接无法创建,只能从现有的filter中寻找(所以默认的音频必须是GSM,这样才能找到)
  79. // gsm6.10
  80. static const BYTE audioData[] = {
  81. 0x61, 0x75, 0x64, 0x73, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71, 
  82. 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71, 
  83. 0x81, 0x9F, 0x58, 0x05, 0x56, 0xC3, 0xCE, 0x11, 0xBF, 0x01, 0x00, 0xAA, 0x00, 0x55, 0x59, 0x5A, 
  84. 0x41, 0x00, 0x00, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x31, 0x00, 0x01, 0x00, 0x44, 0xAC, 0x00, 0x00, 
  85. 0xFD, 0x22, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x01
  86. };
  87. TVMEDIATYPESECTION tv;
  88. BYTE data[256];
  89. if(m_isAudioPin) {
  90. memcpy(&tv, audioData, sizeof(tv));
  91. if(tv.cbFormat)
  92. memcpy(data, audioData+sizeof(tv), tv.cbFormat);
  93. }
  94. else {
  95. memcpy(&tv, videoData, sizeof(tv));
  96. if(tv.cbFormat)
  97. memcpy(data, videoData+sizeof(tv), tv.cbFormat);
  98. }
  99. CMediaType MediaType;
  100. //memset(&MediaType, 0, sizeof(CMediaType));
  101. LPVOID *pvi = (LPVOID*)MediaType.AllocFormatBuffer(tv.cbFormat);
  102. //
  103. memcpy(pvi, data, tv.cbFormat);
  104. MediaType.SetType(&tv.majortype);
  105. MediaType.SetSubtype(&tv.subtype);
  106. MediaType.SetFormatType(&tv.formattype);
  107. MediaType.SetTemporalCompression(tv.bTemporalCompression);
  108. MediaType.SetSampleSize(tv.lSampleSize);
  109. MediaType.bFixedSizeSamples = tv.bFixedSizeSamples;
  110. MediaType.cbFormat = tv.cbFormat;
  111. //
  112. m_MediaType.Set(MediaType);
  113. }
  114. void CTVStreamSourcePin::GetFirstMediaType()
  115. {
  116.     // 不尝试多次
  117. if(!m_bTryGetMediaType)
  118.     return;
  119.     m_bTryGetMediaType = false;
  120.     PBYTE pData = m_Data;
  121. memset(pData, 0 , 65536);
  122.     int iRet = 0;
  123.     m_header.bAudioSample = m_isAudioPin;
  124.     if(m_pFilter->CanDynamicReconnect())
  125.     {
  126.        iRet = m_pFilter->m_pComm->GetData(m_header, pData, 65536, m_isAudioPin, false);
  127.     }
  128.     else
  129.     {
  130.     // 10秒钟内必须读取到mediatype,否则,不予等待
  131.         int i = 0;
  132.     for(; i < 100; ++i)
  133.     {
  134. //     
  135.     iRet = m_pFilter->m_pComm->GetData(m_header, pData, 65536, m_isAudioPin, false);
  136. //
  137.     if (iRet > 0)//取到数据
  138.                 break;
  139.     Sleep(100);
  140.     }
  141.         if(i >= 100 && iRet <= 0)
  142.             return;
  143.     }
  144.     if(iRet <= 0)
  145.     {
  146.  #ifdef USE_LOG
  147.      fprintf(log, "first get media data fail! rn");
  148. #endif
  149.         return;
  150.     }
  151. #ifdef USE_LOG
  152.      fprintf(log, "first get media data OK rn");
  153. #endif
  154. if (m_header.start == 0 && m_header.length == 0)//mediaType
  155. {
  156. //
  157. TVMEDIATYPESECTION tv;
  158. memset(&tv, 0, sizeof(TVMEDIATYPESECTION));
  159. memcpy(&tv, pData, sizeof(TVMEDIATYPESECTION));
  160. //
  161. LPVOID *pvi = (LPVOID*)m_MediaType.AllocFormatBuffer(tv.cbFormat);
  162. if (pvi == 0) 
  163. {
  164. return;
  165. }
  166. //
  167. memcpy(pvi, pData + sizeof(TVMEDIATYPESECTION), tv.cbFormat);
  168. m_MediaType.SetType(&tv.majortype);
  169. m_MediaType.SetSubtype(&tv.subtype);
  170. m_MediaType.SetFormatType(&tv.formattype);
  171. m_MediaType.SetTemporalCompression(tv.bTemporalCompression);
  172. m_MediaType.SetSampleSize(tv.lSampleSize);
  173. m_MediaType.bFixedSizeSamples = tv.bFixedSizeSamples;
  174. m_MediaType.cbFormat = tv.cbFormat;
  175. //
  176. SetInfor(tv);
  177. //
  178. }//header
  179. #ifdef USE_LOG
  180.      fflush(log);
  181. #endif
  182. //
  183. return;
  184. }
  185. //
  186. HRESULT CTVStreamSourcePin::GetMediaType(CMediaType *pMediaType)
  187. {
  188.     CheckPointer(pMediaType, E_POINTER);
  189. //
  190. if (NULL == m_pFilter)
  191. {
  192. ASSERT(FALSE);
  193. return S_FALSE;
  194. }
  195. //
  196. if (m_pFilter->m_pComm       == NULL && 
  197. m_pFilter->m_pFileReader == NULL)
  198. {
  199. ASSERT(FALSE);
  200. return S_FALSE;
  201. }
  202. //
  203. CAutoLock cAutoLock(m_pFilter->pStateLock());
  204. // 取得媒体类型的数据
  205. TVMEDIATYPESECTION tv;
  206. BOOL  nRet     = FALSE;
  207. PBYTE lpviTemp = NULL;
  208. //
  209. if(m_pFilter->m_pComm )  
  210. {
  211. // 必须是winxp 及其以上版本的OS
  212. //      if(!m_pFilter->CanDynamicReconnect()) {
  213. // 由于没有默认媒体类型,需要等待网络返回
  214. GetFirstMediaType();
  215. // 没有获取到媒体类型数据,返回错误
  216. if(m_MediaType.cbFormat == 0)
  217. return S_FALSE;
  218. // }
  219. return pMediaType->Set(m_MediaType);
  220. }
  221. else if(m_pFilter->m_pFileReader)
  222. {
  223. nRet = m_pFilter->m_pFileReader->GetMediaType(tv, m_isAudioPin);
  224. if(nRet != TRUE)
  225. {
  226. ASSERT(FALSE);
  227. return S_FALSE;
  228. }
  229. //
  230. lpviTemp = new BYTE[tv.cbFormat];
  231. nRet = m_pFilter->m_pFileReader->GetMediaData(lpviTemp, m_isAudioPin);
  232. //
  233. if(nRet != TRUE)
  234. {
  235. ASSERT(FALSE);
  236. return S_FALSE;
  237. }
  238. }
  239. else 
  240. {
  241. ASSERT(FALSE);
  242. return E_POINTER;
  243. }
  244. //
  245. if(tv.bThisPinOnly && m_isAudioPin)
  246. {
  247. m_pFilter->m_isAudioOnly = TRUE;
  248. }
  249. //
  250. if(tv.cbFormat == 0 && tv.lSampleSize == 0) 
  251. {
  252. return S_FALSE;
  253. }
  254. // Allocate enough room for the MPEG1VIDEOINFO and the color tables
  255.     LPVOID *pvi = (LPVOID*)pMediaType->AllocFormatBuffer(tv.cbFormat);
  256.     if (pvi == 0) 
  257.     {
  258. return(E_OUTOFMEMORY);
  259. }
  260. //
  261. memcpy(pvi,lpviTemp,tv.cbFormat);
  262.     pMediaType->SetType(&tv.majortype);
  263. pMediaType->SetSubtype(&tv.subtype);
  264.     pMediaType->SetFormatType(&tv.formattype);
  265.     pMediaType->SetTemporalCompression(tv.bTemporalCompression);
  266.     pMediaType->SetSampleSize(tv.lSampleSize);
  267. pMediaType->bFixedSizeSamples = tv.bFixedSizeSamples;
  268. pMediaType->cbFormat = tv.cbFormat;
  269. //
  270. SetInfor(tv);
  271. // 删除临时变量
  272. if (NULL != lpviTemp)
  273. {
  274. delete [] lpviTemp;
  275. lpviTemp = NULL;
  276. }
  277. //
  278. return S_OK;
  279. }
  280. //
  281. void CTVStreamSourcePin::SetInfor(TVMEDIATYPESECTION tv)
  282. {
  283. if(tv.bFixedSizeSamples)
  284. {
  285. (m_isAudioPin?m_iAudioSampleSize:m_iVideoSampleSize) = tv.lSampleSize;
  286. }
  287. // 因为媒体类型中所制定的SampleSize可能有误(过小),所以要保证大于