static internal VideoCapabilities[] FromStreamConfig(IAMStreamConfig videoStreamConfig) { if (videoStreamConfig == null) { throw new ArgumentNullException("videoStreamConfig"); } int count, size; int hr = videoStreamConfig.GetNumberOfCapabilities(out count, out size); if (hr != 0) { Marshal.ThrowExceptionForHR(hr); } if (count <= 0) { throw new NotSupportedException("This video device does not report capabilities."); } if (size > Marshal.SizeOf(typeof(VideoStreamConfigCaps))) { throw new NotSupportedException("Unable to retrieve video device capabilities. This video device requires a larger VideoStreamConfigCaps structure."); } Dictionary <uint, VideoCapabilities> videocapsList = new Dictionary <uint, VideoCapabilities>( ); for (int i = 0; i < count; i++) { try { VideoCapabilities vc = new VideoCapabilities(videoStreamConfig, i); uint key = (((uint)vc.FrameSize.Height) << 32) | (((uint)vc.FrameSize.Width) << 16); if (!videocapsList.ContainsKey(key)) { videocapsList.Add(key, vc); } else { if (vc.BitCount > videocapsList[key].BitCount) { videocapsList[key] = vc; } } } catch { } } VideoCapabilities[] videocaps = new VideoCapabilities[videocapsList.Count]; videocapsList.Values.CopyTo(videocaps, 0); return(videocaps); }
public bool Equals(VideoCapabilities vc2) { if ((object)vc2 == null) { return(false); } return((FrameSize == vc2.FrameSize) && (BitCount == vc2.BitCount)); }
private void GetPinCapabilitiesAndConfigureSizeAndRate(ICaptureGraphBuilder2 graphBuilder, IBaseFilter baseFilter, Guid pinCategory, VideoCapabilities resolutionToSet, ref VideoCapabilities[] capabilities) { object streamConfigObject; graphBuilder.FindInterface(pinCategory, MediaType.Video, baseFilter, typeof(IAMStreamConfig).GUID, out streamConfigObject); if (streamConfigObject != null) { IAMStreamConfig streamConfig = null; try { streamConfig = (IAMStreamConfig)streamConfigObject; } catch (InvalidCastException) { } if (streamConfig != null) { if (capabilities == null) { try { capabilities = MotionDetector.Video.DirectShow.VideoCapabilities.FromStreamConfig(streamConfig); } catch { } } if (resolutionToSet != null) { SetResolution(streamConfig, resolutionToSet); } } } if (capabilities == null) { capabilities = new VideoCapabilities[0]; } }
private void SetResolution(IAMStreamConfig streamConfig, VideoCapabilities resolution) { if (resolution == null) { return; } int capabilitiesCount = 0, capabilitySize = 0; AMMediaType newMediaType = null; VideoStreamConfigCaps caps = new VideoStreamConfigCaps( ); streamConfig.GetNumberOfCapabilities(out capabilitiesCount, out capabilitySize); for (int i = 0; i < capabilitiesCount; i++) { try { VideoCapabilities vc = new VideoCapabilities(streamConfig, i); if (resolution == vc) { if (streamConfig.GetStreamCaps(i, out newMediaType, caps) == 0) { break; } } } catch { } } if (newMediaType != null) { streamConfig.SetFormat(newMediaType); newMediaType.Dispose( ); } }