Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

09.04.2011, 23:11

Problem mit Video Beispiel aus Kapitel 9

Hallo erstmal ?(

Ich habe ein Problem mit dem Beispiel zur Videodarstellung in Kapitel 9 (3. Auflage). Das Problem wurde auch schon mal ähnlich besprochen, aber ich konnte es mit dem Lösungsansatz nicht beheben. Alle anderen Beispiele laufen einwandfrei.

Es geht dabei um folgende Messagebox die nach beenden des Programms erscheint:

Debug Assertion Failed!
Program: ...\...\Videos.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
Line: 1322
Expression: _CrtIsValidHeapPointer(pUserData)
...

Ich habe das Programm getestet. Einmal unter Window XP mit Visual Studio 2008 Express. Dort läuft zumindest das Video erstmal richtig ab bevor die Meldung kommt. Unter Windows 7 mit Visual Studio 2010 Pro kommt die Meldung allerdings ohne das zuvor das Video abgespielt wird. Beides auf der gleichen Hardware.

Der Debugger unter Visual Studio 2010 meldet:
...
FEHLER: Der Aufruf von m_pD3DDevice->Present verursachte den DirectX-Fehler Unknown! Beschreibung: n/a (tbdirect3d.cpp, Zeile 370, Funktion tbDirect3D::Present)
FEHLER: Der Aufruf von m_pD3DDevice->Present verursachte den DirectX-Fehler E_FAIL! Beschreibung: An undetermined error occurred (tbdirect3d.cpp, Zeile 370, Funktion tbDirect3D::Present)
...

Der Quellcode wurde bisher nicht verändert. Ich habe noch nicht selber drin rumgebastelt, d.h. bis auf die bekannten Anpassungen um es unter Windows 7 mit Visual Studio 2010 compilieren zu können.

Hat jemand eine Ahnung was da nicht richtig funzt?

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

09.04.2011, 23:37

Evtl. musst du die TriBase-Engine und die BaseShowClasses neu kompilieren und dein Programm mit den neuen Libs linken, um die Kompatibilität zu neuen DirectX SDKs zu gewährleisten.

3

10.04.2011, 03:59

Das habe ich vorher schon alles gemacht, als Grundvoraussetzung, dass ich die Beispiele unter Windows 7 überhaupt compilieren und linken konnte.
Ich habe auch alle Systemkomponenten auf dem neuesten Stand. Also Windows 7 SP1, VS 2010 SP1, neuestes DXSDK (Stand 06.2010).
Die Videos lassen sich auch mit dem Media Player problemlos abspielen. Und wie gesagt, alle anderen Beispiele funktionieren. Auch Breakanoid unud Galactica.

4

10.04.2011, 08:18

Ich habe noch folgendes herausgefunden:
Wenn ich in der Startdialogbox als Gerätetyp: Referenz-Rasterizer wähle läuft das Video auch unter Windows 7 (langsam) ab. Auch wenn ich als Gerätetyp: Hardware wähle und einen Breakpoint auf besagte Present()-Funktion setze (z.B. in tribase.cpp Zeile 234: tbDirect3D::Instance().Present()) kann ich das Video mit F5 schrittweise laufen lassen. Das ändert aber alles nichts an der Messagebox nach Programmende. Die kommt immer noch.

Der Debugger faselte auch noch irgendwas mit "Beschädigung des Heaps oder Problem in einer geladenen dll". Aber keine genaueren Hinweise welche dll das sein könnte.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

5

10.04.2011, 13:01

Also das Video läuft und das Programm crasht beim Beenden? Kannst du die genaue Position (Funktion, die das Problem verursacht) im Quelltext herausfinden?

6

10.04.2011, 17:56

Ich konnte den Fehler etwas eingrenzen. Er tritt auf wenn im Modul "Videos.cpp" in Zeile 159 der Code:
if(g_pVideo->Init(acVideoFilename, TRUE))
ausgeführt wird. Also wenn die Init-Methode der tbVideo Instanz ausgeführt wird.
Das habe ich auch nochmal in der TriBase-Engine weiterverfolgt. Dort läuft alles sauber bis der VideoRenderer innerhalb der Init-Methode instanziert wird. D.h. im Modul tbVideo.cpp Zeile 435:

m_pRenderer = new tbVideoRenderer(NULL, &r);

Wenn der erzeugt wird, crashed es beim Verlassen des Programms.
Ich habe das durch ausklammern der Codezeilen ermittelt. Leider ist es etwas mühsam immer erst die Engine zu erzeugen, die Libs zu kopieren und dann wieder das Beispielprogramm zu übersetzen.
Vielleicht kommt jemand noch etwas schneller dahinter was da das Problem ist.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

10.04.2011, 19:11

Du hast einen Debugger, der dich direkt zur Fehlerstelle bringt. Das sollte eigentlich auch für die TriBase.dll gelten, wenn du die Debug-Variante nutzt.

Also tritt der Fehler im Konstruktor von tbVideoRenderer auf. Jetzt musst du noch herausfinden, wo genau.

8

10.04.2011, 19:38

Ich habe den Konstruktor schon untersucht. Die Klasse erbt von CBaseVideoRenderer. Ich vermute dass das Problem daher in der strmbase.lib und nicht in der tribase.lib liegt. Ich denke dass das DShowBaseClasses Projekt von der CD veraltet ist, zumindest für Windows 7. Mal sehen ob ich eine aktuellere Version irgendwoher bekomme.

9

11.04.2011, 14:17

Problem konnte ich z.T. lösen. Ich habe eine neue strmbased.lib erstellt mit Dateien aus dem Windows SDK zum BaseClasses Projekt. Dann die Tribase-Lib neu übersetzt.
Wenn ich nun den Code so ersetze (wurde hier auch schon mal besprochen)
g_pVideo = new tbVideo; -> g_pVideo = (tbVideo*)tbMemAlloc(sizeof(tbVideo));
crashed das Programm nach beenden nicht mehr. Allerdings habe ich immer noch das Problem, dass das Video unter Windows 7 nur über den Referenz-Rasterizer und nicht über
die Hardwarebeschleunigung läuft. Der Screen bleibt dann schwarz oder es wird nur ein Standbild geladen. Das Video fängt einfach nicht an abzuspielen ?(

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

10

11.04.2011, 14:27

Soviel ich weiß, gibt es mit den Video-Modul der TriBase-Engine sowieso einige Probleme (Videos ruckeln...). Vielleicht sind auch in Davids Code Fehler versteckt. Ich würde dir empfehlen, gerade als Übung, einen kleinen Videoplayer selbst zu schreiben. Im Internet findest du sicher einige Informationen.

Werbeanzeige