00001
00002
00003 #include "CVDShowUtil.h"
00004
00005
00006
00007 HRESULT GetUnconnectedPin(
00008 IBaseFilter *pFilter,
00009 PIN_DIRECTION PinDir,
00010 IPin **ppPin)
00011 {
00012 *ppPin = 0;
00013 IEnumPins *pEnum = 0;
00014 IPin *pPin = 0;
00015 HRESULT hr = pFilter->EnumPins(&pEnum);
00016 if (FAILED(hr))
00017 {
00018 return hr;
00019 }
00020 while (pEnum->Next(1, &pPin, NULL) == S_OK)
00021 {
00022 PIN_DIRECTION ThisPinDir;
00023 pPin->QueryDirection(&ThisPinDir);
00024 if (ThisPinDir == PinDir)
00025 {
00026 IPin *pTmp = 0;
00027 hr = pPin->ConnectedTo(&pTmp);
00028 if (SUCCEEDED(hr))
00029 {
00030 pTmp->Release();
00031 }
00032 else
00033 {
00034 pEnum->Release();
00035 *ppPin = pPin;
00036 return S_OK;
00037 }
00038 }
00039 pPin->Release();
00040 }
00041 pEnum->Release();
00042
00043 return E_FAIL;
00044 }
00045
00046
00047 HRESULT DisconnectPins(IBaseFilter *pFilter)
00048 {
00049 IEnumPins *pEnum = 0;
00050 IPin *pPin = 0;
00051 HRESULT hr = pFilter->EnumPins(&pEnum);
00052 if (FAILED(hr))
00053 {
00054 return hr;
00055 }
00056
00057 while (pEnum->Next(1, &pPin, NULL) == S_OK)
00058 {
00059 pPin->Disconnect();
00060 pPin->Release();
00061 }
00062 pEnum->Release();
00063
00064
00065 return S_OK;
00066 }
00067
00068
00069
00070 HRESULT ConnectFilters(
00071 IGraphBuilder *pGraph,
00072 IPin *pOut,
00073 IBaseFilter *pDest)
00074 {
00075 if ((pGraph == NULL) || (pOut == NULL) || (pDest == NULL))
00076 {
00077 return E_POINTER;
00078 }
00079 #ifdef debug
00080 PIN_DIRECTION PinDir;
00081 pOut->QueryDirection(&PinDir);
00082 _ASSERTE(PinDir == PINDIR_OUTPUT);
00083 #endif
00084
00085
00086 IPin *pIn = 0;
00087 HRESULT hr = GetUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
00088 if (FAILED(hr))
00089 {
00090 return hr;
00091 }
00092
00093 hr = pGraph->Connect(pOut, pIn);
00094 pIn->Release();
00095 return hr;
00096 }
00097
00098
00099
00100
00101
00102 HRESULT ConnectFilters(
00103 IGraphBuilder *pGraph,
00104 IBaseFilter *pSrc,
00105 IBaseFilter *pDest)
00106 {
00107 if ((pGraph == NULL) || (pSrc == NULL) || (pDest == NULL))
00108 {
00109 return E_POINTER;
00110 }
00111
00112
00113 IPin *pOut = 0;
00114 HRESULT hr = GetUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
00115 if (FAILED(hr))
00116 {
00117 return hr;
00118 }
00119 hr = ConnectFilters(pGraph, pOut, pDest);
00120 pOut->Release();
00121 return hr;
00122 }
00123
00124
00125
00126 void LocalFreeMediaType(AM_MEDIA_TYPE& mt)
00127 {
00128 if (mt.cbFormat != 0)
00129 {
00130 CoTaskMemFree((PVOID)mt.pbFormat);
00131 mt.cbFormat = 0;
00132 mt.pbFormat = NULL;
00133 }
00134 if (mt.pUnk != NULL)
00135 {
00136
00137 mt.pUnk->Release();
00138 mt.pUnk = NULL;
00139 }
00140 }
00141
00142
00143
00144
00145 void LocalDeleteMediaType(AM_MEDIA_TYPE *pmt)
00146 {
00147 if (pmt != NULL)
00148 {
00149 LocalFreeMediaType(*pmt);
00150 CoTaskMemFree(pmt);
00151 }
00152 }
00153