Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
7.1 KiB

  1. //==========================================================================;
  2. //
  3. // Composition.h : Declaration of the custom composition class for gluing bda MPeg2 tuner to sbe SINk
  4. // Copyright (c) Microsoft Corporation 1999.
  5. //
  6. /////////////////////////////////////////////////////////////////////////////
  7. #ifndef MP2SIN_H
  8. #define MP2SIN_H
  9. #pragma once
  10. #include <uuids.h>
  11. #include <objectwithsiteimplsec.h>
  12. #include "bdamedia.h"
  13. #include "bdaTuner.h"
  14. #include "MSVidSbeSink.h"
  15. #include "resource.h" // main symbols
  16. #include <winerror.h>
  17. #include <algorithm>
  18. #include <compimpl.h>
  19. #include <seg.h>
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CMP2SinComp
  22. class ATL_NO_VTABLE __declspec(uuid("ABE40035-27C3-4a2f-8153-6624471608AF")) CMP2SinComp :
  23. public CComObjectRootEx<CComSingleThreadModel>,
  24. public CComCoClass<CMP2SinComp, &__uuidof(CMP2SinComp)>,
  25. public IObjectWithSiteImplSec<CMP2SinComp>,
  26. public IMSVidCompositionSegmentImpl<CMP2SinComp>
  27. {
  28. public:
  29. CMP2SinComp() {}
  30. virtual ~CMP2SinComp() {}
  31. REGISTER_NONAUTOMATION_OBJECT(IDS_PROJNAME,
  32. IDS_REG_MP2SINCOMP_DESC,
  33. LIBID_MSVidCtlLib,
  34. __uuidof(CMP2SinComp));
  35. DECLARE_PROTECT_FINAL_CONSTRUCT()
  36. BEGIN_COM_MAP(CMP2SinComp)
  37. COM_INTERFACE_ENTRY(IMSVidCompositionSegment)
  38. COM_INTERFACE_ENTRY(IMSVidGraphSegment)
  39. COM_INTERFACE_ENTRY(IPersist)
  40. COM_INTERFACE_ENTRY(IObjectWithSite)
  41. END_COM_MAP()
  42. // IMSVidComposition
  43. public:
  44. // IMSVidGraphSegment
  45. // IMSVidCompositionSegment
  46. STDMETHOD(Compose)(IMSVidGraphSegment * upstream, IMSVidGraphSegment * downstream)
  47. {
  48. if (m_fComposed) {
  49. return NOERROR;
  50. }
  51. ASSERT(m_pGraph);
  52. try {
  53. TRACELM(TRACE_DETAIL, "CMP2SinComp::Compose()");
  54. VWGraphSegment up(upstream);
  55. ASSERT(up.Graph() == m_pGraph);
  56. VWGraphSegment down(downstream);
  57. ASSERT(down.Graph() == m_pGraph);
  58. if (up.begin() == up.end()) {
  59. TRACELM(TRACE_ERROR, "CMP2SinComp::Compose() can't compose empty up segment");
  60. return E_INVALIDARG;
  61. }
  62. if (down.begin() == down.end()) {
  63. TRACELM(TRACE_ERROR, "CMP2SinComp::Compose() can't compose empty down segment");
  64. return E_INVALIDARG;
  65. }
  66. #if 0
  67. VWGraphSegment::iterator iOv = std::find_if(down.begin(),
  68. down.end(),
  69. arity1_pointer(&IsVideoRenderer));
  70. #endif
  71. CMSVidStreamBufferSink* ds = (CMSVidStreamBufferSink*)downstream;
  72. DSFilter pSink(ds->m_Filters[0]);
  73. CComQIPtr<IMpeg2Demultiplexer> qiDeMux;
  74. VWGraphSegment::iterator i;
  75. for (i = up.begin(); i != up.end(); ++i){
  76. qiDeMux = (*i);
  77. if (!qiDeMux){
  78. continue;
  79. }
  80. else{
  81. break;
  82. }
  83. }
  84. if(i == up.end()){
  85. TRACELM(TRACE_ERROR, "CAnaSinComp::Compose() cannot find demux");
  86. return E_INVALIDARG;
  87. }
  88. // render demux out to vr
  89. DSPin pVidPin;
  90. DSPin pAudPin;
  91. DSFilter pDeMux = (*i);
  92. DSFilter::iterator iVidPin;
  93. DSMediaType mtVideo(MEDIATYPE_Video, MEDIASUBTYPE_MPEG2_VIDEO, FORMAT_MPEG2Video);
  94. DSMediaType mtAudio(MEDIATYPE_Audio);
  95. for (iVidPin = pDeMux.begin(); iVidPin != pDeMux.end(); ++iVidPin) {
  96. DSPin::iterator j;
  97. for(j = (*iVidPin).begin(); j != (*iVidPin).end(); ++j){
  98. DSMediaType pinType(*j);
  99. CString csName;
  100. if (pinType == mtVideo){
  101. CComPtr<IUnknown> spMpeg2Analyze(CLSID_Mpeg2VideoStreamAnalyzer, NULL, CLSCTX_INPROC_SERVER);
  102. if (!spMpeg2Analyze) {
  103. //TRACELSM(TRACE_ERROR, (dbgDump << "CMSVidStreamBufferSink::Build() can't load Stream Buffer Sink");
  104. return ImplReportError(__uuidof(IMSVidStreamBufferSink), IDS_CANT_CREATE_FILTER, __uuidof(IStreamBufferSink), E_UNEXPECTED);
  105. }
  106. DSFilter vr(spMpeg2Analyze);
  107. if (!vr) {
  108. ASSERT(false);
  109. return ImplReportError(__uuidof(IMSVidStreamBufferSink), IDS_CANT_CREATE_FILTER, __uuidof(IBaseFilter), E_UNEXPECTED);
  110. }
  111. m_Filters.push_back(vr);
  112. csName = _T("Mpeg2 Analysis");
  113. m_pGraph.AddFilter(vr, csName);
  114. DSFilter::iterator a;
  115. for(a = vr.begin(); a != vr.end(); ++a){
  116. HRESULT hr = (*a).Connect(*iVidPin);
  117. if(FAILED(hr)){
  118. continue;
  119. }
  120. else{
  121. break;
  122. }
  123. }
  124. if(a == vr.end()){
  125. return E_FAIL;
  126. }
  127. for(a = vr.begin(); a != vr.end(); ++a){
  128. if((*a).GetDirection() == PINDIR_OUTPUT){
  129. pVidPin = (*a);
  130. }
  131. }
  132. if(!pVidPin){
  133. return E_FAIL;
  134. }
  135. }
  136. if(pinType == mtAudio){
  137. pAudPin = (*iVidPin);
  138. }
  139. }
  140. if(!!pVidPin && !!pAudPin){
  141. break;
  142. }
  143. }
  144. if(!pVidPin || !pAudPin){
  145. TRACELM(TRACE_DETAIL, "CMP2SinComp::Compose() can't find video and/or audio pin on demux");
  146. return E_UNEXPECTED;
  147. }
  148. DSFilterList intermediates;
  149. HRESULT hr = pAudPin.IntelligentConnect(pSink, intermediates);
  150. if(FAILED(hr)){
  151. TRACELM(TRACE_DETAIL, "CMP2SinComp::Compose() can't find video and/or audio pin on demux");
  152. return E_UNEXPECTED;
  153. }
  154. hr = pVidPin.IntelligentConnect(pSink, intermediates);
  155. if(FAILED(hr)){
  156. TRACELM(TRACE_DETAIL, "CMP2SinComp::Compose() can't find video and/or audio pin on demux");
  157. return E_UNEXPECTED;
  158. }
  159. TRACELM(TRACE_DETAIL, "CMP2SinComp::Compose() SUCCEEDED");
  160. m_fComposed = true;
  161. return NOERROR;
  162. } catch (ComException &e) {
  163. HRESULT hr = e;
  164. TRACELSM(TRACE_ERROR, (dbgDump << "CMP2SinComp::Compose() exception = " << hexdump(hr)), "");
  165. return e;
  166. } catch (...) {
  167. TRACELM(TRACE_ERROR, "CMP2SinComp::Compose() exception ... ");
  168. return E_UNEXPECTED;
  169. }
  170. }
  171. };
  172. #endif // MP2Sin_H
  173. // end of file - MP2Sin.h