织梦CMS - 轻松建站从此开始!

罗索

使用directshow代替opencv的vfw的源代码

落鹤生 发布于 2010-04-25 16:20 点击:次 
本文提供了使用directshow代替opencv的vfw 的源代码,与转化为iplimage格式的算法. 实验中发现opencv的cvCaptureFromCAM 使用的是vfw,采用消息机制,速度较慢,测试发现fps只有 9-12左右,太慢了. 发现经过使用directshow后速度提升到60帧/s.
TAG:

本文提供了使用directshow代替opencv的vfw 的源代码,与转化为iplimage格式的算法.


实验中发现opencv的cvCaptureFromCAM 使用的是vfw,采用消息机制,速度较慢,测试发现fps只有 9-12左右,太慢了.  发现经过使用directshow后速度提升到60帧/s.在opencv group上了解到这是一个普遍问题,也许有人做过转换,却没有完整的例子与代码.在此贴出.对希望提高opencv视频分析速度的有所帮助.

用法如下:

  1. static ARFrameGrabber frameGrabber; 
  2. IplImage ds_frame; 
  3. frameGrabber.Init(0, true); 
  4. frameGrabber.SetFlippedImage(true); 
  5. for(;;) 
  6.     { 
  7.        IplImage *frame =0; 
  8.  frameGrabber.GrabByteFrame(); 
  9.  BYTE *myBuffer = frameGrabber.GetByteBuffer(); 
  10.  
  11.  int width = frameGrabber.GetWidth(); 
  12.  int height = frameGrabber.GetHeight();   
  13.  int stride  = (width * sizeof( RGBTRIPLE ) + 3) & -4; 
  14.  
  15.  cvInitImageHeader( &ds_frame, cvSize(width, height), 8, 3,IPL_ORIGIN_BL, 4 ); 
  16.  ds_frame.widthStep = stride;    
  17.  cvSetData( &ds_frame, myBuffer, stride );  
  18.  frame = &ds_frame; 
  19.         /* 视频分析部分 */ 
  20. }

以下是directshow源文件,加入工程可用.

  1. // ARFrameGrabber.h: interface for the ARFrameGrabber class. 
  2. // 
  3. ////////////////////////////////////////////////////////////////////// 
  4. #if !defined(AFX_ARFRAMEGRABBER_H__C5553937_4BAB_4FEF_B4A6_1693AB0C99E3__INCLUDED_) 
  5. #define AFX_ARFRAMEGRABBER_H__C5553937_4BAB_4FEF_B4A6_1693AB0C99E3__INCLUDED_ 
  6.  
  7. #if _MSC_VER > 1000 
  8. #pragma once 
  9. #endif // _MSC_VER > 1000 
  10.  
  11. //#include <AR/config.h> 
  12.  
  13. #define WIN32_LEAN_AND_MEAN 
  14. #include <windows.h> 
  15. #include <dshow.h> 
  16. //#include <streams.h> 
  17. #include <atlbase.h> 
  18. #include <qedit.h> 
  19.  
  20. class SmartString 
  21. public
  22.  SmartString():str(NULL) {} 
  23.  
  24.  SmartString(char* pStr):str(NULL) 
  25.  { 
  26.   if (pStr) 
  27.   { 
  28.    int size = int(strlen(pStr)); 
  29.    str = new char[size+1]; 
  30.    strcpy(str, pStr); 
  31.   } 
  32.  } 
  33.  
  34.  SmartString(SmartString& sStr) 
  35.  { 
  36.   SetString(sStr.GetBuffer()); 
  37.  } 
  38.  
  39.  ~SmartString() 
  40.  { 
  41.   if (str) 
  42.    delete[] str; 
  43.  } 
  44.  
  45.  SmartString& operator =(char* pStr) 
  46.  { 
  47.   SetString(pStr); 
  48.   return *this
  49.  } 
  50.  
  51.  SmartString& operator =(SmartString& sStr) 
  52.  { 
  53.   SetString(sStr.GetBuffer()); 
  54.   return *this
  55.  } 
  56.  
  57.  char* GetBuffer() {return str;} 
  58.  
  59. protected
  60.  void SetString(char *pStr) 
  61.  { 
  62.   if (str) 
  63.    delete[] str; 
  64.  
  65.   if (!pStr) 
  66.   { 
  67.    str = NULL; 
  68.   } 
  69.   else 
  70.   { 
  71.    int size = int(strlen(pStr)); 
  72.    str = new char[size + 1]; 
  73.    strcpy(str, pStr); 
  74.   } 
  75.  
  76.  } 
  77.  
  78.  
  79.  char* str; 
  80. }; 
  81.  
  82. class DeviceInfo 
  83. public
  84.  DeviceInfo():next(NULL), deviceId(-1) 
  85.  { 
  86.  } 
  87.  ~DeviceInfo() 
  88.  { 
  89.   if (next) 
  90.    delete next; 
  91.  } 
  92.  
  93.  
  94.  SmartString friendlyName; 
  95.  int   deviceId;  
  96.  DeviceInfo* next; 
  97. }; 
  98.  
  99.  
  100. class  ARFrameGrabber  
  101. public
  102.  ARFrameGrabber(); 
  103.  virtual ~ARFrameGrabber(); 
  104.  
  105.  void Init(int deviceId, bool displayProperties = true); 
  106.  void BindFilter(int deviceId, IBaseFilter **pFilter); 
  107.  void GrabFrame(long* size, long** pBuffer); 
  108.  void GrabFrame(); 
  109.  void Grab32BitFrame(); 
  110.  void GrabByteFrame(); 
  111.  void SetCrossBar(); 
  112.   
  113.  
  114.  
  115.  long  GetBufferSize() {return bufferSize;} 
  116.  long* GetBuffer() {return pBuffer;} 
  117.  BYTE* GetByteBuffer() {return pBYTEbuffer;} 
  118.   
  119.  void SetFlippedImage(bool flag) {flipImage = flag;} 
  120.  
  121.  void DisplayProperties(); 
  122.  void EnumDevices(DeviceInfo *head); 
  123.     int GetWidth(); 
  124.     int GetHeight(); 
  125.  
  126. protected
  127.  CComPtr<IGraphBuilder> pGraph; 
  128.  CComPtr<IBaseFilter> pDeviceFilter; 
  129.  CComPtr<IMediaControl> pMediaControl; 
  130.  CComPtr<IBaseFilter> pSampleGrabberFilter; 
  131.  CComPtr<ISampleGrabber> pSampleGrabber; 
  132.  CComPtr<IPin> pGrabberInput; 
  133.  CComPtr<IPin> pGrabberOutput; 
  134.  CComPtr<IPin> pCameraOutput; 
  135.  CComPtr<IMediaEvent> pMediaEvent; 
  136.  CComPtr<IBaseFilter> pNullFilter; 
  137.  CComPtr<IPin> pNullInputPin; 
  138.  
  139.  void FlipImage(long* pBuf); 
  140.  
  141. private
  142.  void ReportError(char *msg); 
  143.  
  144.  bool flipImage; 
  145.  long bufferSize; 
  146.  long *pBuffer; 
  147.  BYTE *pBYTEbuffer; 
  148.     bool connected; 
  149.     int width; 
  150.     int height; 
  151. }; 
  152.  
  153. #endif // !defined(AFX_ARFRAMEGRABBER_H__C5553937_4BAB_4FEF_B4A6_1693AB0C99E3__INCLUDED_) 
  154.  
  155. ARFrameGrabber.cpp 
  156. // ARFrameGrabber.cpp: implementation of the ARFrameGrabber class. 
  157. // 
  158. ////////////////////////////////////////////////////////////////////// 
  159.  
  160. #include "stdafx.h" 
  161. #include <assert.h> 
  162. #include "ARFrameGrabber.h" 
  163.  
  164. ////////////////////////////////////////////////////////////////////// 
  165. // Construction/Destruction 
  166. ////////////////////////////////////////////////////////////////////// 
  167.  
  168. ARFrameGrabber::ARFrameGrabber() 
  169.     : pBuffer(NULL), bufferSize(0), flipImage(false), connected(false), width(0), height(0) 
  170.  
  171. ARFrameGrabber::~ARFrameGrabber() 
  172.  pMediaControl->Stop(); 
  173.  if (pBuffer) 
  174.   delete[] pBuffer; 
  175.  if(pBYTEbuffer) 
  176.   delete[] pBYTEbuffer; 
  177.  
  178.  
  179. void ARFrameGrabber::Init(int deviceId, bool displayProperties) 
  180.  HRESULT hr = S_OK; 
  181.  CoInitialize(NULL); 
  182.  // Create the Filter Graph Manager. 
  183.  hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, 
  184.   IID_IGraphBuilder, (void **)&pGraph); 
  185.  
  186.  hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, 
  187.     IID_IBaseFilter, (LPVOID *)&pSampleGrabberFilter); 
  188.  
  189.  hr = pGraph->QueryInterface(IID_IMediaControl, (void **) &pMediaControl); 
  190.  hr = pGraph->QueryInterface(IID_IMediaEvent, (void **) &pMediaEvent); 
  191.  
  192.  hr = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, 
  193.   IID_IBaseFilter, (LPVOID*) &pNullFilter); 
  194.  
  195.  hr = pGraph->AddFilter(pNullFilter, L"NullRenderer"); 
  196.  
  197.  hr = pSampleGrabberFilter->QueryInterface(IID_ISampleGrabber, (void**)&pSampleGrabber); 
  198.  
  199.  AM_MEDIA_TYPE   mt; 
  200.  ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE)); 
  201.  mt.majortype = MEDIATYPE_Video; 
  202.  mt.subtype = MEDIASUBTYPE_RGB32; 
  203.  mt.formattype = FORMAT_VideoInfo; 
  204.  hr = pSampleGrabber->SetMediaType(&mt); 
  205.  
  206.  pGraph->AddFilter(pSampleGrabberFilter, L"Grabber"); 
  207.   
  208.  
  209.  
  210.  // Bind Device Filter.  We know the device because the id was passed in 
  211.  BindFilter(deviceId, &pDeviceFilter); 
  212.  pGraph->AddFilter(pDeviceFilter, NULL); 
  213.  
  214.  CComPtr<IEnumPins> pEnum; 
  215.  pDeviceFilter->EnumPins(&pEnum); 
  216.   
  217.  hr = pEnum->Reset(); 
  218.  hr = pEnum->Next(1, &pCameraOutput, NULL); 
  219.  
  220.  
  221.  pEnum = NULL; 
  222.  pSampleGrabberFilter->EnumPins(&pEnum); 
  223.  pEnum->Reset(); 
  224.  hr = pEnum->Next(1, &pGrabberInput, NULL); 
  225.  
  226.  pEnum = NULL; 
  227.  pSampleGrabberFilter->EnumPins(&pEnum); 
  228.  pEnum->Reset(); 
  229.  pEnum->Skip(1); 
  230.  hr = pEnum->Next(1, &pGrabberOutput, NULL); 
  231.  
  232.  
  233.   
  234.  
  235.  pEnum = NULL; 
  236.  pNullFilter->EnumPins(&pEnum); 
  237.  pEnum->Reset(); 
  238.  hr = pEnum->Next(1, &pNullInputPin, NULL); 
  239.  
  240.   SetCrossBar(); 
  241.  
  242.     if (displayProperties) { 
  243.    CComPtr<ISpecifyPropertyPages> pPages; 
  244.  
  245.    HRESULT hr = pCameraOutput->QueryInterface(IID_ISpecifyPropertyPages, (void**)&pPages); 
  246.    if (SUCCEEDED(hr)) 
  247.    { 
  248.     PIN_INFO PinInfo; 
  249.     pCameraOutput->QueryPinInfo(&PinInfo); 
  250.  
  251.     CAUUID caGUID; 
  252.     pPages->GetPages(&caGUID); 
  253.  
  254.     OleCreatePropertyFrame( 
  255.      NULL, 
  256.      0, 
  257.      0, 
  258.      L"Property Sheet"
  259.      1, 
  260.      (IUnknown **)&(pCameraOutput.p), 
  261.      caGUID.cElems, 
  262.      caGUID.pElems, 
  263.      0, 
  264.      0, 
  265.      NULL); 
  266.     CoTaskMemFree(caGUID.pElems); 
  267.     PinInfo.pFilter->Release(); 
  268.    } 
  269.     } 
  270.  
  271.     hr = pGraph->Connect(pCameraOutput, pGrabberInput); 
  272.  
  273.  hr = pGraph->Connect(pGrabberOutput, pNullInputPin); 
  274.  
  275. // hr = pGraph->Render(pGrabberOutput); 
  276.  
  277.  if (FAILED(hr)) 
  278.  { 
  279.   switch(hr) 
  280.   { 
  281.   case VFW_S_NOPREVIEWPIN : 
  282.    break
  283.   case E_FAIL : 
  284.    break
  285.   case E_INVALIDARG : 
  286.    break
  287.   case E_POINTER : 
  288.    break
  289.   } 
  290.  } 
  291.  
  292.  pSampleGrabber->SetBufferSamples(TRUE); 
  293.  pSampleGrabber->SetOneShot(TRUE); 
  294.     
  295.     hr = pSampleGrabber->GetConnectedMediaType(&mt); 
  296.     VIDEOINFOHEADER *videoHeader; 
  297.     assert(mt.formattype == FORMAT_VideoInfo); 
  298.     videoHeader = reinterpret_cast<VIDEOINFOHEADER*>(mt.pbFormat); 
  299.     width = videoHeader->bmiHeader.biWidth; 
  300.     height = videoHeader->bmiHeader.biHeight; 
  301.     connected = true
  302.  
  303. void ARFrameGrabber::GrabFrame(long* size, long** pBuffer) 
  304.     if (!size) 
  305.   return
  306.  
  307.  // don't want to leak mem, pBuffer must be NULL 
  308.  if (!pBuffer || *pBuffer) 
  309.   return
  310.  
  311.  long evCode; 
  312.  
  313.  
  314.  pMediaControl->Run(); 
  315.  pMediaEvent->WaitForCompletion(INFINITE, &evCode); 
  316.  pSampleGrabber->GetCurrentBuffer(size, NULL); 
  317.  if (*size) 
  318.  { 
  319.   *pBuffer = new long[*size]; 
  320.  } 
  321.  
  322.  pSampleGrabber->GetCurrentBuffer(size, *pBuffer); 
  323.  
  324. void ARFrameGrabber::GrabFrame() 
  325.  long evCode; 
  326.  long size = 0; 
  327.  
  328.  pMediaControl->Run(); 
  329.  pMediaEvent->WaitForCompletion(INFINITE, &evCode); 
  330.  pSampleGrabber->GetCurrentBuffer(&size, NULL); 
  331.  
  332.  // if buffer is not the same size as before, create a new one 
  333.  if (size != bufferSize) 
  334.  { 
  335.   if (pBuffer) 
  336.    delete[] pBuffer; 
  337.  
  338.   bufferSize = size; 
  339.  
  340.   pBuffer = new long[bufferSize]; 
  341.  } 
  342.  
  343.  pSampleGrabber->GetCurrentBuffer(&size, pBuffer); 
  344.  if (flipImage) 
  345.   FlipImage(pBuffer); 
  346.  
  347. void ARFrameGrabber::FlipImage(long* pBuf) 
  348.  DWORD *ptr = (DWORD*)pBuf; 
  349.  int pixelCount = bufferSize/4; 
  350.  
  351.   
  352.  if (!pBuf) 
  353.   return
  354.  
  355.  for (int index = 0; index < pixelCount/2; index++) 
  356.  { 
  357.   ptr[index] = ptr[index] ^ ptr[pixelCount - index - 1]; 
  358.   ptr[pixelCount - index - 1] = ptr[index] ^ ptr[pixelCount - index - 1]; 
  359.   ptr[index] = ptr[index] ^ ptr[pixelCount - index - 1]; 
  360.  } 
  361.  
  362. //add by hardy 
  363. void ARFrameGrabber::GrabByteFrame() 
  364.  
  365.  long evCode; 
  366.  long size = 0; 
  367.  
  368.  pMediaControl->Run(); 
  369.  pMediaEvent->WaitForCompletion(INFINITE, &evCode); 
  370.  pSampleGrabber->GetCurrentBuffer(&size, NULL); 
  371.  
  372.  // if buffer is not the same size as before, create a new one 
  373.  if (size != bufferSize) 
  374.  { 
  375.   if (pBuffer) 
  376.    delete[] pBuffer; 
  377.   bufferSize = size; 
  378.   pBuffer = new long[bufferSize]; 
  379.   if(pBYTEbuffer) 
  380.    delete[] pBYTEbuffer; 
  381.   pBYTEbuffer = new BYTE[bufferSize/4*3]; 
  382.  
  383.  } 
  384.  
  385.  pSampleGrabber->GetCurrentBuffer(&size, pBuffer); 
  386.  BYTE *pTemp = (BYTE*) pBuffer; 
  387.  BYTE *pBYTETemp =  pBYTEbuffer; 
  388.  for(int i =0 ;i<bufferSize;i++) 
  389.  { 
  390. /* 
  391.   *(pBYTEbuffer) = *(pTemp);     //G 
  392.   *(pBYTEbuffer++) = *(pTemp++); //B 
  393.   *(pBYTEbuffer++) = *(pTemp++); //R 
  394.   pTemp++; 
  395.   pTemp++; 
  396.   */ 
  397.   if((i+1)%4==0) 
  398.   { 
  399.    pTemp++; 
  400.   } 
  401.   else 
  402.   { 
  403.   *(pBYTETemp) = *(pTemp);     //G  
  404.   pBYTETemp++; 
  405.   pTemp++; 
  406.   } 
  407.  } 
  408.  
  409. void ARFrameGrabber::Grab32BitFrame() 
  410.  long evCode; 
  411.  long size = 0; 
  412.  long* pData; 
  413.  unsigned char* pTemp; 
  414.  unsigned char* ptr; 
  415.  
  416.  pMediaControl->Run(); 
  417.  pMediaEvent->WaitForCompletion(INFINITE, &evCode); 
  418.  pSampleGrabber->GetCurrentBuffer(&size, NULL); 
  419.  
  420.  if (size != bufferSize) 
  421.  { 
  422.   if (pBuffer) 
  423.    delete[] pBuffer; 
  424.  
  425.   bufferSize = size/3*4;  // add space for padding 
  426.  
  427.   pBuffer = new long[bufferSize]; 
  428.  } 
  429.  
  430.  pData= (long*) new unsigned char[size]; 
  431.  pSampleGrabber->GetCurrentBuffer(&size, pData); 
  432.  ptr = ((unsigned char*)pBuffer) + bufferSize - 1; 
  433.  pTemp = (unsigned char*) pData; 
  434.  
  435.  
  436.  // do the padding 
  437.  for (int index = 0; index < size/3; index++) 
  438.  { 
  439.   unsigned char r = *(pTemp++); 
  440.   unsigned char g = *(pTemp++); 
  441.   unsigned char b = *(pTemp++); 
  442.  
  443.   *(ptr--) = 0; 
  444.   *(ptr--) = b; 
  445.   *(ptr--) = g; 
  446.   *(ptr--) = r; 
  447.  } 
  448. /* 
  449.  for (int index = 0; index < size; index++) 
  450.  { 
  451.   *ptr = ((unsigned char *)pTemp)[index]; 
  452.   ptr--; 
  453.   if (index % 3 == 2) 
  454.   { 
  455.    *ptr = 0; 
  456.    ptr--; 
  457.   } 
  458.  } 
  459. */ 
  460.  delete[] pData; 
  461.  
  462. void ARFrameGrabber::BindFilter(int deviceId, IBaseFilter **pFilter) 
  463.  if (deviceId < 0) 
  464.   return
  465.   
  466.     // enumerate all video capture devices 
  467.  CComPtr<ICreateDevEnum> pCreateDevEnum; 
  468.     HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, 
  469.      IID_ICreateDevEnum, (void**)&pCreateDevEnum); 
  470.     if (hr != NOERROR) 
  471.  { 
  472. //  ErrMsg("Error Creating Device Enumerator"); 
  473.   return
  474.  } 
  475.  
  476.     CComPtr<IEnumMoniker> pEm; 
  477.     hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, 
  478.         &pEm, 0); 
  479.     if (hr != NOERROR) 
  480.  { 
  481. //  ErrMsg("Sorry, you have no video capture hardware"); 
  482.   return
  483.     } 
  484.  
  485.     pEm->Reset(); 
  486.     ULONG cFetched; 
  487.     IMoniker *pM; 
  488.  int index = 0; 
  489.     while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK, index <= deviceId) 
  490.     { 
  491.   IPropertyBag *pBag; 
  492.   hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); 
  493.   if(SUCCEEDED(hr)) 
  494.   { 
  495.    VARIANT var; 
  496.    var.vt = VT_BSTR; 
  497.    hr = pBag->Read(L"FriendlyName", &var, NULL); 
  498.    if (hr == NOERROR) 
  499.    { 
  500.     if (index == deviceId) 
  501.     { 
  502.      pM->BindToObject(0, 0, IID_IBaseFilter, (void**)pFilter); 
  503.     } 
  504.     SysFreeString(var.bstrVal); 
  505.    } 
  506.    pBag->Release(); 
  507.   } 
  508.   pM->Release(); 
  509.   index++; 
  510.     } 
  511.  
  512. int ARFrameGrabber::GetWidth() 
  513.   return width; 
  514.  
  515. int ARFrameGrabber::GetHeight() 
  516.   return height; 
  517.  
  518. void ARFrameGrabber::EnumDevices(DeviceInfo *head) 
  519.  if (!head) 
  520.   return
  521.  
  522.  DeviceInfo *ptr = head; 
  523.  int id = 0; 
  524.   
  525.     // enumerate all video capture devices 
  526.  CComPtr<ICreateDevEnum> pCreateDevEnum; 
  527. //    ICreateDevEnum *pCreateDevEnum; 
  528.     HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, 
  529.      IID_ICreateDevEnum, (void**)&pCreateDevEnum); 
  530.     if (hr != NOERROR) 
  531.  { 
  532. //  ErrMsg("Error Creating Device Enumerator"); 
  533.   return
  534.  } 
  535.  
  536.     CComPtr<IEnumMoniker> pEm; 
  537.     hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, 
  538.         &pEm, 0); 
  539.     if (hr != NOERROR) 
  540.  { 
  541. //  ErrMsg("Sorry, you have no video capture hardware"); 
  542.   return
  543.     } 
  544.  
  545.     pEm->Reset(); 
  546.     ULONG cFetched; 
  547.     IMoniker *pM; 
  548.     while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK) 
  549.     { 
  550.   IPropertyBag *pBag; 
  551.   hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); 
  552.   if(SUCCEEDED(hr)) 
  553.   { 
  554.    VARIANT var; 
  555.    var.vt = VT_BSTR; 
  556.    hr = pBag->Read(L"FriendlyName", &var, NULL); 
  557.    if (hr == NOERROR) 
  558.    { 
  559.     char str[2048]; 
  560.      
  561.     if (ptr->deviceId != -1) 
  562.     { 
  563.      ptr->next = new DeviceInfo(); 
  564.      ptr = ptr->next; 
  565.     } 
  566.  
  567.  
  568.     ptr->deviceId = id++; 
  569.     WideCharToMultiByte(CP_ACP,0,var.bstrVal, -1, str, 2048, NULL, NULL); 
  570.      
  571.     ptr->friendlyName = str; 
  572.  
  573.     SysFreeString(var.bstrVal); 
  574.    } 
  575.    pBag->Release(); 
  576.   } 
  577.   pM->Release(); 
  578.     } 
  579.  
  580.  
  581. void ARFrameGrabber::ReportError(char *msg) 
  582.  //MessageBox(NULL, msg, "ARFrameGrabber Error", MB_ICONSTOP); 
  583. //将输入crossbar变成PhysConn_Video_Composite 
  584. void ARFrameGrabber::SetCrossBar() 
  585.  IAMCrossbar *pXBar1 = NULL; 
  586.  ICaptureGraphBuilder2 *pBuilder = NULL; 
  587.  
  588.   
  589.  HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, 
  590.         CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, 
  591.         (void **)&pBuilder); 
  592.  
  593.  if (SUCCEEDED(hr)) 
  594.     { 
  595.         hr = pBuilder->SetFiltergraph(pGraph); 
  596.     } 
  597.  
  598.  
  599.  hr = pBuilder->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, 
  600.   pDeviceFilter,IID_IAMCrossbar, (void**)&pXBar1); 
  601.  
  602.  if (SUCCEEDED(hr)) 
  603.  { 
  604.    
  605.   long OutputPinCount; 
  606.   long InputPinCount; 
  607.   long PinIndexRelated; 
  608.   long PhysicalType; 
  609.   long inPort = 0; 
  610.   long outPort = 0; 
  611.  
  612.   pXBar1->get_PinCounts(&OutputPinCount,&InputPinCount); 
  613.   for(int i =0;i<InputPinCount;i++) 
  614.   { 
  615.    pXBar1->get_CrossbarPinInfo(TRUE,i,&PinIndexRelated,&PhysicalType); 
  616.    if(PhysConn_Video_Composite==PhysicalType) 
  617.    { 
  618.     inPort = i; 
  619.     break
  620.    } 
  621.   } 
  622.   for(int i =0;i<OutputPinCount;i++) 
  623.   { 
  624.  pXBar1->get_CrossbarPinInfo(FALSE,i,&PinIndexRelated,&PhysicalType); 
  625.    if(PhysConn_Video_VideoDecoder==PhysicalType) 
  626.    { 
  627.     outPort = i; 
  628.     break
  629.    } 
  630.   } 
  631.   if(S_OK==pXBar1->CanRoute(outPort,inPort)) 
  632.   { 
  633.    pXBar1->Route(outPort,inPort); 
  634.   } 
  635.   pXBar1->Release();   
  636.  } 
  637.  pBuilder->Release(); 

 

(hardVB)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9255.html]
本文出处:CSDN博客 作者:hardVB
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容