/// <summary> /// ピンリストの指標が変化したとき /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void comboPin_SelectedIndexChanged(object sender, EventArgs e) { try { FormatInfos = null; comboFormat.Items.Clear(); IPin pin = null; try { var index = comboPin.SelectedIndex; pin = Axi.FindPin(this.Filter, index, PIN_DIRECTION.PINDIR_OUTPUT); // フォーマットの列挙. var formatInfos = Axi.GetFormatList(pin); // 映像の情報のみ抽出します. this.FormatInfos = formatInfos.FindAll( delegate(CxFormatInfo item) { return(GUID.Compare(item.FormatType, GUID.FORMAT_VideoInfo)); }); foreach (var item in this.FormatInfos) { var caption = string.Format("{0} x {1}", item.VideoSize.Width, item.VideoSize.Height); comboFormat.Items.Add(caption); } if (comboFormat.Items.Count > 0) { comboFormat.SelectedIndex = 0; } } finally { if (pin != null) { Marshal.ReleaseComObject(pin); } pin = null; } } catch (System.Exception ex) { MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
/// <summary> /// フィルタ情報の初期化 /// </summary> void InitializeFilterPairs() { // [1] フィルタとピンのペア. List <FilterPair> filter_pairs = FilterPairs; // カテゴリ: GUID.CLSID_VideoInputDeviceCategory string category = GUID.CLSID_VideoInputDeviceCategory; // フィルタの一覧を取得する. List <CxDSFilterInfo> filters = Axi.GetFilterList(category); foreach (var filter in filters) { IBaseFilter capture = null; try { #region フィルタを生成する. capture = Axi.CreateFilter(category, filter.Name, filter.Index); #endregion #region ピンの一覧を取得する. List <CxDSPinInfo> pins = new List <CxDSPinInfo>(); { List <CxDSPinInfo> items = Axi.GetPinList(capture); // 出力ピンのみ抽出する. foreach (var item in items) { if (item.Direction == PIN_DIRECTION.PINDIR_OUTPUT) { pins.Add(item); } } } #endregion #region フォーマットの一覧を取得する. try { // [2] ピンとフォーマットのペア. List <PinPair> pin_pairs = new List <PinPair>(); for (int i = 0; i < pins.Count; i++) { CxDSPinInfo pin = pins[i]; // 出力ピンを探す. IPin outpin = Axi.FindPin(capture, i, PIN_DIRECTION.PINDIR_OUTPUT); // フォーマットの色空間グループ分け. Dictionary <string, List <CxDSFormatInfo> > groups = new Dictionary <string, List <CxDSFormatInfo> >(); // フォーマットの一覧を取得する. List <CxDSFormatInfo> formats = Axi.GetFormatList(outpin); foreach (var format in formats) { if (GUID.Compare(format.FormatType, GUID.FORMAT_VideoInfo) == false) { continue; } List <CxDSFormatInfo> groups_value = null; if (groups.TryGetValue(format.MediaSubType, out groups_value) == false) { groups_value = new List <CxDSFormatInfo>(); groups[format.MediaSubType] = (groups_value); } groups_value.Add(format); } // [3] 色空間とフォーマットのペア. List <FormatPair> format_pairs = new List <FormatPair>(); // フォーマットを色空間グループ毎に列挙する. foreach (var group in groups) { // 色空間のニックネーム. string nickname = GUID.GetNickname(group.Key); // Key=MediaSubType if (string.IsNullOrEmpty(nickname)) { nickname = "(unknown)"; } // [3] 色空間とフォーマットのペア. format_pairs.Add(new FormatPair(nickname, group.Value)); } // [2] ピンとフォーマットのペア. pin_pairs.Add(new PinPair(pin, format_pairs)); } // [1] フィルタとピンのペア. filter_pairs.Add(new FilterPair(filter, pin_pairs)); } catch (System.Exception ex) { Debug.WriteLine(ex.StackTrace); } finally { Axi.ReleaseInstance(capture); } #endregion } catch (System.Exception ex) { Debug.WriteLine(ex.StackTrace); } finally { #region フィルタを解放する. Axi.ReleaseInstance(capture); #endregion } } int index = -1; // コンボボックスへの追加. comboFilter.Items.Clear(); for (int i = 0; i < filter_pairs.Count; i++) { var filter_pair = filter_pairs[i]; comboFilter.Items.Add(filter_pair.Key.Name); if (filter_pair.Key.ContentEquals(this.Backup.FilterInfo)) { index = i; } } if (0 <= index && index < comboFilter.Items.Count) { comboFilter.SelectedIndex = index; } }