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();
}








