Graph in der ROT registrieren - wie?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
normen
Beiträge: 18
Registriert: 03.03.2005 17:47
Wohnort: Oakland, Kalifornien

Graph in der ROT registrieren - wie?

Beitrag von normen »

Gibt es in PureBasic einen einfachen Weg, einen Directshow Graph in der Running Objects Table zu registrieren, oder den Graph in eine .grf Datei zu schreiben, so dass man mittels GraphEdit debuggen kann?
Ich habe auf der Microsoft website einige C++ Funktionen dafuer gefunden, kenne mich aber leider weder mit C++ noch mit PureBasic gut genug aus, um diese Funktionen anpassen und nutzen zu koennen.
Ich hoffe, dass schonmal jemand was damit gemacht hat.
Im Voraus vielen Dank!!!
The manual said 'Windows XP or better' ... so I used Linux.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Öhm :?

Ich hab zwar nicht ganz verstanden, was du da machen willst, aber es hört sich so kompliziert an, dass du es als PB-Anfänger da wohl kaum was tun kannst.

Überleg mal, ob es Alternativen zu der Vorgehensweise gibt, die du beschrieben hast. Eventuell vielleicht bringt das die Lösung näher.


Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
normen
Beiträge: 18
Registriert: 03.03.2005 17:47
Wohnort: Oakland, Kalifornien

Beitrag von normen »

Die einzige Alternative, die mir bisher eingefallen ist, ist raten. Meine Erfahrung zeigt mir jedoch, dass diese Methode nicht immer sehr zuverlaessig ist.
Der Grund warum ich das machen will ist, herauszufinden, welche DirectShow Filter tatsaechlich verwendet werden und wie diese miteinander verbunden sind. Gerade wenn man verschiedene Renderer verwendet (Overlay, VMR7, VMR9, windowed, windowless, ...) dann ist es wichtig zu wissen, ob auch tatsaechlich der gewuenschte Renderer verwendet wird.
Noch wichtiger wird das ganze wenn man Capture Devices mittels WDM Filter verwendet. Ich kann mir vorstellen, dass es ohne eine Debugmoeglichkeit mit GraphEdit zu einem Alptraum werden kann, einen Fehler zu finden.
The manual said 'Windows XP or better' ... so I used Linux.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Der Grund warum ich das machen will ist, herauszufinden, welche DirectShow Filter tatsaechlich verwendet werden und wie diese miteinander verbunden sind.
Da braucht man wohl Kenntnisse in DirectX, die hier im Board die Meisten sicher nicht haben (sonst hätten die schon was gepostet).

Du hattest gepostet, dass es C++ Codes für dein Anliegen gibt. Vielleicht kann man sie nach PB portieren. Poste sie doch bitte hier.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
normen
Beiträge: 18
Registriert: 03.03.2005 17:47
Wohnort: Oakland, Kalifornien

Beitrag von normen »

Hast ja Recht, ich haette diese Funktionen schon lange mal hier posten koennen.
Hier sind mal zwei Links.

Graphen in der ROT registrien:
http://msdn.microsoft.com/library/en-us ... frame=true

Graphen in eine .grf Datei schreiben:
http://msdn.microsoft.com/library/en-us ... frame=true

Wie gesagt, ich habe keine Ahnung, wie ich diese Funktionen nach PB uebersetzen koennte. Vielleicht kann das ja jemand anders.
The manual said 'Windows XP or better' ... so I used Linux.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Uff, ich kann zwar ein wenig C, aber das ist mir zu hoch.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

normen hat geschrieben:Graphen in der ROT registrien:
http://msdn.microsoft.com/library/en-us ... frame=true

Graphen in eine .grf Datei schreiben:
http://msdn.microsoft.com/library/en-us ... frame=true

Wie gesagt, ich habe keine Ahnung, wie ich diese Funktionen nach PB uebersetzen koennte. Vielleicht kann das ja jemand anders.
Sieht auf den ersten Blick wirklich nicht allzu kompliziert aus.

Wie wär's wenn Du einfach mal anfängst, das ganze zu übersetzen (Bitte aus
den SDK-Examples, nicht von der MSDN-Seite). Sobald Du auf Probleme stösst,
können diese sicherlich im Forum "gemeinsam erarbeitet" werden.

Du hast ja bereits einen Code in der Hand, der quasi 1:1 aus dem SDK übersetzt
wurde - mit ein wenig Transferleistung und meinetwegen google sollte dies
IMHO auch für jemanden, der C/C++ nicht fliessend spricht, zu bewerkstelligen
sein.

Viele hier, einschließlich mir, sind sicherlich gerne bereit Dir dabei zu helfen.
Persönlich weigere ich mich aber, Dir einfach den kompletten Code zu übersetzen ;)
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

Weil Du immer so lieb danke sagst :), habe ich Dir - entgegen meinen Grundsätzen -
mal eben die Funktion AddToRot() übersetzt. Ist wirklich nichts schlimmes.

Das sollte Dich zumindest (so hoffe ich) auf den richtigen Weg bringen:

Code: Alles auswählen

#ROTFLAGS_REGISTRATIONKEEPSALIVE = $01

Structure WCHAR
  c.w[#MAX_PATH]
EndStructure

Procedure.l AddToRot(*pUnkGraph.IUnknown, *pdwRegister.l)
  *pMoniker.IMoniker
  *pROT.IRunningObjectTable

  If GetRunningObjectTable_(0, @*pROT) <> 0
    ProcedureReturn #E_FAIL
  EndIf

  sz.s = "FilterGraph "+LCase(RSet(Hex(*pUnkGraph), 8, "0"))+" pid "+LCase(RSet(Hex(GetCurrentProcessId_()), 8, "0"))
  MultiByteToWideChar_(#CP_ACP, 0, sz, -1, @wsz.WCHAR, Len(sz))

  MultiByteToWideChar_(#CP_ACP, 0, "!", -1, @wsz2.WCHAR, 1)
  hr.l = CreateItemMoniker_(wsz2, wsz, @*pMoniker)

  If hr = 0
    hr = *pROT\Register(#ROTFLAGS_REGISTRATIONKEEPSALIVE, *pUnkGraph, *pMoniker, *pdwRegister)
    *pMoniker\Release()
  EndIf

  *pROT\Release()
  ProcedureReturn hr
EndProcedure
Ich hab's mal ausprobiert - funktioniert sogar ;)
(graphedit.exe -> File / Connect to Remote Graph)

Bzgl. der etwas hakelig aussehenden WideChar-Konstrukte bin ich für Vorschläge offen.
Makros wären cool... :)

Achso: Wg. des LCase() bin ich mir nicht sicher, ob das tatsächlich benötigt wird,
der Original-Code generiert aber auch kleine Buchstaben (%08x / %08X)

Man hätte natürlich auch direkt wsprintfW() (user32.dll) benutzen können,
ich fand's so aber einfach anschaulicher.


So... ich hoffe, das hilft!
normen
Beiträge: 18
Registriert: 03.03.2005 17:47
Wohnort: Oakland, Kalifornien

Beitrag von normen »

traumatc,

Ich weiss gar nicht, wie ich das alles wieder gut machen kann. (Mal wieder) Vielen, vielen Dank.
Aber von nun an moechte ich, dass Du zu Deinen Grundsaetzen stehst.
Wie wär's wenn Du einfach mal anfängst, das ganze zu übersetzen (Bitte aus
den SDK-Examples, nicht von der MSDN-Seite). Sobald Du auf Probleme stösst,
können diese sicherlich im Forum "gemeinsam erarbeitet" werden.
...
Viele hier, einschließlich mir, sind sicherlich gerne bereit Dir dabei zu helfen.
Persönlich weigere ich mich aber, Dir einfach den kompletten Code zu übersetzen
Damit hast Du voellig Recht. Asche auf mein Haupt. :?
The manual said 'Windows XP or better' ... so I used Linux.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

EDIT: DOUBLE TRIPLE WHATEVER POST :(
Zuletzt geändert von traumatic am 15.03.2005 00:12, insgesamt 1-mal geändert.
Antworten