/// <summary> /// Gets information from the registry about a Media Foundation transform (MFT). /// </summary> /// <param name="clsidMFT">The CLSID of the MFT to query.</param> /// <param name="name">Receives the name of the MFT.</param> /// <param name="inputTypes">Receives an array of input types supported by the MFT.</param> /// <param name="outputTypes">Receives an array of output types supported by the MFT.</param> /// <returns>If this function succeeds, it returns the S_OK member. Otherwise, it returns another HResult's member that describe the error.</returns> public static HResult GetInfo(Guid clsidMFT, out string name, out MFTRegisterTypeInfo[] inputTypes, out MFTRegisterTypeInfo[] outputTypes) { ArrayList inTypes = new ArrayList(); ArrayList outTypes = new ArrayList(); MFInt inTypesCount = new MFInt(); MFInt outTypesCount = new MFInt(); HResult hr = MFExtern.MFTGetInfo(clsidMFT, out name, inTypes, inTypesCount, outTypes, outTypesCount, IntPtr.Zero); inputTypes = new MFTRegisterTypeInfo[inTypesCount]; for (int i = 0; i < inTypesCount.ToInt32(); i++) { inputTypes[i] = (MFTRegisterTypeInfo)inTypes[i]; } outputTypes = new MFTRegisterTypeInfo[outTypesCount]; for (int i = 0; i < outTypesCount.ToInt32(); i++) { outputTypes[i] = (MFTRegisterTypeInfo)outTypes[i]; } return(hr); }
private void TestEnum() { ArrayList a1 = new ArrayList(); MFInt i1 = new MFInt(0); MFInt i2 = new MFInt(0); MFInt i3 = new MFInt(0); MFInt i4 = new MFInt(0); MFTRegisterTypeInfo rin = new MFTRegisterTypeInfo(); MFTRegisterTypeInfo rout = new MFTRegisterTypeInfo(); rin.guidMajorType = MFMediaType.Video; rin.guidSubtype = new FourCC("AYUV").ToMediaSubtype(); rout.guidMajorType = MFMediaType.Video; rout.guidSubtype = new FourCC("NV12").ToMediaSubtype(); int hr = MFExtern.MFTEnum(Guid.Empty, 0, null, null, null, a1, i1); MFError.ThrowExceptionForHR(hr); hr = MFExtern.MFTEnum(MFTransformCategory.MFT_CATEGORY_VIDEO_EFFECT, 0, null, null, null, a1, i2); MFError.ThrowExceptionForHR(hr); hr = MFExtern.MFTEnum(MFTransformCategory.MFT_CATEGORY_VIDEO_EFFECT, 0, rin, null, null, a1, i3); MFError.ThrowExceptionForHR(hr); hr = MFExtern.MFTEnum(MFTransformCategory.MFT_CATEGORY_VIDEO_EFFECT, 0, rin, rout, null, a1, i4); MFError.ThrowExceptionForHR(hr); Debug.Assert(i1 > 0 && i1 > i2 && i2 >= i3 && i3 >= i4 && i4 > 0); for (int y = 0; y < i4; y++) { MFInt itypescnt = new MFInt(0); MFInt otypescnt = new MFInt(0); ArrayList a = new ArrayList(); ArrayList b = new ArrayList(); Guid mft = (Guid)a1[y]; string s; hr = MFExtern.MFTGetInfo( mft, out s, a, itypescnt, b, otypescnt, IntPtr.Zero); MFError.ThrowExceptionForHR(hr); hr = MFExtern.MFTGetInfo( mft, out s, null, null, null, null, IntPtr.Zero); MFError.ThrowExceptionForHR(hr); for (int x = 0; x < itypescnt; x++) { MFTRegisterTypeInfo rti = a[x] as MFTRegisterTypeInfo; if (FourCC.IsA4ccSubtype(rti.guidMajorType)) { Debug.Write(new FourCC(rti.guidMajorType).ToString()); Debug.Write(" "); } Debug.WriteLine(rti.guidMajorType); if (FourCC.IsA4ccSubtype(rti.guidSubtype)) { Debug.Write(new FourCC(rti.guidSubtype).ToString()); Debug.Write(" "); } Debug.WriteLine(rti.guidSubtype); } Debug.WriteLine("----------------------"); for (int x = 0; x < otypescnt; x++) { MFTRegisterTypeInfo rti = b[x] as MFTRegisterTypeInfo; if (FourCC.IsA4ccSubtype(rti.guidMajorType)) { Debug.Write(new FourCC(rti.guidMajorType).ToString()); Debug.Write(" "); } Debug.WriteLine(rti.guidMajorType); if (FourCC.IsA4ccSubtype(rti.guidSubtype)) { Debug.Write(new FourCC(rti.guidSubtype).ToString()); Debug.Write(" "); } Debug.WriteLine(rti.guidSubtype); } Debug.WriteLine("==============================="); } }
private void TestReg() { // HKEY_CLASSES_ROOT\MediaFoundation\Transforms\ffa0d1f1-da7c-49cc-91ea-484dcf94a70a Guid g1 = new Guid("{ffa0d1f1-da7c-49cc-91ea-484dcf94a70a}"); string s; MFInt icnt = new MFInt(0); MFInt ocnt = new MFInt(0); IntPtr ip = IntPtr.Zero; ArrayList it = new ArrayList(); ArrayList ot = new ArrayList(); int hr = MFExtern.MFTRegister( g1, MFTransformCategory.MFT_CATEGORY_VIDEO_EFFECT, "asdf", 0, 0, null, 0, null, null); MFError.ThrowExceptionForHR(hr); hr = MFExtern.MFTGetInfo(g1, out s, it, icnt, ot, ocnt, ip); MFError.ThrowExceptionForHR(hr); hr = MFExtern.MFTUnregister(g1); // Always returns an error (http://social.msdn.microsoft.com/Forums/br/mediafoundationdevelopment/thread/7d3dc70f-8eae-4ad0-ad90-6c596cf78c80) //MFError.ThrowExceptionForHR(hr); Debug.Assert(s == "asdf"); MFTRegisterTypeInfo [] it1 = new MFTRegisterTypeInfo[2]; MFTRegisterTypeInfo [] ot1 = new MFTRegisterTypeInfo[3]; it1[0] = new MFTRegisterTypeInfo(); it1[1] = new MFTRegisterTypeInfo(); ot1[0] = new MFTRegisterTypeInfo(); ot1[1] = new MFTRegisterTypeInfo(); ot1[2] = new MFTRegisterTypeInfo(); it1[0].guidMajorType = MFMediaType.Video; it1[1].guidSubtype = new Guid("00000000-1111-2222-3333-444444444444"); it1[1].guidMajorType = MFMediaType.Video; ot1[0].guidMajorType = MFMediaType.Video; ot1[1].guidMajorType = MFMediaType.Video; ot1[2].guidMajorType = MFMediaType.Video; hr = MFExtern.MFTRegister( g1, MFTransformCategory.MFT_CATEGORY_VIDEO_EFFECT, "fdsa", 0, it1.Length, it1, ot1.Length, ot1, null); MFError.ThrowExceptionForHR(hr); ArrayList it2 = new ArrayList(); ArrayList ot2 = new ArrayList(); hr = MFExtern.MFTGetInfo(g1, out s, it2, icnt, ot2, ocnt, IntPtr.Zero); MFError.ThrowExceptionForHR(hr); Debug.Assert(s == "fdsa"); Debug.Assert(icnt == it1.Length && ocnt == ot1.Length); Debug.Assert(it2.Count == icnt && it1[0].guidMajorType == ((MFTRegisterTypeInfo)it2[0]).guidMajorType && it1[0].guidSubtype == ((MFTRegisterTypeInfo)it2[0]).guidSubtype && it1[1].guidMajorType == ((MFTRegisterTypeInfo)it2[1]).guidMajorType && it1[1].guidSubtype == ((MFTRegisterTypeInfo)it2[1]).guidSubtype ); Debug.Assert(ot2.Count == ocnt && ot1[0].guidMajorType == ((MFTRegisterTypeInfo)ot2[0]).guidMajorType && ot1[0].guidSubtype == ((MFTRegisterTypeInfo)ot2[0]).guidSubtype && ot1[1].guidMajorType == ((MFTRegisterTypeInfo)ot2[1]).guidMajorType && ot1[1].guidSubtype == ((MFTRegisterTypeInfo)ot2[1]).guidSubtype && ot1[2].guidMajorType == ((MFTRegisterTypeInfo)ot2[2]).guidMajorType && ot1[2].guidSubtype == ((MFTRegisterTypeInfo)ot2[2]).guidSubtype ); hr = MFExtern.MFTUnregister(g1); // Always returns an error: http://social.msdn.microsoft.com/Forums/br/mediafoundationdevelopment/thread/7d3dc70f-8eae-4ad0-ad90-6c596cf78c80 //MFError.ThrowExceptionForHR(hr); }
// Called just after invoking the COM method. The IntPtr is the same one that just got returned // from MarshalManagedToNative. The return value is unused. public object MarshalNativeToManaged(IntPtr pNativeData) { // When we are called with pNativeData == m_ArrayPtr, do nothing. All the // work is done when: if (pNativeData == m_MFIntPtr) { // Read the count int count = Marshal.ReadInt32(pNativeData); // If we have an array to return things in (ie MFTGetInfo wasn't passed // nulls) if (m_array != null) { IntPtr ip2 = Marshal.ReadIntPtr(m_ArrayPtr); // I don't know why this might happen, but it seems worth the check if (ip2 != IntPtr.Zero) { try { int iSize = Marshal.SizeOf(typeof(MFTRegisterTypeInfo)); // Size the array m_array.Capacity = count; // Copy in the values for (int x = 0; x < count; x++) { MFTRegisterTypeInfo rti = new MFTRegisterTypeInfo(); Marshal.PtrToStructure(new IntPtr(ip2.ToInt64() + (x * iSize)), rti); m_array.Add(rti); } } finally { // Free the array we got back Marshal.FreeCoTaskMem(ip2); } } } // Don't forget to assign the value m_int.Assign(count); m_int = null; m_array = null; } // This value isn't actually used return null; }
/// <summary> /// Enumerates Media Foundation transforms (MFTs) in the registry. /// </summary> /// <param name="transformCategory">Guid specifying the category of MFTs to enumerate.</param> /// <param name="flags">One or more members of the MFT_EnumFlag enumeration.</param> /// <param name="inputType">Indicate the input media type that the results must support. If null is passed, the input type is not use to filter the results.</param> /// <param name="outputType">Indicate the output media type that the results must support. If null is passed, the output type is not use to filter the results.</param> /// <param name="resultActivate">Receives an array of IMFActivate that match the parameters.</param> /// <returns>If this function succeeds, it returns the S_OK member. Otherwise, it returns another HResult's member that describe the error.</returns> public static HResult EnumEx(Guid transformCategory, MFT_EnumFlag flags, MFTRegisterTypeInfo inputType, MFTRegisterTypeInfo outputType, out IMFActivate[] resultActivate) { int resultCount; return(MFExtern.MFTEnumEx(transformCategory, flags, inputType, outputType, out resultActivate, out resultCount)); }
/// <summary> /// Enumerates Media Foundation transforms (MFTs) in the registry. /// </summary> /// <param name="transformCategory">Guid specifying the category of MFTs to enumerate.</param> /// <param name="inputType">Indicate the input media type that the results must support. If null is passed, the input type is not use to filter the results.</param> /// <param name="outputType">Indicate the output media type that the results must support. If null is passed, the output type is not use to filter the results.</param> /// <param name="attributes">Indicate attributes that the results must support.</param> /// <param name="resultCLSID">Receives an array of MFT CLSIDs that match the parameters.</param> /// <returns>If this function succeeds, it returns the S_OK member. Otherwise, it returns another HResult's member that describe the error.</returns> /// <remarks>The parameter <paramref name="attributes"/> is ingnored on Windows 7 or higher and should be null.</remarks> public static HResult Enum(Guid transformCategory, MFTRegisterTypeInfo inputType, MFTRegisterTypeInfo outputType, IMFAttributes attributes, out Guid[] resultCLSID) { int resultCount; return(MFExtern.MFTEnum(transformCategory, 0, inputType, outputType, attributes, out resultCLSID, out resultCount)); }