private SourceReader CreateSourceReader(Activate activate) { SourceReader reader = null; using (var source = activate.ActivateObject <MediaSource>()) { using (var mediaAttributes = new MediaAttributes()) { if (asyncMode) { sourceReaderCallback = new SourceReaderCallback(); sourceReaderCallback.OnReadSample += SourceReaderCallback_OnReadSample; sourceReaderCallback.OnFlush += SourceReaderCallback_OnFlush; //sourceReaderCallback.OnEvent += SourceReaderCallback_OnEvent; var pUnk = Marshal.GetIUnknownForObject(sourceReaderCallback); try { using (var comObj = new SharpDX.ComObject(pUnk)) { mediaAttributes.Set(SourceReaderAttributeKeys.AsyncCallback, comObj); } } finally { if (pUnk != IntPtr.Zero) { Marshal.Release(pUnk); } } } //mediaAttributes.Set(SourceReaderAttributeKeys.EnableVideoProcessing, 1); /* //Не все камеры поддерживают! * mediaAttributes.Set(SinkWriterAttributeKeys.LowLatency, true); * * mediaAttributes.Set(SourceReaderAttributeKeys.EnableAdvancedVideoProcessing, true); * mediaAttributes.Set(SinkWriterAttributeKeys.ReadwriteDisableConverters, 0); * * mediaAttributes.Set(SinkWriterAttributeKeys.ReadwriteEnableHardwareTransforms, 1); * using (var devMan = new DXGIDeviceManager()) * { * devMan.ResetDevice(device); * mediaAttributes.Set(SourceReaderAttributeKeys.D3DManager, devMan); * } */ reader = new SourceReader(source, mediaAttributes); } } return(reader); }
private H264Encoder(Activate activate) { Activate = activate; FriendlyName = activate.Get(TransformAttributeKeys.MftFriendlyNameAttribute); Clsid = activate.Get(TransformAttributeKeys.MftTransformClsidAttribute); Flags = (TransformEnumFlag)activate.Get(TransformAttributeKeys.TransformFlagsAttribute); var list = new List <string>(); var inputTypes = activate.Get(TransformAttributeKeys.MftInputTypesAttributes); for (int j = 0; j < inputTypes.Length; j += 32) // two guids { var majorType = new Guid(Enumerable.Range(0, 16).Select(index => Marshal.ReadByte(inputTypes, j + index)).ToArray()); // Should be video in this context var subType = new Guid(Enumerable.Range(0, 16).Select(index => Marshal.ReadByte(inputTypes, j + 16 + index)).ToArray()); list.Add(GetFourCC(subType)); } list.Sort(); InputTypes = list; try { using (var tf = activate.ActivateObject <Transform>()) { IsBuiltin = IsBuiltinEncoder(tf); IsDirect3D11Aware = IsDirect3D11AwareEncoder(tf); IsHardwareBased = IsHardwareBasedEncoder(tf); } } catch { // do nothing } using (var key = Registry.ClassesRoot.OpenSubKey(Path.Combine("CLSID", Clsid.ToString("B"), "InprocServer32"))) { if (key != null) { DllPath = key.GetValue(null) as string; } } }
private Transform FindEncoder(int adapterVenId) { logger.Debug("FindEncoder(...) " + adapterVenId); Transform preferTransform = null; var transformFlags = TransformEnumFlag.All | // TransformEnumFlag.All | TransformEnumFlag.SortAndFilter; var outputType = new TRegisterTypeInformation { GuidMajorType = MediaTypeGuids.Video, GuidSubtype = VideoFormatGuids.H264 // GuidSubtype = VideoFormatGuids.Hevc }; //int vendorId = 0; //using (var dxgiDevice = device.QueryInterface<SharpDX.DXGI.Device>()) //{ // var adapter = dxgiDevice.Adapter; // vendorId = adapter.Description.VendorId; //} var activates = MediaFactory.FindTransform(TransformCategoryGuids.VideoEncoder, transformFlags, null, outputType); try { Activate preferActivate = null; foreach (var activate in activates) { var actLog = MfTool.LogMediaAttributes(activate); logger.Debug("\r\nActivator:\r\n-----------------\r\n" + actLog); string name = activate.Get(TransformAttributeKeys.MftFriendlyNameAttribute); Guid clsid = activate.Get(TransformAttributeKeys.MftTransformClsidAttribute); TransformEnumFlag flags = (TransformEnumFlag)activate.Get(TransformAttributeKeys.TransformFlagsAttribute); bool isAsync = !(flags.HasFlag(TransformEnumFlag.Syncmft)); isAsync |= (flags.HasFlag(TransformEnumFlag.Asyncmft)); bool isHardware = flags.HasFlag(TransformEnumFlag.Hardware); if (isHardware) { string venIdStr = activate.Get(TransformAttributeKeys.MftEnumHardwareVendorIdAttribute); if (MfTool.TryGetVendorId(venIdStr, out int activatorVendId)) { if (activatorVendId == adapterVenId) { preferActivate = activate; syncMode = false; } } } else { //TODO:... } //var _flags = Enum.GetValues(typeof(TransformEnumFlag)) // .Cast<TransformEnumFlag>() // .Where(m => (m != TransformEnumFlag.None && flags.HasFlag(m))); //var transformInfo = name + " " + clsid.ToString() + " " + string.Join("|", _flags); //logger.Info(transformInfo); //logger.Debug(MfTool.LogMediaAttributes(activator)); //var HardwareUrl = activator.Get(TransformAttributeKeys.MftEnumHardwareUrlAttribute); //logger.Info(HardwareUrl); //var TransformAsync = activator.Get(TransformAttributeKeys.TransformAsync); //logger.Info(TransformAsync); //logger.Info("-------------------------------------"); } // preferEncoder = transformActivators[0].ActivateObject<Transform>(); if (preferActivate != null) { preferTransform = preferActivate.ActivateObject <Transform>(); } } finally { foreach (var activator in activates) { activator.Dispose(); } } return(preferTransform); }
public Transform GetTransform() => Activate.ActivateObject <Transform>();