/// <summary> /// Enumerates available filters and returns a list of <see cref="CodecInfo"/>. /// </summary> /// <param name="filterCategory">GUID of filter category (<see cref="DirectShowLib.FilterCategory"/> members)></param> /// <returns></returns> public static List <CodecInfo> GetFiltersForCategory(Guid filterCategory) { List <CodecInfo> codecInfos = new List <CodecInfo>(); ICreateDevEnum devEnum = null; IEnumMoniker enumMoniker = null; try { devEnum = (ICreateDevEnum) new CreateDevEnum(); int catResult = devEnum.CreateClassEnumerator(filterCategory, out enumMoniker, CDef.None); if (catResult == 0) { IMoniker[] moniker = new IMoniker[1]; while (enumMoniker.Next(1, moniker, IntPtr.Zero) == 0) { string filterName = FilterGraphTools.GetFriendlyName(moniker[0]); Guid filterClassId = FilterGraphTools.GetCLSID(moniker[0]); CodecInfo codecInfo = new CodecInfo(filterName, filterClassId); codecInfos.Add(codecInfo); FilterGraphTools.TryRelease(ref moniker[0]); } } codecInfos.Sort(); return(codecInfos); } finally { FilterGraphTools.TryRelease(ref enumMoniker); FilterGraphTools.TryRelease(ref devEnum); } }
/// <summary> /// Gets a list of DirectShow filter names that accept the passed MediaType/MediaSubType and output the passed MediaType/MediaSubType. /// </summary> /// <param name="inputMediaAndSubTypes">Array of MediaType/MediaSubType</param> /// <param name="outputMediaAndSubTypes">Array of MediaType/MediaSubType</param> /// <param name="merit"></param> /// <returns>List of names</returns> public static List <CodecInfo> GetFilters(Guid[] inputMediaAndSubTypes, Guid[] outputMediaAndSubTypes, Merit merit) { List <CodecInfo> filters = new List <CodecInfo>(); IEnumMoniker enumMoniker = null; IMoniker[] moniker = new IMoniker[1]; IFilterMapper2 mapper = (IFilterMapper2) new FilterMapper2(); try { mapper.EnumMatchingFilters( out enumMoniker, 0, true, merit, true, inputMediaAndSubTypes.Length, inputMediaAndSubTypes, null, null, false, true, outputMediaAndSubTypes.Length, outputMediaAndSubTypes, null, null); do { try { enumMoniker.Next(1, moniker, IntPtr.Zero); } catch { } if ((moniker[0] == null)) { break; } string filterName = FilterGraphTools.GetFriendlyName(moniker[0]); Guid filterClassId = FilterGraphTools.GetCLSID(moniker[0]); CodecInfo codecInfo = new CodecInfo(filterName, filterClassId); filters.Add(codecInfo); FilterGraphTools.TryRelease(ref moniker[0]); } while (true); filters.Sort(); return(filters); } finally { FilterGraphTools.TryRelease(ref enumMoniker); FilterGraphTools.TryRelease(ref mapper); } }