From 6927b5c457d69ea263adc17be8793d051d0d912c Mon Sep 17 00:00:00 2001 From: Patrick Gniza Date: Mon, 18 May 2026 15:37:35 +0200 Subject: [PATCH] erster commit --- .vscode/tasks.json | 30 +++ GrabberConfig.ico | Bin 0 -> 80362 bytes GrabberConfig.py | 658 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 688 insertions(+) create mode 100644 .vscode/tasks.json create mode 100644 GrabberConfig.ico create mode 100644 GrabberConfig.py diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..bf378a9 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,30 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build Grabber Config", + "type": "shell", + "command": "${workspaceFolder}/.venv/Scripts/python.exe", + "args": [ + "-m", "nuitka", + "--standalone", + "--enable-plugin=multiprocessing", + "--enable-plugin=anti-bloat", + "--enable-plugin=tk-inter", + "--lto=no", + "--msvc=latest", + "--output-dir=build", + "--assume-yes-for-downloads", + "--windows-company-name=Patrick Gniza", + "--windows-product-name=Grabber Config", + "--windows-file-version=1.0.0", + "--windows-product-version=1.0.0", + "--windows-file-description=Grabber Config", + "--windows-icon-from-ico=GrabberConfig.ico", + "GrabberConfig.py" + ], + "group": "build", + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/GrabberConfig.ico b/GrabberConfig.ico new file mode 100644 index 0000000000000000000000000000000000000000..5216452356a45da52a7cece28cd80999dea933ba GIT binary patch literal 80362 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 o|K)=J?_2r*?AdtgJM{!;?yER&A= max_invalid: + break + continue + + bag = bag_unknown.QueryInterface(IPropertyBag) + name = bag.Read("FriendlyName", None) + + if name: + result.append({"name": name, "moniker": moniker}) + + except Exception: + invalid_count += 1 + if invalid_count >= max_invalid: + break + continue + + return result + + +def bind_filter(moniker): + return moniker.BindToObject(None, None, byref(IID_IBaseFilter)) + + +def get_filter_by_name(category_guid, target_name): + for item in list_filters(category_guid): + if item["name"] == target_name: + return bind_filter(item["moniker"]) + raise RuntimeError(f"Filter nicht gefunden: {target_name}") + + +def decode_video_standards(mask): + return [(value, name) for value, name in VIDEO_STANDARD_NAMES.items() if mask & value] + + +def get_decoder(video_filter): + return video_filter.QueryInterface(IAMAnalogVideoDecoder) + + +def get_crossbar(crossbar_filter): + return crossbar_filter.QueryInterface(IAMCrossbar) + + +def inspect_crossbar(crossbar): + output_count, input_count = crossbar.get_PinCounts() + inputs = [] + outputs = [] + + for i in range(input_count): + related, physical_type = crossbar.get_CrossbarPinInfo(1, i) + inputs.append({ + "index": i, + "related": related, + "physical_type": physical_type, + "name": PHYS_CONN_NAMES.get(physical_type, f"Unknown {physical_type}"), + }) + + for o in range(output_count): + related, physical_type = crossbar.get_CrossbarPinInfo(0, o) + outputs.append({ + "index": o, + "related": related, + "physical_type": physical_type, + "name": PHYS_CONN_NAMES.get(physical_type, f"Unknown {physical_type}"), + }) + + return inputs, outputs + + +def find_index_by_name(items, name): + for i, item in enumerate(items): + if item.get("name") == name: + return i + return -1 + + +class VideoGrabberGui(tk.Tk): + def __init__(self, config_path, force_config=False): + super().__init__() + + self.config_path = config_path + self.force_config = force_config + + self.video_devices = [] + self.crossbars = [] + self.standards = [] + self.inputs = [] + self.outputs = [] + + self.title("Video Grabber Konfiguration") + self.geometry("760x560") + self.minsize(700, 500) + + self._build_ui() + + self.after(200, self.startup) + + def _build_ui(self): + main = ttk.Frame(self, padding=12) + main.pack(fill="both", expand=True) + + main.columnconfigure(1, weight=1) + + ttk.Label(main, text="Videogerät").grid(row=0, column=0, sticky="w", pady=4) + self.video_combo = ttk.Combobox(main, state="readonly") + self.video_combo.grid(row=0, column=1, sticky="ew", pady=4) + self.video_combo.bind("<>", lambda e: self.on_video_selected()) + + ttk.Button(main, text="Aktualisieren", command=self.refresh_devices).grid(row=0, column=2, padx=(8, 0), pady=4) + + ttk.Label(main, text="Videostandard").grid(row=1, column=0, sticky="w", pady=4) + self.standard_combo = ttk.Combobox(main, state="readonly") + self.standard_combo.grid(row=1, column=1, sticky="ew", pady=4) + + ttk.Label(main, text="Crossbar").grid(row=2, column=0, sticky="w", pady=4) + self.crossbar_combo = ttk.Combobox(main, state="readonly") + self.crossbar_combo.grid(row=2, column=1, sticky="ew", pady=4) + self.crossbar_combo.bind("<>", lambda e: self.on_crossbar_selected()) + + ttk.Label(main, text="Eingang").grid(row=3, column=0, sticky="w", pady=4) + self.input_combo = ttk.Combobox(main, state="readonly") + self.input_combo.grid(row=3, column=1, sticky="ew", pady=4) + + ttk.Label(main, text="Ausgang").grid(row=4, column=0, sticky="w", pady=4) + self.output_combo = ttk.Combobox(main, state="readonly") + self.output_combo.grid(row=4, column=1, sticky="ew", pady=4) + + buttons = ttk.Frame(main) + buttons.grid(row=5, column=0, columnspan=3, sticky="ew", pady=(12, 8)) + + ttk.Button(buttons, text="Speichern", command=self.save_config).pack(side="left") + ttk.Button(buttons, text="Anwenden", command=self.apply_current_selection).pack(side="left", padx=8) + ttk.Button(buttons, text="Speichern + Anwenden", command=self.save_and_apply).pack(side="left") + ttk.Button(buttons, text="Beenden", command=self.destroy).pack(side="right") + + ttk.Label(main, text="Protokoll").grid(row=6, column=0, columnspan=3, sticky="w", pady=(12, 2)) + self.log_box = ScrolledText(main, height=16) + self.log_box.grid(row=7, column=0, columnspan=3, sticky="nsew") + main.rowconfigure(7, weight=1) + + def log(self, text): + self.log_box.insert("end", text + "\n") + self.log_box.see("end") + self.update_idletasks() + + def startup(self): + try: + self.refresh_devices() + + if os.path.exists(self.config_path): + self.load_config_into_ui() + if not self.force_config: + self.log("Konfiguration gefunden. Wende gespeicherte Einstellungen an.") + self.apply_config_file() + else: + self.log("Keine config.json gefunden. Bitte Einstellungen auswählen und speichern.") + except Exception as e: + messagebox.showerror("Fehler", str(e)) + self.log(f"Fehler: {e}") + + def refresh_devices(self): + self.log("Suche DirectShow-Videogeräte...") + self.video_devices = list_filters(CLSID_VideoInputDeviceCategory) + self.video_combo["values"] = [d["name"] for d in self.video_devices] + + self.crossbars = list_filters(CLSID_AM_KSCATEGORY_CROSSBAR) + self.crossbar_combo["values"] = [c["name"] for c in self.crossbars] + + self.log(f"Videogeräte: {len(self.video_devices)}") + self.log(f"Crossbars: {len(self.crossbars)}") + + if self.video_devices and self.video_combo.current() < 0: + self.video_combo.current(0) + self.on_video_selected() + + def on_video_selected(self): + idx = self.video_combo.current() + if idx < 0: + return + + device = self.video_devices[idx] + self.log(f"Öffne Videogerät: {device['name']}") + + try: + video_filter = bind_filter(device["moniker"]) + decoder = get_decoder(video_filter) + available_mask = decoder.get_AvailableTVFormats() + + self.standards = decode_video_standards(available_mask) + self.standard_combo["values"] = [f"{name} ({value})" for value, name in self.standards] + + default = next((i for i, (_, name) in enumerate(self.standards) if name == "PAL_B"), None) + if default is None: + default = next((i for i, (_, name) in enumerate(self.standards) if name.startswith("PAL")), 0) + + if self.standards: + self.standard_combo.current(default) + + self.log(f"Verfügbare Videostandards: {available_mask}") + + except Exception as e: + self.standards = [] + self.standard_combo["values"] = [] + self.log(f"Videostandards konnten nicht gelesen werden: {e}") + + self.select_likely_crossbar(device["name"]) + + def select_likely_crossbar(self, device_name): + if not self.crossbars: + return + + base_parts = [ + p.lower() + for p in device_name.replace("Video Capture", "").replace("Capture", "").split() + if len(p) > 2 + ] + + best_index = 0 + best_score = -1 + + for i, item in enumerate(self.crossbars): + name = item["name"].lower() + score = sum(1 for part in base_parts if part in name) + if score > best_score: + best_index = i + best_score = score + + self.crossbar_combo.current(best_index) + self.on_crossbar_selected() + + def on_crossbar_selected(self): + idx = self.crossbar_combo.current() + if idx < 0: + return + + item = self.crossbars[idx] + self.log(f"Öffne Crossbar: {item['name']}") + + try: + crossbar_filter = bind_filter(item["moniker"]) + crossbar = get_crossbar(crossbar_filter) + self.inputs, self.outputs = inspect_crossbar(crossbar) + + self.input_combo["values"] = [ + f"Input {i['index']}: {i['name']} ({i['physical_type']})" + for i in self.inputs + ] + self.output_combo["values"] = [ + f"Output {o['index']}: {o['name']} ({o['physical_type']})" + for o in self.outputs + ] + + input_default = next((i for i, item in enumerate(self.inputs) if item["physical_type"] == 3), 0) + output_default = next((i for i, item in enumerate(self.outputs) if item["physical_type"] == 12), 0) + + if self.inputs: + self.input_combo.current(input_default) + if self.outputs: + self.output_combo.current(output_default) + + except Exception as e: + self.inputs = [] + self.outputs = [] + self.input_combo["values"] = [] + self.output_combo["values"] = [] + self.log(f"Crossbar konnte nicht gelesen werden: {e}") + + def build_config_from_ui(self): + video_idx = self.video_combo.current() + standard_idx = self.standard_combo.current() + + if video_idx < 0: + raise RuntimeError("Kein Videogerät ausgewählt.") + if standard_idx < 0: + raise RuntimeError("Kein Videostandard ausgewählt.") + + device_name = self.video_devices[video_idx]["name"] + standard_value, standard_name = self.standards[standard_idx] + + cfg = { + "device_name": device_name, + "video_standard": { + "name": standard_name, + "value": standard_value, + }, + "crossbar_name": None, + "input": None, + "output": None, + } + + crossbar_idx = self.crossbar_combo.current() + input_idx = self.input_combo.current() + output_idx = self.output_combo.current() + + if crossbar_idx >= 0 and input_idx >= 0 and output_idx >= 0: + cfg["crossbar_name"] = self.crossbars[crossbar_idx]["name"] + cfg["input"] = self.inputs[input_idx] + cfg["output"] = self.outputs[output_idx] + + return cfg + + def save_config(self): + try: + cfg = self.build_config_from_ui() + ensure_config_dir() + with open(self.config_path, "w", encoding="utf-8") as f: + json.dump(cfg, f, indent=4, ensure_ascii=False) + self.log(f"Konfiguration gespeichert: {self.config_path}") + messagebox.showinfo("Gespeichert", f"Konfiguration gespeichert:\n{self.config_path}") + except Exception as e: + messagebox.showerror("Fehler", str(e)) + self.log(f"Fehler beim Speichern: {e}") + + def save_and_apply(self): + self.save_config() + self.apply_config_file() + + def apply_current_selection(self): + try: + cfg = self.build_config_from_ui() + self.apply_config(cfg) + except Exception as e: + messagebox.showerror("Fehler", str(e)) + self.log(f"Fehler beim Anwenden: {e}") + + def apply_config_file(self): + with open(self.config_path, "r", encoding="utf-8") as f: + cfg = json.load(f) + self.apply_config(cfg) + + def apply_config(self, cfg): + device_name = cfg["device_name"] + standard_name = cfg["video_standard"]["name"] + standard_value = int(cfg["video_standard"]["value"]) + + self.log(f"Öffne Videogerät: {device_name}") + video_filter = get_filter_by_name(CLSID_VideoInputDeviceCategory, device_name) + decoder = get_decoder(video_filter) + + try: + before = decoder.get_TVFormat() + self.log(f"Vorheriger Videostandard: {before}") + except Exception: + pass + + decoder.put_TVFormat(standard_value) + self.log(f"Videostandard gesetzt: {standard_name} ({standard_value})") + + try: + after = decoder.get_TVFormat() + self.log(f"Aktueller Videostandard: {after}") + except Exception: + pass + + crossbar_name = cfg.get("crossbar_name") + input_cfg = cfg.get("input") + output_cfg = cfg.get("output") + + if not crossbar_name or not input_cfg or not output_cfg: + self.log("Keine Crossbar-/Eingangskonfiguration vorhanden.") + return + + self.log(f"Öffne Crossbar: {crossbar_name}") + crossbar_filter = get_filter_by_name(CLSID_AM_KSCATEGORY_CROSSBAR, crossbar_name) + crossbar = get_crossbar(crossbar_filter) + + output_index = int(output_cfg["index"]) + input_index = int(input_cfg["index"]) + + crossbar.CanRoute(output_index, input_index) + crossbar.Route(output_index, input_index) + + self.log(f"Eingang gesetzt: Output {output_index} -> Input {input_index} ({input_cfg.get('name', 'unbekannt')})") + + def load_config_into_ui(self): + try: + with open(self.config_path, "r", encoding="utf-8") as f: + cfg = json.load(f) + + device_idx = find_index_by_name(self.video_devices, cfg.get("device_name")) + if device_idx >= 0: + self.video_combo.current(device_idx) + self.on_video_selected() + + standard_cfg = cfg.get("video_standard", {}) + standard_value = int(standard_cfg.get("value", -1)) + for i, (value, _) in enumerate(self.standards): + if value == standard_value: + self.standard_combo.current(i) + break + + crossbar_idx = find_index_by_name(self.crossbars, cfg.get("crossbar_name")) + if crossbar_idx >= 0: + self.crossbar_combo.current(crossbar_idx) + self.on_crossbar_selected() + + input_cfg = cfg.get("input") or {} + output_cfg = cfg.get("output") or {} + + for i, item in enumerate(self.inputs): + if item["index"] == input_cfg.get("index"): + self.input_combo.current(i) + break + + for i, item in enumerate(self.outputs): + if item["index"] == output_cfg.get("index"): + self.output_combo.current(i) + break + + self.log("Gespeicherte Konfiguration geladen.") + + except Exception as e: + self.log(f"Konfiguration konnte nicht geladen werden: {e}") + + +def apply_config_headless(config_path): + with open(config_path, "r", encoding="utf-8") as f: + cfg = json.load(f) + + device_name = cfg["device_name"] + standard_name = cfg["video_standard"]["name"] + standard_value = int(cfg["video_standard"]["value"]) + + print(f"Öffne Videogerät: {device_name}") + video_filter = get_filter_by_name(CLSID_VideoInputDeviceCategory, device_name) + decoder = get_decoder(video_filter) + + try: + before = decoder.get_TVFormat() + print(f"Vorheriger Videostandard: {before}") + except Exception: + pass + + decoder.put_TVFormat(standard_value) + print(f"Videostandard gesetzt: {standard_name} ({standard_value})") + + try: + after = decoder.get_TVFormat() + print(f"Aktueller Videostandard: {after}") + except Exception: + pass + + crossbar_name = cfg.get("crossbar_name") + input_cfg = cfg.get("input") + output_cfg = cfg.get("output") + + if not crossbar_name or not input_cfg or not output_cfg: + print("Keine Crossbar-/Eingangskonfiguration vorhanden.") + return + + print(f"Öffne Crossbar: {crossbar_name}") + crossbar_filter = get_filter_by_name(CLSID_AM_KSCATEGORY_CROSSBAR, crossbar_name) + crossbar = get_crossbar(crossbar_filter) + + output_index = int(output_cfg["index"]) + input_index = int(input_cfg["index"]) + + crossbar.CanRoute(output_index, input_index) + crossbar.Route(output_index, input_index) + + print(f"Eingang gesetzt: Output {output_index} -> Input {input_index} ({input_cfg.get('name', 'unbekannt')})") + + +def main(): + parser = argparse.ArgumentParser(description="GUI für DirectShow Video Grabber Konfiguration") + parser.add_argument("mode", nargs="?", default="", help="/config öffnet die Konfigurationsoberfläche") + parser.add_argument("--config-file", default=CONFIG_FILE, help="Pfad zur config.json") + args = parser.parse_args() + + force_config = args.mode.lower() in ("/config", "config", "--config") + ensure_config_dir() + config_exists = os.path.exists(args.config_file) + + # Normalstart: + # - config.json vorhanden und kein /config: nur anwenden und beenden + # - keine config.json oder /config: GUI öffnen + if config_exists and not force_config: + try: + apply_config_headless(args.config_file) + return + except Exception as e: + print(f"Fehler beim Anwenden der Konfiguration: {e}") + print("Starte Konfigurationsoberfläche.") + app = VideoGrabberGui(args.config_file, force_config=True) + app.mainloop() + return + + app = VideoGrabberGui(args.config_file, force_config=True) + app.mainloop() + + +if __name__ == "__main__": + main()