PSE-2012 / MMWTV

Objective Quality Assessment Toolkit
3 stars 2 forks source link

Circular dependency between Oqat.exe and OqatPublicResources.dll #31

Closed rtur closed 12 years ago

rtur commented 12 years ago

Eine ziehmlich häßliche Sache hat sich offenbart als ich die PublicResources ,wie geplant, in ein eigenes Projekt geschoben habe. Undzwar braucht Video (publicresources.model) einen verweis auf den PluginManager um den handler anzufordern umgekert braucht oqat eine publicresources dll. Hier wird das Problem beschrieben: http://msdn.microsoft.com/en-en/library/xxd1t65f%28v=vs.90%29.aspx. Um das Ding kompilierfähig zu lassen habe ich diegetVideoHandler implementierung innerhalb der Video class auskommentiert.

Wir haben 2 Möglichkeiten:

1) PublicRessources zurück in die Oqat.exe schieben. Problem: Dann ist die trennung der public und internal ressources die wir in die Architektur eingearbeitet haben sinnloss. 2) die VideoHandlerAbfrage weiter oben durchführen (z.B. im PluginManager) jetzt sieht die Abfrage so aus:

    PluginManager pm = PluginManager.pluginManager;

    string handlerPluginName = Path.GetExtension(this.vidPath).ToLower().TrimStart(new char[] { '.' }) + "VideoHandler";

    IVideoHandler handler = pm.getPlugin<IVideoHandler>(handlerPluginName);
    if (handler == null) return null;

    handler = handler.createVideoHandlerInstance();
    if (this.vidInfo != null)
    {
    handler.setVideo(this.vidPath, this.vidInfo);
    }

    return handler;

Alles was wir machen müssten ist die Abfrage nach dem Format im Video zu lassen

    string handlerPluginName = Path.GetExtension(this.vidPath).ToLower().TrimStart(new char[] { '.' }) + "VideoHandler";

Und denn Rest im PluginManager passieren zu lassen. D.h. bisjetzt: Aufrufer -> Video->Format-> PluginManager ->Handler ->Video ->Aufrufer neu wäre: Aufrufer-> Video -> Format -> Aufrufer -> PluginManager->Handler->Aufrufer

Also nicht viel verloren.

rtur commented 12 years ago

loadVideo (PPPlayer) braucht als einzigster Plugin einen Handler. Ich würde die loadVideo parameterliste (jetzt: (object sender, VideoEventArgs args)) zu (IVideoHandler vidhandler) abändern weil: 1 die parameterliste entstand zum Zeitpunkt als wir das loadVideo event direkt im player abfangen wollte (ohne Presentation) jetzt brauchen wir aber keinen sender (da es kein eventhandler mehr ist) 2 die videoEventargs wurden übergeben da mann über das darin enthaltene video an den handler rankommen konnte, wegen der circDep. können wir das aber nicht mehr so machen 3 player braucht eig. kein video sondern nur den handler daher reicht es wenn loadVideo einen handler bekommt

Wenn wir das so machen gibt es das Problem das PPDiagramm nicht die nötigen Daten bekommt (frameMetricValue ist im Video) .

D.h. das vorgehen wäre. Presentation zu splitten, in etwa so: IPresentation : IPlugin IPlayer : IPresentation IDiargramm : Ipresentation

noch ein Grund der für das splitten spricht, anders würde es nicht funktionieren (ist mir grad eingefallen) da der Pluginmanager nach dem typ des Plugins prüft (also die Metadaten) und aber keine passende Schnittstelle da ist (typ Player hat keine PlayerSchnittstelle usw.)

sleidig commented 12 years ago

Alternative, die ich sehe, um weniger aendern zu muessen: statt video kommt nur eine neu erstellte Schnittstelle IVideo in die API dll und die eigentliche video-klasse bleibt im kern oqat. alle plugins nutzen nicht mehr video sondern nur noch die öffentliche schnittstelle ivideo

rtur commented 12 years ago

Hier die Lösung für die "wir" (:D) uns entschieden haben.

Alles bleibt wie es war mit dem Unterschied, dass Video aus dem PublicPackage in den Kern zu schieben und im Public Package eine VideoSchnittstelle zu definieren.