China Open source community
站内导航:

 
 
 
当前位置: 首页 >> 应用软件 >> 桌面与多媒体 >> 使用directshow代替opencv的vfw的源代码
 

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

作者:      来源:blog.csdn.net/hardVB     发表时间:2006-06-01     浏览次数:      字号:    

void ARFrameGrabber::GrabFrame(long* size, long** pBuffer)
{
    if (!size)
  return;

 // don't want to leak mem, pBuffer must be NULL
 if (!pBuffer || *pBuffer)
  return;

 long evCode;


 pMediaControl->Run();
 pMediaEvent->WaitForCompletion(INFINITE, &evCode);
 pSampleGrabber->GetCurrentBuffer(size, NULL);
 if (*size)
 {
  *pBuffer = new long[*size];
 }

 pSampleGrabber->GetCurrentBuffer(size, *pBuffer);
}

void ARFrameGrabber::GrabFrame()
{
 long evCode;
 long size = 0;

 pMediaControl->Run();
 pMediaEvent->WaitForCompletion(INFINITE, &evCode);
 pSampleGrabber->GetCurrentBuffer(&size, NULL);

 // if buffer is not the same size as before, create a new one
 if (size != bufferSize)
 {
  if (pBuffer)
   delete[] pBuffer;

  bufferSize = size;

  pBuffer = new long[bufferSize];
 }

 pSampleGrabber->GetCurrentBuffer(&size, pBuffer);
 if (flipImage)
  FlipImage(pBuffer);
}

void ARFrameGrabber::FlipImage(long* pBuf)
{
 DWORD *ptr = (DWORD*)pBuf;
 int pixelCount = bufferSize/4;


 if (!pBuf)
  return;

 for (int index = 0; index < pixelCount/2; index++)
 {
  ptr[index] = ptr[index] ^ ptr[pixelCount - index - 1];
  ptr[pixelCount - index - 1] = ptr[index] ^ ptr[pixelCount - index - 1];
  ptr[index] = ptr[index] ^ ptr[pixelCount - index - 1];
 }

}
//add by hardy
void ARFrameGrabber::GrabByteFrame()
{

 long evCode;
 long size = 0;

 pMediaControl->Run();
 pMediaEvent->WaitForCompletion(INFINITE, &evCode);
 pSampleGrabber->GetCurrentBuffer(&size, NULL);

 // if buffer is not the same size as before, create a new one
 if (size != bufferSize)
 {
  if (pBuffer)
   delete[] pBuffer;
  bufferSize = size;
  pBuffer = new long[bufferSize];
  if(pBYTEbuffer)
   delete[] pBYTEbuffer;
  pBYTEbuffer = new BYTE[bufferSize/4*3];

 }

 pSampleGrabber->GetCurrentBuffer(&size, pBuffer);
 BYTE *pTemp = (BYTE*) pBuffer;
 BYTE *pBYTETemp =  pBYTEbuffer;
 for(int i =0 ;i<bufferSize;i++)
 {
/*
  *(pBYTEbuffer) = *(pTemp);     //G
  *(pBYTEbuffer++) = *(pTemp++); //B
  *(pBYTEbuffer++) = *(pTemp++); //R
  pTemp++;
  pTemp++;
  */
  if((i+1)%4==0)
  {
   pTemp++;
  }
  else
  {
  *(pBYTETemp) = *(pTemp);     //G 
  pBYTETemp++;
  pTemp++;
  }
 }
}

void ARFrameGrabber::Grab32BitFrame()
{
 long evCode;
 long size = 0;
 long* pData;
 unsigned char* pTemp;
 unsigned char* ptr;

 pMediaControl->Run();
 pMediaEvent->WaitForCompletion(INFINITE, &evCode);
 pSampleGrabber->GetCurrentBuffer(&size, NULL);

 if (size != bufferSize)
 {
  if (pBuffer)
   delete[] pBuffer;

  bufferSize = size/3*4;  // add space for padding

  pBuffer = new long[bufferSize];
 }

 pData= (long*) new unsigned char[size];
 pSampleGrabber->GetCurrentBuffer(&size, pData);
 ptr = ((unsigned char*)pBuffer) + bufferSize - 1;
 pTemp = (unsigned char*) pData;


 // do the padding
 for (int index = 0; index < size/3; index++)
 {
  unsigned char r = *(pTemp++);
  unsigned char g = *(pTemp++);
  unsigned char b = *(pTemp++);

  *(ptr--) = 0;
  *(ptr--) = b;
  *(ptr--) = g;
  *(ptr--) = r;
 }
/*
 for (int index = 0; index < size; index++)
 {
  *ptr = ((unsigned char *)pTemp)[index];
  ptr--;
  if (index % 3 == 2)
  {
   *ptr = 0;
   ptr--;
  }
 }
*/
 delete[] pData;
}

void ARFrameGrabber::BindFilter(int deviceId, IBaseFilter **pFilter)
{
 if (deviceId < 0)
  return;
 
    // enumerate all video capture devices
 CComPtr<ICreateDevEnum> pCreateDevEnum;
    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
     IID_ICreateDevEnum, (void**)&pCreateDevEnum);
    if (hr != NOERROR)
 {
//  ErrMsg("Error Creating Device Enumerator");
  return;
 }

    CComPtr<IEnumMoniker> pEm;
    hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
        &pEm, 0);
    if (hr != NOERROR)
 {
//  ErrMsg("Sorry, you have no video capture hardware");
  return;
    }

    pEm->Reset();
    ULONG cFetched;
    IMoniker *pM;
 int index = 0;
    while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK, index <= deviceId)
    {
  IPropertyBag *pBag;
  hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
  if(SUCCEEDED(hr))
  {
   VARIANT var;
   var.vt = VT_BSTR;
   hr = pBag->Read(L"FriendlyName", &var, NULL);
   if (hr == NOERROR)
   {
    if (index == deviceId)
    {
     pM->BindToObject(0, 0, IID_IBaseFilter, (void**)pFilter);
    }
    SysFreeString(var.bstrVal);
   }
   pBag->Release();
  }
  pM->Release();
  index++;
    }
}

int ARFrameGrabber::GetWidth()
{
  return width;
}

int ARFrameGrabber::GetHeight()
{
  return height;
}

void ARFrameGrabber::EnumDevices(DeviceInfo *head)
{
 if (!head)
  return;

 DeviceInfo *ptr = head;
 int id = 0;
 
    // enumerate all video capture devices
 CComPtr<ICreateDevEnum> pCreateDevEnum;
//    ICreateDevEnum *pCreateDevEnum;
    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
     IID_ICreateDevEnum, (void**)&pCreateDevEnum);
    if (hr != NOERROR)
 {
//  ErrMsg("Error Creating Device Enumerator");
  return;
 }

    CComPtr<IEnumMoniker> pEm;
    hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
        &pEm, 0);
    if (hr != NOERROR)
 {
//  ErrMsg("Sorry, you have no video capture hardware");
  return;
    }

    pEm->Reset();
    ULONG cFetched;
    IMoniker *pM;
    while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
    {
  IPropertyBag *pBag;
  hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
  if(SUCCEEDED(hr))
  {
   VARIANT var;
   var.vt = VT_BSTR;
   hr = pBag->Read(L"FriendlyName", &var, NULL);
   if (hr == NOERROR)
   {
    char str[2048];
    
    if (ptr->deviceId != -1)
    {
     ptr->next = new DeviceInfo();
     ptr = ptr->next;
    }


    ptr->deviceId = id++;
    WideCharToMultiByte(CP_ACP,0,var.bstrVal, -1, str, 2048, NULL, NULL);
    
    ptr->friendlyName = str;

    SysFreeString(var.bstrVal);
   }
   pBag->Release();
  }
  pM->Release();
    }
}


void ARFrameGrabber::ReportError(char *msg)
{
 //MessageBox(NULL, msg, "ARFrameGrabber Error", MB_ICONSTOP);
}
//将输入crossbar变成PhysConn_Video_Composite
void ARFrameGrabber::SetCrossBar()
{
 IAMCrossbar *pXBar1 = NULL;
 ICaptureGraphBuilder2 *pBuilder = NULL;


 HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
        CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
        (void **)&pBuilder);

 if (SUCCEEDED(hr))
    {
        hr = pBuilder->SetFiltergraph(pGraph);
    }


 hr = pBuilder->FindInterface(&LOOK_UPSTREAM_ONLY, NULL,
  pDeviceFilter,IID_IAMCrossbar, (void**)&pXBar1);

 if (SUCCEEDED(hr))
 {
  
  long OutputPinCount;
  long InputPinCount;
  long PinIndexRelated;
  long PhysicalType;
  long inPort = 0;
  long outPort = 0;

  pXBar1->get_PinCounts(&OutputPinCount,&InputPinCount);
  for(int i =0;i<InputPinCount;i++)
  {
   pXBar1->get_CrossbarPinInfo(TRUE,i,&PinIndexRelated,&PhysicalType);
   if(PhysConn_Video_Composite==PhysicalType)
   {
    inPort = i;
    break;
   }
  }
  for(int i =0;i<OutputPinCount;i++)
  {
   pXBar1->get_CrossbarPinInfo(FALSE,i,&PinIndexRelated,&PhysicalType);
   if(PhysConn_Video_VideoDecoder==PhysicalType)
   {
    outPort = i;
    break;
   }
  }
  
  if(S_OK==pXBar1->CanRoute(outPort,inPort))
  {
   pXBar1->Route(outPort,inPort);
  }
  pXBar1->Release();  
 }
 pBuilder->Release();
}

[1] [2]

编辑 webmaster

 
 
 
评论
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •  
    中国源码网 - WWW.YUANMA.ORG - 中国开放源代码社区