public CaptureFormat[] GetCaptureFormats() { if (m_pSource == null) { CreateVideoCaptureSource(); } IMFPresentationDescriptor pPD = null; IMFStreamDescriptor pSD = null; IMFMediaTypeHandler pHandler = null; IMFMediaType pType = null; int hr = m_pSource.CreatePresentationDescriptor(out pPD); MFError.ThrowExceptionForHR(hr); bool fSelected; hr = pPD.GetStreamDescriptorByIndex(0, out fSelected, out pSD); MFError.ThrowExceptionForHR(hr); hr = pSD.GetMediaTypeHandler(out pHandler); MFError.ThrowExceptionForHR(hr); int cTypes = 0; hr = pHandler.GetMediaTypeCount(out cTypes); MFError.ThrowExceptionForHR(hr); CaptureFormat[] captureFormats = new CaptureFormat[cTypes]; for (int i = 0; i < cTypes; i++) { hr = pHandler.GetMediaTypeByIndex(i, out pType); MFError.ThrowExceptionForHR(hr); CaptureFormat mediatype = LogMediaType(pType); Trace.WriteLine(mediatype); Trace.WriteLine("Media Type " + i.ToString()); captureFormats[i] = mediatype; //OutputDebugString(L"\n"); Marshal.FinalReleaseComObject(pType); } Marshal.FinalReleaseComObject(pPD); Marshal.FinalReleaseComObject(pSD); Marshal.FinalReleaseComObject(pHandler); Marshal.FinalReleaseComObject(pType); return(captureFormats); }
private CaptureFormat LogMediaType(IMFMediaType pType) { int count = 0; int hr = pType.GetCount(out count); MFError.ThrowExceptionForHR(hr); if (count == 0) { Trace.WriteLine("Empty media type."); } CaptureFormat capFormat = new CaptureFormat(); for (int i = 0; i < count; i++) { LogAttributeValueByIndex(pType, i, ref capFormat); MFError.ThrowExceptionForHR(hr); } return(capFormat); }
private string LogAttributeValueByIndex(IMFAttributes pAttr, int index, ref CaptureFormat capFormat) { //string pGuidName = null; //string pGuidValName = null; Guid guid = Guid.Empty; PropVariant var = new PropVariant(); //PropVariantInit(&var); int hr = pAttr.GetItemByIndex(index, out guid, var); MFError.ThrowExceptionForHR(hr); if (guid == MFAttributesClsid.MF_MT_FRAME_RATE) { //Trace.WriteLine("MF_MT_FRAME_RATE"); int lower = (int)var.GetULong(); //Trace.WriteLine("LogAttr1_1 = " + lower.ToString()); int upperbits = (int)(var.GetULong() >> 32); //Trace.WriteLine("LogAttr1_2 = " + upperbits.ToString()); float fr = (float)upperbits / (float)lower; capFormat.Framerate = fr; Trace.WriteLine("FrameRate = " + fr.ToString()); return("Framerate=" + fr.ToString() + ", "); } else if (guid == MFAttributesClsid.MF_MT_FRAME_RATE_RANGE_MAX) { //Trace.WriteLine("MF_MT_FRAME_RATE_RANGE_MAX"); int lower = (int)var.GetULong(); //Trace.WriteLine("LogAttr1_1 = " + lower.ToString()); int upperbits = (int)(var.GetULong() >> 32); //Trace.WriteLine("LogAttr1_2 = " + upperbits.ToString()); //return "MaxFramerate=" + fr.ToString() + ", "; } else if (guid == MFAttributesClsid.MF_MT_FRAME_RATE_RANGE_MIN) { //Trace.WriteLine("MF_MT_FRAME_RATE_RANGE_MIN"); int lower = (int)var.GetULong(); //Trace.WriteLine("LogAttr1_1 = " + lower.ToString()); int upperbits = (int)(var.GetULong() >> 32); float fr = (float)upperbits / (float)lower; //return "MinFramerate=" + fr.ToString() + ", "; //Trace.WriteLine("LogAttr1_2 = " + upperbits.ToString()); } else if (guid == MFAttributesClsid.MF_MT_FRAME_SIZE) { //Trace.WriteLine("MF_MT_FRAME_SIZE"); int lower = (int)var.GetULong(); // Trace.WriteLine("LogAttr1_1 = " + lower.ToString()); int upperbits = (int)(var.GetULong() >> 32); //Trace.WriteLine("LogAttr1_2 = " + upperbits.ToString()); capFormat.Height = lower; capFormat.Width = upperbits; Trace.WriteLine("Resolution=" + lower.ToString() + "X" + upperbits.ToString()); return("Resolution=" + lower.ToString() + "X" + upperbits.ToString()); } else if (guid == MFAttributesClsid.MF_MT_PIXEL_ASPECT_RATIO) { //Trace.WriteLine("MF_MT_PIXEL_ASPECT_RATIO"); int lower = (int)var.GetULong(); //Trace.WriteLine("LogAttr1_1 = " + lower.ToString()); int upperbits = (int)(var.GetULong() >> 32); //Trace.WriteLine("LogAttr1_2 = " + upperbits.ToString()); } else if (guid == MFAttributesClsid.MF_MT_GEOMETRIC_APERTURE) { //Trace.WriteLine("MF_MT_GEOMETRIC_APERTURE"); //Trace.WriteLine("LogAttr2 = " + var.ToString()); } else if (guid == MFAttributesClsid.MF_MT_MINIMUM_DISPLAY_APERTURE) { //Trace.WriteLine("MF_MT_MINIMUM_DISPLAY_APERTURE"); //Trace.WriteLine("LogAttr2 = " + var.ToString()); } else if (guid == MFAttributesClsid.MF_MT_PAN_SCAN_APERTURE) { //Trace.WriteLine("MF_MT_PAN_SCAN_APERTURE"); //Trace.WriteLine("LogAttr2 = " + var.ToString()); } else if (guid == MFAttributesClsid.MF_MT_SUBTYPE) { capFormat.PixelFormat = var.GetGuid(); } else { Trace.WriteLine("Unknown attr " + guid.ToString() + " val = " + var.ToString()); } return(""); }