// Retrieve capabilities of a video device static internal VideoCapabilities[] FromStreamConfig(IAMStreamConfig videoStreamConfig) { if (videoStreamConfig == null) { throw new ArgumentNullException("videoStreamConfig"); } // ensure this device reports capabilities 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."); } // group capabilities with similar parameters 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); }
// Ok button clicked private void okButton_Click(object sender, EventArgs e) { videoDeviceMoniker = videoDevice.Source; // set video size if (videoCapabilitiesDictionary.Count != 0) { VideoCapabilities caps = videoCapabilitiesDictionary[(string)videoResolutionsCombo.SelectedItem]; videoDevice.VideoResolution = caps; captureSize = caps.FrameSize; } if (configureSnapshots) { // set snapshots size if (snapshotCapabilitiesDictionary.Count != 0) { VideoCapabilities caps = snapshotCapabilitiesDictionary[(string)snapshotResolutionsCombo.SelectedItem]; videoDevice.ProvideSnapshots = true; videoDevice.SnapshotResolution = caps; snapshotSize = caps.FrameSize; } } if (availableVideoInputs.Length != 0) { videoInput = availableVideoInputs[videoInputsCombo.SelectedIndex]; videoDevice.CrossbarVideoInput = videoInput; } }
/// <summary> /// Check if two video capabilities are equal. /// </summary> /// /// <param name="vc2">Second video capability to compare with.</param> /// /// <returns>Returns true if both video capabilities are equal or false otherwise.</returns> /// public bool Equals(VideoCapabilities vc2) { if ((object)vc2 == null) { return(false); } return((FrameSize == vc2.FrameSize) && (BitCount == vc2.BitCount)); }
// Retrieve capabilities of a video device static internal VideoCapabilities[] FromStreamConfig( IAMStreamConfig videoStreamConfig ) { if ( videoStreamConfig == null ) throw new ArgumentNullException( "videoStreamConfig" ); // ensure this device reports capabilities 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." ); // group capabilities with similar parameters 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; }
/// <summary> /// Check if two video capabilities are equal. /// </summary> /// /// <param name="vc2">Second video capability to compare with.</param> /// /// <returns>Returns true if both video capabilities are equal or false otherwise.</returns> /// public bool Equals( VideoCapabilities vc2 ) { if ( (object) vc2 == null ) { return false; } return ( ( FrameSize == vc2.FrameSize ) && ( BitCount == vc2.BitCount ) ); }
// Configure specified pin and collect its capabilities if required 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 { // get all video capabilities capabilities = BestCS.Video.DirectShow.VideoCapabilities.FromStreamConfig( streamConfig ); } catch { } } // check if it is required to change capture settings if ( resolutionToSet != null ) { SetResolution( streamConfig, resolutionToSet ); } } } // if failed resolving capabilities, then just create empty capabilities array, // so we don't try again if ( capabilities == null ) { capabilities = new VideoCapabilities[0]; } }
// Set resolution for the specified stream configuration private void SetResolution( IAMStreamConfig streamConfig, VideoCapabilities resolution ) { if ( resolution == null ) { return; } // iterate through device's capabilities to find mediaType for desired resolution 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 { } } // set the new format if ( newMediaType != null ) { streamConfig.SetFormat( newMediaType ); newMediaType.Dispose( ); } }