2,552
社区成员




HRESULT SetResolution()
{
// MYLOG("SetResolution");
HRESULT hr = S_OK;
CComPtr<IAMStreamConfig> pConfig;
CComPtr<IPin> previewPin = GetPinByName(pVideoCapture, TEXT("preview"));
if (previewPin == NULL)
{
MYLOG("fail to find the preview pin");
previewPin = GetPinByName(pVideoCapture, TEXT("capture"));
if (previewPin == NULL)
{
// no preview or still, fail here
return E_FAIL;
}
}
hr = previewPin->QueryInterface(&pConfig);
int iCount, iSize;
VIDEO_STREAM_CONFIG_CAPS caps;
pConfig->GetNumberOfCapabilities(&iCount, &iSize);
if (iCount == 0)
{
MYLOG("fail to GetNumberOfCapabilities");
return E_FAIL;
}
CameraCapacity* paCapacity = new CameraCapacity[iCount];
// find and save all the capacities
AM_MEDIA_TYPE *pmtPV=NULL;
for(int i=0;i<iCount;++i)
{
hr=pConfig->GetStreamCaps(i, &pmtPV, (BYTE*)&caps);
if (hr != S_OK)
{
MYLOG("fail to get stream caps");
}
else
{
if (pmtPV->subtype == MEDIASUBTYPE_YV12 ||
pmtPV->subtype == MEDIASUBTYPE_RGB565 ||
pmtPV->subtype == MEDIASUBTYPE_UYVY )
{
paCapacity[i].index = i;
paCapacity[i].width = caps.MaxOutputSize.cx;
paCapacity[i].height = caps.MaxOutputSize.cy;
paCapacity[i].guid = pmtPV->subtype;
MYLOG( "index = %d, width = %d, height = %d", paCapacity[i].index, paCapacity[i].width, paCapacity[i].height);
// to correct the value;
if (paCapacity[i].width < 0)
paCapacity[i].width *= -1;
if (paCapacity[i].height < 0)
paCapacity[i].height *= -1;
}
DeleteMediaType(pmtPV);
}
}
// here, we need find the most suitable size.
int suitableIndex = findSuitableResolution(paCapacity,iCount) ;
g_suitableResolution = paCapacity[suitableIndex];
if (IsEqualGUID (g_suitableResolution.guid,MEDIASUBTYPE_RGB565))
{
g_bVerticalFlip = true;
}
hr=pConfig->GetStreamCaps(paCapacity[suitableIndex].index, &pmtPV, (BYTE*)&caps);
delete [] paCapacity;
if(hr== S_OK)
{
hr=pConfig->SetFormat(pmtPV);
DeleteMediaType(pmtPV);
}
else
{
MYLOG("Fail to set format");
}
previewPin.Release();
previewPin = NULL;
return hr;
}