• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            ts,ps,mpeg2 decoder and analysis

            mepg 2, iptv, stream parse,mov,mxf,gxf,ac3,aac

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              21 隨筆 :: 0 文章 :: 54 評論 :: 0 Trackbacks


            directshow,filter: 什么時候調用 m_pGraphBuilder->RemoveFilter

            code如下: 如果用下列函數,調用系統自帶的File Source,就無需 調用 m_pGraph->RemoveFilter,只要

            調用 pFIFileSource->release();就可以了。

            但是,如果不是系統的,必需用m_pGraphBuilder->RemoveFilter(),否則,filter的析構函數不會被調

            用。


            if (SUCCEEDED(hr)) 
              hr = CoCreateInstance(CLSID_AsyncSample, NULL, CLSCTX_INPROC,
                    IID_IBaseFilter, (LPVOID *)

            &pFIFileSource) ;
             if (SUCCEEDED(hr))
              hr = m_pGraphBuilder->AddFilter(pFIFileSource,L"Sample File Source");

             IFileSourceFilter *pAVIFileSource = NULL;

             if (SUCCEEDED(hr)) 
              hr = pFIFileSource->QueryInterface(IID_IFileSourceFilter,(void **)

            &pAVIFileSource);


            同樣:
            if (SUCCEEDED(hr)) 
              hr = CoCreateInstance(CLSID_MYSocketSource, NULL, CLSCTX_INPROC,
                    IID_IBaseFilter, (LPVOID *)

            &pFIFileSource) ;
             if (SUCCEEDED(hr))
              hr = m_pGraphBuilder->AddFilter(pFIFileSource,L"MY Socket Source");


            ...
            最后必需用m_pGraphBuilder->RemoveFilter(),否則,filter的析構函數不會被調用。否則有很大的內

            存泄露。

            不知道是什么原因:

            因為  www.directshow.cn: 這個網址不行了,所以貼出下列code,請大家分享。


            HRESULT ConnectPins( IGraphBuilder* pGraphBuilder,
                 IBaseFilter* pOutput,
                 IBaseFilter* pInput,
                 int nOutIndex,
                 int nInIndex)
            {
             HRESULT hr = NOERROR;
             ULONG cFetched = 0;
             IEnumPins* pEnumPins = 0;
             IPin* pPinOutput = 0;
             IPin* pPinInput = 0;

             //enum output filter pins.
             hr = pOutput->EnumPins(&pEnumPins);
             if(FAILED(hr))
             {
              return hr;
             }
             //if the pin to connect is not the first one, we must skip nOutIndex-1 pins.
             if(nOutIndex>1)
             {
              hr = pEnumPins->Skip(nOutIndex-1);
              if(FAILED(hr))
              {
               pEnumPins->Release();
               return hr;
              }
             }
             //now we can get the output pin we wanted.
             hr = pEnumPins->Next(1,&pPinOutput,&cFetched);
             if(FAILED(hr))
             {
              pEnumPins->Release();
              return hr;
             }
             pEnumPins->Release();

             //enum input filter pins.
             hr = pInput->EnumPins(&pEnumPins);
             if(FAILED(hr))
             {
              pPinOutput->Release();
              return hr;
             }
             //if input pin is not the first to connect, we must skip nInIndex-1 pins.
             if(nInIndex>1)
             {
              hr = pEnumPins->Skip(nInIndex-1);
              if( FAILED(hr) )
              {
               pPinOutput->Release();
               pEnumPins->Release();
               return hr;
              }
             }
             //now we can get the input pin we wanted.
             hr = pEnumPins->Next(1,&pPinInput,&cFetched);
             if(FAILED(hr))
             {
              pPinOutput->Release();
              pEnumPins->Release();
              return hr;
             }
             pEnumPins->Release();

             //now connect from output pin to input pin.
             hr = pGraphBuilder->Connect(pPinOutput,pPinInput);
             pPinOutput->Release();
             pPinInput->Release();
             return hr;
            }
            IPin* xMyFindPin(IBaseFilter *pFilter, const WCHAR achName[])
            {
             BOOL       bFound = FALSE;
             IEnumPins  *pEnum;
             IPin       *pPin;
             PIN_INFO pininfo;

             if(pFilter==NULL)
              return NULL;
             pFilter->EnumPins(&pEnum);
             while(pEnum->Next(1, &pPin, 0) == S_OK)
             {
              pPin->QueryPinInfo(&pininfo);
              pininfo.pFilter->Release();
              if (bFound = (0 == wcscmp(pininfo.achName,achName)))
               break;
              pPin->Release();
             }
             pEnum->Release();
             return (bFound ? pPin : 0); 
            }
            static const GUID  CLSID_NULL_USER1=
            {0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

            HRESULT GetUnconnectedPin( IBaseFilter *pFilter,
                    PIN_DIRECTION PinDir,
                    IPin **ppPin,GUID gMajortype,WCHAR *achName)
            {
             *ppPin = 0;
             IEnumPins *pEnum = 0;
             IPin *pPin = 0;
             HRESULT hr = pFilter->EnumPins( &pEnum );
             if( FAILED( hr ) )
             {
              return hr;
             }
             while( pEnum->Next( 1, &pPin, NULL ) == S_OK )
             {
              PIN_DIRECTION ThisPinDir;
              pPin->QueryDirection( &ThisPinDir );
              if( ThisPinDir == PinDir )
              {
               IPin *pTmp = 0;
               hr = pPin->ConnectedTo( &pTmp );
               if( SUCCEEDED( hr ) )
               {
                pTmp->Release( );
               }
               else
               {    
                PIN_INFO pininfo;
                pPin->QueryPinInfo(&pininfo);
                pininfo.pFilter->Release();
                if(achName && (wcslen(achName)>= wcslen(pininfo.achName)))
                 wcscpy(achName,pininfo.achName);

                if(gMajortype==CLSID_NULL_USER1)
                {
                 pEnum->Release( );
                 *ppPin = pPin;
                 return S_OK;
                }
                else
                {
                 IEnumMediaTypes* pTypeEnum;
                 hr = pPin->EnumMediaTypes (&pTypeEnum);

                 hr =pTypeEnum->Reset();
                 AM_MEDIA_TYPE* pMediaType;
                 ULONG            ul ;

                 do
                 {
                  hr = pTypeEnum->Next(1, &pMediaType, &ul) ;
                  if (FAILED(hr) || 0 == ul)
                  {
                   pTypeEnum->Release();
                   //pEnum->Release( );
                   if(pTmp)
                    pTmp->Release();
                   break ;
                  }

                  if (pMediaType->majortype == gMajortype)
                  // ||       pMediaType->subtype == MEDIASUBTYPE_DVSD)
                  { pTypeEnum->Release();
                   pEnum->Release( );
                   *ppPin = pPin;
                   return S_OK;
                  }
                 }while (1) ;   

                }
               }
               if(pTmp)
                pTmp->Release();
              }
              pPin->Release( );
             }
             pEnum->Release( );

             return E_FAIL;
            }



            TS,MPEG2,dvbc專家 2009-10-21 13:36 發表評論

            文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/10/21/directshow.html
            posted on 2009-10-21 13:36 TS,MPEG2,dvbc專家 閱讀(1975) 評論(6)  編輯 收藏 引用

            評論

            # re: [導入]directshow,filter: 什么時候調用 m_pGraphBuilder->RemoveFilter 2009-10-23 12:16 dvbcn
            test  回復  更多評論
              

            # re: directshow,filter: 什么時候調用 m_pGraphBuilder->RemoveFilter 2009-10-23 13:37 126
            不太明白  回復  更多評論
              

            # re: directshow,filter: 什么時候調用 m_pGraphBuilder->RemoveFilter 2009-10-23 13:38 126.com
            不是太懂  回復  更多評論
              

            # re: directshow,filter: 什么時候調用 m_pGraphBuilder->RemoveFilter 2009-10-28 13:32 coloriy
            哦也不太懂  回復  更多評論
              

            # re: directshow,filter: 什么時候調用 m_pGraphBuilder->RemoveFilter 2009-10-28 17:26 TS,MPEG2,dvbc專家
            感覺大家都不懂,我是不是學了 “回字有四種寫法” ,這種無用的知識了,唉!  回復  更多評論
              

            # re: directshow,filter: 什么時候調用 m_pGraphBuilder->RemoveFilter 2010-11-03 14:51 lxy
            我也遇到了這個問題,跟蹤調試了好久,調用connect之后就多出好多引用,調用pGraph->release()釋放不全,必須手動調用pGraph->removefilter()  回復  更多評論
              

            ts,ps,mpeg2 decoder and analysis,ts分析.
            久久综合鬼色88久久精品综合自在自线噜噜| 亚洲国产成人久久精品动漫| 久久精品国产一区二区电影| 国产福利电影一区二区三区,免费久久久久久久精 | 欧美黑人激情性久久| 久久久久人妻精品一区二区三区 | 久久超碰97人人做人人爱| 九九99精品久久久久久| 精品久久人人做人人爽综合| 久久www免费人成看片| 青青青青久久精品国产| 久久国产免费直播| 久久e热在这里只有国产中文精品99| 婷婷久久综合| 亚洲精品成人网久久久久久| 亚洲AV乱码久久精品蜜桃| 国产成人香蕉久久久久| 婷婷综合久久中文字幕蜜桃三电影 | 99久久中文字幕| 精品久久亚洲中文无码| 久久99久久成人免费播放| 久久精品国产亚洲AV大全| 亚洲va久久久久| 久久久无码精品亚洲日韩软件| .精品久久久麻豆国产精品| 亚洲精品第一综合99久久| 久久久久久毛片免费看| 9191精品国产免费久久| 久久人妻少妇嫩草AV无码专区| 日韩人妻无码一区二区三区久久99| 精品久久久久久久久久中文字幕 | 伊人久久综在合线亚洲2019| 亚洲精品无码成人片久久| 免费精品久久久久久中文字幕| 9久久9久久精品| 久久亚洲精品国产精品| 久久亚洲中文字幕精品一区| 欧美久久天天综合香蕉伊| 美女久久久久久| 欧美伊人久久大香线蕉综合| 久久伊人精品一区二区三区|