Für alle die es noch interessiert und die Probleme unter Windows 7 haben, hier ein Lösungsansatz:
Man nimmt aus dem Windows SDK die Module dshowplayer.cpp und video.cpp und die zugeh. Header aus dem Verzeichnis
../Samples/multimedia/directshow/players/dshowplayer
(Das ist ein einfacher Videoplayer der problemlos compiliert und gestartet werden kann).
Diese beiden Module bindet man in das Videobeispiel aus Kap. 9 mit ein und entfernt den ganzen tbVideo-Code. Dann erzeugt man eine Instanz des neuen Players:
DShowPlayer* pPlay; //als globale Var.
... (ab hier alles in WinMain)...
hWnd=tbDirect3D::Instance().GetWindow();
pPlay = new DShowPlayer(hWnd); //hWnd ist Windowhandle von D3D-Instanz
...
hr = pPlay->OpenFile(acVideoFilename); //übergeben des Filenamens, z.B. aus Openfile-Dialog
RECT rcWindow;
GetClientRect(hWnd, &rcWindow);
pPlay->UpdateVideoWindow(&rcWindow); //zuweisen des Windows
...
pPlay->Play(); //Player einfach starten
Zum Schluss nicht vergessen in CleanUp():
SAFE_DELETE(pPlay); //beim Beenden den Player wieder löschen
Da in der Tribase-Engine allerdings in der Messageloop die Present() Methode für die ganze 3D Umgebung ständig automatisch aufgerufen wird, muss man diesen Vorgang schaltbar machen. Ich habe nämlich festgestellt, dass beim abschalten von tbDirect3D::Instance().Present() in der Messageloop, das Video problemlos abspielbar war. Den Code in MoveProc und RenderProc braucht man dann ebenfalls nur von diesem Schalter abhängig machen, falls man danach noch 3D Ausgaben machen möchte. D.h. wenn das Video zuende ist, schaltet man eben wieder auf 3D Rendering um. Das ganze ist also ziemlich simpel und man hat dafür eine gute und flüssige Videoausgabe (...habe noch keine Ruckeleffekte festgestellt).