TVStreamSinkPins.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 "TVstreamsinkpins.h"
  21. #include "TVstreamsink.h"
  22. #include "CaptureServer.h"
  23. // { Implementation of CTVStreamSinkInputPin
  24. CTVStreamSinkInputPin::CTVStreamSinkInputPin( CTVStreamSink *pFilter,
  25.   CCritSec *pLock,
  26.                                               HRESULT *phr,
  27.                                               LPCWSTR pName,
  28.                                               BOOL isAudio )
  29. : CRenderedInputPin(_T(isAudio ? "TVSink Audio Input Pin" : "TVSink Video Input Pin"),
  30.                     (CBaseFilter *)pFilter, pLock, phr, pName)
  31. {
  32. m_pFilter = pFilter;
  33. m_SampleHeader.bAudioSample = isAudio;
  34. }
  35. CTVStreamSinkInputPin::~CTVStreamSinkInputPin()
  36. {
  37. }
  38. #ifdef GENERATE_SMALL_ZZL
  39. int audio_smple_count = 0;
  40. #endif
  41. STDMETHODIMP CTVStreamSinkInputPin::Receive(IMediaSample *pSample)
  42. {
  43. CheckPointer(pSample, E_POINTER);
  44. CAutoLock lock(&m_ReceiveLock);
  45. REFERENCE_TIME start, end;
  46.     PBYTE pbData;
  47.     HRESULT hr;
  48.     if(FAILED(hr = pSample->GetPointer(&pbData)))
  49. return hr;
  50. if(FAILED(hr = pSample->GetTime(&start, &end)))
  51. return hr;
  52. assert(end >= start || end-start <= UINT_MAX);
  53. // Sample头信息
  54. m_SampleHeader.start = start;
  55. m_SampleHeader.length = static_cast<UINT>(end - start);
  56. m_SampleHeader.size = pSample->GetActualDataLength() + sizeof(SampleHeader);
  57. m_SampleHeader.bDiscontinuity = (pSample->IsDiscontinuity() == S_OK);
  58. m_SampleHeader.bPreroll = (pSample->IsPreroll() == S_OK);
  59. m_SampleHeader.bSyncPoint = (pSample->IsSyncPoint() == S_OK);
  60. // size must be less than 2^28
  61. assert(m_SampleHeader.size < 268435456);
  62. // 保存Sample
  63. if(!m_pFilter->cs.PutSample(m_SampleHeader, pbData))
  64. return E_FAIL;
  65. #ifdef GENERATE_SMALL_ZZL
  66.     if(m_SampleHeader.bAudioSample) {
  67.         audio_smple_count++;
  68.         if(audio_smple_count < 4) {
  69.             if(!m_pFilter->cs.PutSample(m_SampleHeader, pbData))
  70.                 return E_FAIL;
  71.         }
  72.     }
  73. #endif
  74. return S_OK;
  75. }
  76. STDMETHODIMP CTVStreamSinkInputPin::EndOfStream(void)
  77. {
  78. HRESULT hr;
  79. CAutoLock lock(&m_ReceiveLock);
  80. hr = CRenderedInputPin::EndOfStream();
  81. //因为在pGen下,该函数
  82. BOOL lbDisplayDialog = FALSE;
  83. if (S_OK == hr)
  84. {
  85. CAutoLock lolock(&m_pFilter->m_Lock);
  86. m_pFilter->m_iIsStop ++;
  87. if (2 == m_pFilter->m_iIsStop || 1 == m_pFilter->m_iIsStop 
  88. &&TRUE == m_pFilter->cs.m_bIsOnlyOnePin)
  89. {
  90. m_pFilter->cs.Stop();
  91. m_pFilter->m_iState = 1;
  92. //MessageBox(NULL,"转换结束","ZZL转化Graph",MB_OK|MB_ICONINFORMATION);
  93. }
  94. }
  95.     return  hr;
  96. }
  97. STDMETHODIMP CTVStreamSinkInputPin::ReceiveCanBlock()
  98. {
  99. return S_FALSE;
  100. }
  101. HRESULT CTVStreamSinkInputPin::CheckMediaType(const CMediaType *pmt)
  102. {
  103. CAutoLock lock(&m_ReceiveLock);
  104. if (TRUE == m_SampleHeader.bAudioSample)
  105. {
  106. if(MEDIATYPE_AnalogVideo == pmt->majortype 
  107. || MEDIATYPE_File == pmt->majortype
  108. || MEDIATYPE_ScriptCommand == pmt->majortype 
  109. || MEDIATYPE_Text == pmt->majortype
  110. || MEDIATYPE_Timecode == pmt->majortype 
  111. || MEDIATYPE_Video == pmt->majortype) 
  112. {
  113. return E_FAIL;
  114. }
  115. }
  116. else
  117. {
  118. if (MEDIATYPE_AnalogAudio == pmt->majortype 
  119. || MEDIATYPE_Audio == pmt->majortype
  120. || MEDIATYPE_File == pmt->majortype
  121. || MEDIATYPE_ScriptCommand == pmt->majortype
  122. || MEDIATYPE_Text == pmt->majortype 
  123. || MEDIATYPE_Timecode == pmt->majortype)
  124. {
  125. return E_FAIL;
  126. }
  127. }
  128. if(!pmt)
  129. return ((CTVStreamSink*)m_pFilter)->WriteFormatTypeHeader(&m_mt, m_SampleHeader.bAudioSample);
  130. else
  131. return ((CTVStreamSink*)m_pFilter)->WriteFormatTypeHeader(const_cast<CMediaType *>(pmt), m_SampleHeader.bAudioSample);
  132. }
  133. // Implementation of CTVStreamSinkInputPin }