Mercurial > mm7
annotate VideoPlayer.cpp @ 2445:b10125a9c772
fix crash in keyboard option
author | Ritor1 |
---|---|
date | Thu, 24 Jul 2014 12:44:14 +0600 |
parents | c10c639f8365 |
children |
rev | line source |
---|---|
2415 | 1 #define _CRTDBG_MAP_ALLOC |
2 #include <stdlib.h> | |
3 #include <crtdbg.h> | |
4 | |
2253
aff7a7b072b7
adding _CRT_SECURE_NO_WARNINGS to get rid of a few hundrer annoying warnings + adding count parameter to swprintf
Grumpy7
parents:
2223
diff
changeset
|
5 #define _CRT_SECURE_NO_WARNINGS |
0 | 6 |
2336 | 7 #include "mm7_unsorted_subs.h" |
0 | 8 #include "Bink_Smacker.h" |
9 | |
1262 | 10 #include "mm7_data.h" |
1016 | 11 #include "CShow.h" |
12 #include "Mouse.h" | |
13 | |
0 | 14 #include "VideoPlayer.h" |
2345 | 15 #include "MediaPlayer.h" |
0 | 16 #include "AudioPlayer.h" |
17 #include "Game.h" | |
18 #include "Render.h" | |
19 #include "Party.h" | |
20 #include "GUIWindow.h" | |
2044 | 21 #include "Timer.h" |
0 | 22 #include "Log.h" |
1253 | 23 #include "texts.h" |
1299 | 24 #include "UI\UIHouses.h" |
0 | 25 |
26 VideoPlayer *pVideoPlayer = nullptr; | |
27 | |
2347 | 28 #pragma comment(lib, "Version.lib") |
0 | 29 bool GetDllVersion(const wchar_t *pDllName, uint *pMajor, uint *pMinor) |
30 { | |
31 uint uVersionSize = GetFileVersionInfoSizeW(pDllName, nullptr); | |
32 void *pVersionData = HeapAlloc(GetProcessHeap(), 0, uVersionSize); | |
33 { | |
34 GetFileVersionInfoW(pDllName, 0, uVersionSize, pVersionData); | |
35 | |
36 VS_FIXEDFILEINFO *pInfo = nullptr; | |
37 UINT uInfoSize = 0; | |
38 VerQueryValueW(pVersionData, L"\\", (void **)&pInfo, &uInfoSize); | |
39 | |
40 if (!pMajor || !pMinor) | |
41 { | |
42 HeapFree(GetProcessHeap(), 0, pVersionData); | |
43 return false; | |
44 } | |
45 *pMajor = pInfo->dwFileVersionMS; | |
46 *pMinor = pInfo->dwFileVersionLS; | |
47 } | |
48 HeapFree(GetProcessHeap(), 0, pVersionData); | |
49 return true; | |
50 } | |
51 | |
52 //----- (004BF794) -------------------------------------------------------- | |
2290 | 53 void ShowMM7IntroVideo_and_LoadingScreen() |
0 | 54 { |
55 RGBTexture tex; // [sp+Ch] [bp-30h]@1 | |
2290 | 56 unsigned int uTrackStartMS; // [sp+34h] [bp-8h]@8 |
57 unsigned int uTrackEndMS; // [sp+38h] [bp-4h]@8 | |
0 | 58 |
59 pVideoPlayer->bStopBeforeSchedule = false; | |
165 | 60 pVideoPlayer->pResetflag = 0; |
2290 | 61 bGameoverLoop = true; |
256 | 62 if (!bNoVideo) |
0 | 63 { |
64 pRenderer->PresentBlackScreen(); | |
65 if ( !pVideoPlayer->bStopBeforeSchedule ) | |
2290 | 66 PlayFullscreenMovie(MOVIE_Intro, true); |
0 | 67 } |
2334 | 68 // char pContainerName[64]; |
2278 | 69 |
2290 | 70 tex.Load("mm6title.pcx", 2); |
0 | 71 pRenderer->BeginScene(); |
72 pRenderer->DrawTextureRGB(0, 0, &tex); | |
73 free(tex.pPixels); | |
74 tex.pPixels = 0; | |
762 | 75 |
2290 | 76 //LoadFonts_and_DrawCopyrightWindow(); |
77 DrawMM7CopyrightWindow(); | |
762 | 78 |
0 | 79 pRenderer->EndScene(); |
80 pRenderer->Present(); | |
1004 | 81 |
82 #ifndef _DEBUG | |
83 Sleep(1500); // let the copyright window stay for a while | |
84 #endif | |
85 | |
2290 | 86 if (!bNoSound && pAudioPlayer->hAILRedbook ) |
0 | 87 { |
88 pAudioPlayer->SetMusicVolume((signed __int64)(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0)); | |
89 AIL_redbook_stop(pAudioPlayer->hAILRedbook); | |
2218 | 90 AIL_redbook_track_info(pAudioPlayer->hAILRedbook, 14, &uTrackStartMS, &uTrackEndMS); |
0 | 91 AIL_redbook_play(pAudioPlayer->hAILRedbook, uTrackStartMS + 1, uTrackEndMS); |
2290 | 92 } |
93 bGameoverLoop = false; | |
0 | 94 } |
95 | |
96 //----- (004BE70E) -------------------------------------------------------- | |
2431 | 97 void VideoPlayer::MovieLoop(const char *pMovieName, int a2/*, int ScreenSizeFlag, int a4*/) |
0 | 98 { |
99 int v4; // ebp@1 | |
100 MSG Msg; // [sp+Ch] [bp-1Ch]@12 | |
2218 | 101 |
0 | 102 v4 = a2; |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
103 if ( dword_6BE364_game_settings_1 & (GAME_SETTINGS_NO_HOUSE_ANIM | GAME_SETTINGS_NO_INTRO) || |
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
104 bNoVideo) |
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
105 return; |
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
106 |
0 | 107 if ( a2 == 2 ) |
108 v4 = 0; | |
2347 | 109 ShowCursor(0);//Убрать курсор |
2431 | 110 OpenGlobalMovie(pMovieName, 0); |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
111 bPlayingMovie = 1; |
2218 | 112 field_44 = v4; |
2347 | 113 pRenderer->ClearTarget(0); |
151 | 114 pCurrentScreen = SCREEN_VIDEO; |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
115 |
2218 | 116 auto hwnd = pVideoPlayer->window->GetApiHandle(); |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
117 |
2218 | 118 RECT rc_client; |
119 GetClientRect(hwnd, &rc_client); | |
120 int client_width = rc_client.right - rc_client.left, | |
121 client_height = rc_client.bottom - rc_client.top; | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
122 |
2218 | 123 HDC dc = GetDC(hwnd); |
124 HDC back_dc = CreateCompatibleDC(dc); | |
2418 | 125 HBITMAP back_bmp = CreateCompatibleBitmap(dc, client_width, client_height); |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
126 auto frame_buffer = new char[client_width * client_height * 4]; |
2418 | 127 SelectObject(back_dc, back_bmp); |
2347 | 128 |
129 DWORD t = GetTickCount();//текущее время от запуска ОС | |
130 | |
131 end_current_file = false;//установить флаг конца видеоролика | |
132 | |
133 while (true) //Цикл воспроизведения видеоролика | |
2218 | 134 { |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
135 if (pVideoPlayer->bStopBeforeSchedule) |
2218 | 136 break; |
137 while (PeekMessageA(&Msg, hwnd, 0, 0, PM_REMOVE)) | |
138 { | |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
139 if (Msg.message == WM_QUIT) |
2218 | 140 Game_DeinitializeAndTerminate(0); |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
141 if (Msg.message == WM_PAINT) |
2218 | 142 break; |
143 TranslateMessage(&Msg); | |
144 DispatchMessageA(&Msg); | |
145 } | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
146 |
2347 | 147 double dt = (GetTickCount() - t) / 1000.0; //изменение времени |
2345 | 148 t = GetTickCount(); |
149 | |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
150 pMovie_Track->GetNextFrame(dt, frame_buffer); //получить следующий кадр |
2347 | 151 |
152 if (end_current_file)//достигнут ли конец видео? | |
2218 | 153 break; |
2347 | 154 |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
155 if (frame_buffer) |
2218 | 156 { |
157 // draw to hwnd | |
158 BITMAPINFO bmi; | |
159 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); | |
160 bmi.bmiHeader.biWidth = client_width; | |
161 bmi.bmiHeader.biHeight = -client_height; | |
162 bmi.bmiHeader.biPlanes = 1; | |
163 bmi.bmiHeader.biBitCount = 32; | |
164 bmi.bmiHeader.biCompression = BI_RGB; | |
165 bmi.bmiHeader.biSizeImage = 0; | |
166 bmi.bmiHeader.biXPelsPerMeter = 0; | |
167 bmi.bmiHeader.biYPelsPerMeter = 0; | |
168 bmi.bmiHeader.biClrUsed = 0; | |
169 bmi.bmiHeader.biClrImportant = 0; | |
170 GetDIBits(back_dc, back_bmp, 0, client_height, 0, &bmi, DIB_RGB_COLORS); | |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
171 SetDIBits(back_dc, back_bmp, 0, client_height, frame_buffer, &bmi, DIB_RGB_COLORS); |
2218 | 172 BitBlt(dc, 0, 0, client_width, client_height, back_dc, 0, 0, SRCCOPY); |
173 } | |
2347 | 174 |
175 GUI_MainMenuMessageProc(); //после отрисовки, т.к. иначе вылетает dt = 0.03, image - ??? | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
176 |
2347 | 177 if (pVideoPlayer->bStopBeforeSchedule == 1)//остановка видео |
178 Sleep(1000); //пауза после видеоролика | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
179 } |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
180 delete [] frame_buffer; |
2418 | 181 DeleteObject(back_bmp); |
182 DeleteObject(back_dc); | |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
183 ReleaseDC(hwnd, dc); |
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
184 |
2347 | 185 pVideoPlayer->Unload(); |
186 | |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
187 //if (a4 == 1) |
151 | 188 pCurrentScreen = SCREEN_GAME; |
2347 | 189 |
0 | 190 pVideoPlayer->bPlayingMovie = 0; |
2347 | 191 |
192 ShowCursor(1);//вернуть курсор | |
193 | |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
194 /*if ( pCurrentScreen == SCREEN_VIDEO ) |
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
195 pCurrentScreen = SCREEN_GAME;*/ |
0 | 196 } |
197 | |
198 //----- (004BE9D8) -------------------------------------------------------- | |
1802 | 199 void VideoPlayer::Initialize(OSWindow *target_window) |
0 | 200 { |
201 DWORD NumberOfBytesRead; // [sp+10h] [bp-4h]@9 | |
202 | |
1802 | 203 window = target_window; |
204 | |
0 | 205 uint uBinkVersionMajor = -1, |
206 uBinkVersionMinor = -1; | |
207 GetDllVersion(L"BINKW32.DLL", &uBinkVersionMajor, &uBinkVersionMinor); | |
208 uBinkVersion = (unsigned __int64)uBinkVersionMajor << 32 | uBinkVersionMinor; | |
209 | |
1205
8c02e6f74b29
arrays to std::arrays phase 2 - mm7_data.h converted
Grumpy7
parents:
1165
diff
changeset
|
210 strcpy(pTmpBuf.data(), "anims\\might7.vid"); |
2218 | 211 hMightVid = CreateFileW(L"anims\\might7.vid", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0x8000080, 0); |
0 | 212 if ( hMightVid == INVALID_HANDLE_VALUE ) |
213 { | |
1217 | 214 sprintf(pTmpBuf2.data(), "Can't open file - anims\\%s.smk", pTmpBuf.data()); |
1205
8c02e6f74b29
arrays to std::arrays phase 2 - mm7_data.h converted
Grumpy7
parents:
1165
diff
changeset
|
215 MessageBoxA(0, pTmpBuf2.data(), "Video File Error", 0); |
0 | 216 return; |
217 } | |
1205
8c02e6f74b29
arrays to std::arrays phase 2 - mm7_data.h converted
Grumpy7
parents:
1165
diff
changeset
|
218 strcpy(pTmpBuf.data(), "anims\\magic7.vid"); |
2218 | 219 hMagicVid = CreateFileW(L"anims\\magic7.vid", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0x8000080, 0); |
0 | 220 if ( hMagicVid == INVALID_HANDLE_VALUE ) |
221 { | |
222 if ( !bCanLoadFromCD ) | |
2218 | 223 { |
1217 | 224 sprintf(pTmpBuf2.data(), "Can't open file - anims\\%s.smk", pTmpBuf.data()); |
1205
8c02e6f74b29
arrays to std::arrays phase 2 - mm7_data.h converted
Grumpy7
parents:
1165
diff
changeset
|
225 MessageBoxA(0, pTmpBuf2.data(), "Video File Error", 0); |
0 | 226 return; |
2218 | 227 } |
1217 | 228 sprintf(pTmpBuf2.data(), "%c:\\%s", (unsigned __int8)cMM7GameCDDriveLetter, pTmpBuf.data()); |
2218 | 229 hMagicVid = CreateFileA(pTmpBuf2.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0x8000080, 0); |
0 | 230 if ( hMagicVid == (HANDLE)INVALID_HANDLE_VALUE ) |
231 { | |
2218 | 232 sprintf(pTmpBuf2.data(), "Can't open file - %s", pTmpBuf.data()); |
1205
8c02e6f74b29
arrays to std::arrays phase 2 - mm7_data.h converted
Grumpy7
parents:
1165
diff
changeset
|
233 MessageBoxA(0, pTmpBuf2.data(), "Video File Error", 0); |
0 | 234 return; |
235 } | |
236 } | |
237 ReadFile(hMightVid, &uNumMightVideoHeaders, 4, &NumberOfBytesRead, 0); | |
238 ReadFile(hMagicVid, &uNumMagicVideoHeaders, 4, &NumberOfBytesRead, 0); | |
1583 | 239 pMightVideoHeaders = (MovieHeader *)malloc(sizeof(MovieHeader) * uNumMightVideoHeaders + 2); |
240 pMagicVideoHeaders = (MovieHeader *)malloc(sizeof(MovieHeader) * uNumMagicVideoHeaders + 2); | |
0 | 241 ReadFile(hMightVid, pMightVideoHeaders, 44 * uNumMightVideoHeaders, &NumberOfBytesRead, 0); |
242 ReadFile(hMagicVid, pMagicVideoHeaders, 44 * uNumMagicVideoHeaders, &NumberOfBytesRead, 0); | |
243 } | |
244 | |
245 //----- (004BEBD7) -------------------------------------------------------- | |
246 void VideoPlayer::Unload() | |
247 { | |
1802 | 248 if ( pSmackMovieBlit ) |
0 | 249 { |
1802 | 250 SmackBlitClose(pSmackMovieBlit); |
251 pSmackMovieBlit = 0; | |
0 | 252 } |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
253 bBufferLoaded = 0; |
1802 | 254 uMovieFormat = 0; |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
255 uMovieFormatSwapped = 0; |
1802 | 256 memset(pCurrentMovieName, 0, 0x40); |
0 | 257 if ( pAudioPlayer->hAILRedbook && !bGameoverLoop ) |
258 AIL_redbook_resume(pAudioPlayer->hAILRedbook); | |
259 pEventTimer->Resume(); | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
260 |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
261 pMovie_Track->Release(); |
2394 | 262 delete pMovie_Track; |
263 pMovie_Track = nullptr; | |
0 | 264 } |
265 | |
1802 | 266 void VideoPlayer::_inlined_in_463149() |
267 { | |
2429 | 268 if (pMovie_Track && !bNoVideo) |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
269 { |
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
270 pRenderer->BeginScene(); |
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
271 pMouse->DrawCursorToTarget(); |
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
272 UpdatePalette(); |
2216 | 273 pMouse->ReadCursorWithItem(); |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
274 pRenderer->EndScene(); |
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
275 } |
1802 | 276 } |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
277 |
2356 | 278 void VideoPlayer::UpdatePalette() //UpdateVideo |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
279 { |
2218 | 280 Log::Warning(L"smacker"); |
2360 | 281 loop_current_file = true;//зацикленный ролик |
2218 | 282 pRenderer->BeginScene(); |
2360 | 283 if (end_current_file)//видео завершено/перезагрузка |
2218 | 284 { |
2425 | 285 unsigned int width = game_viewport_width; |
286 unsigned int height = game_viewport_height; | |
2360 | 287 MovieRelease(); |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
288 |
2218 | 289 SetFilePointer(hVidFile, uOffset, nullptr, FILE_BEGIN); |
2394 | 290 pMovie_Track = nullptr; |
291 Log::Warning(L"reload pMovie_Track"); | |
292 pMovie_Track = pMediaPlayer->LoadMovieFromLOD(hVidFile, &readFunction, &seekFunction, width, height); | |
2360 | 293 end_current_file = false; |
2218 | 294 } |
2360 | 295 //else |
296 //{ | |
2345 | 297 double dt = (GetTickCount() - time_video_begin) / 1000.0; |
298 //dt = 1.0/15.0; | |
299 time_video_begin = GetTickCount(); | |
300 | |
301 //log("dt=%.5f\n", dt); | |
302 | |
303 auto image = new char[current_movie_width * current_movie_height * 4]; | |
304 | |
2394 | 305 pMovie_Track->GetNextFrame(dt, image); |
2345 | 306 |
2222 | 307 int image_array[460 * 344];//game_viewport_width * game_viewport_height |
2218 | 308 if (image) |
309 { | |
2222 | 310 memcpy(image_array, image, sizeof (image_array)); |
2223 | 311 for (unsigned int y = 8; y < 8 + game_viewport_height; ++y)//координаты местоположения видеоролика |
2221 | 312 { |
313 for (unsigned int x = 8; x < 8 + game_viewport_width; ++x) | |
314 { | |
2222 | 315 auto p = (unsigned __int32 *)pRenderer->pTargetSurface + x + y * pRenderer->uTargetSurfacePitch; |
316 *p = image_array[((x - 8) + ((y - 8)*game_viewport_width))]; | |
2221 | 317 } |
318 } | |
2218 | 319 delete[] image; |
320 } | |
2360 | 321 //} |
2218 | 322 pRenderer->EndScene(); |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
323 } |
0 | 324 |
325 //----- (004BF28F) -------------------------------------------------------- | |
898 | 326 void VideoPlayer::OpenHouseMovie(const char *pMovieName, unsigned int a3_1) |
0 | 327 { |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
328 if (!this->bBufferLoaded) |
0 | 329 { |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
330 //Prepare(); |
2218 | 331 pEventTimer->Pause(); |
332 if (pAudioPlayer->hAILRedbook) | |
333 AIL_redbook_pause(pAudioPlayer->hAILRedbook); | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
334 |
2218 | 335 bStopBeforeSchedule = false; |
336 bBufferLoaded = 1; | |
337 bPlayingMovie = false; | |
338 bFirstFrame = false; | |
339 bUsingSmackerMMX = SmackUseMMX(1); | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
340 |
1429
c7489dd19f88
BuildingType_Tavern and CastSpellInfo_PushCastSpellInfo fix
Ritor1
parents:
1397
diff
changeset
|
341 this->bLoopPlaying = a3_1; |
c7489dd19f88
BuildingType_Tavern and CastSpellInfo_PushCastSpellInfo fix
Ritor1
parents:
1397
diff
changeset
|
342 if ( LOBYTE(this->field_104) == 1 ) |
0 | 343 { |
1429
c7489dd19f88
BuildingType_Tavern and CastSpellInfo_PushCastSpellInfo fix
Ritor1
parents:
1397
diff
changeset
|
344 MessageBoxA(nullptr, "Unsupported Bink playback!", "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Video.cpp:925", 0); |
0 | 345 return; |
346 } | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
347 |
2218 | 348 LoadMovie(pMovieName); |
2345 | 349 time_video_begin = GetTickCount(); |
0 | 350 } |
351 } | |
352 | |
353 //----- (004BF3F9) -------------------------------------------------------- | |
354 bool VideoPlayer::AnyMovieLoaded() | |
355 { | |
2438
c10c639f8365
* Fixed releasing movie for movie-less transitions.
a.parshin
parents:
2431
diff
changeset
|
356 return pMovie_Track != 0; |
c10c639f8365
* Fixed releasing movie for movie-less transitions.
a.parshin
parents:
2431
diff
changeset
|
357 /*if (pMovie_Track) |
2394 | 358 return pMovie_Track;// pSmackerMovie || pBinkMovie; |
2425 | 359 else |
2438
c10c639f8365
* Fixed releasing movie for movie-less transitions.
a.parshin
parents:
2431
diff
changeset
|
360 return false;*/ |
0 | 361 } |
362 | |
363 //----- (004BF411) -------------------------------------------------------- | |
2431 | 364 void VideoPlayer::OpenGlobalMovie(const char *pFilename, unsigned int bLoop/*, int ScreenSizeFlag*/) |
0 | 365 { |
2334 | 366 // unsigned int v10; // eax@11 |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
367 |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
368 if (!this->bBufferLoaded) |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
369 { |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
370 pEventTimer->Pause(); |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
371 if (pAudioPlayer->hAILRedbook) |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
372 AIL_redbook_pause(pAudioPlayer->hAILRedbook); |
0 | 373 |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
374 bStopBeforeSchedule = false; |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
375 bBufferLoaded = 1; |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
376 bPlayingMovie = false; |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
377 bFirstFrame = false; |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
378 bUsingSmackerMMX = SmackUseMMX(1); |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
379 this->bLoopPlaying = bLoop; |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
380 LoadMovie(pFilename); |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
381 return; |
0 | 382 } |
383 } | |
384 | |
2347 | 385 //----- (004BF5B2) -------------------------------------------------------- |
0 | 386 void VideoPlayer::_4BF5B2() |
387 { | |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
388 //__debugbreak(); |
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
389 |
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
390 /*if ( this->uMovieFormat == 2 ) |
0 | 391 { |
392 BinkGoto(pBinkMovie, 1, 0); | |
393 BinkDoFrame(pBinkMovie); | |
394 BinkNextFrame(pBinkMovie); | |
395 } | |
396 else | |
397 { | |
1429
c7489dd19f88
BuildingType_Tavern and CastSpellInfo_PushCastSpellInfo fix
Ritor1
parents:
1397
diff
changeset
|
398 if ( this->uMovieFormat != 1 ) |
0 | 399 return; |
400 SmackGoto(pSmackerMovie, 1); | |
401 if ( pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion != 4 ) | |
402 { | |
403 SmackDoFrame(pSmackerMovie); | |
404 SmackNextFrame(pSmackerMovie); | |
405 } | |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
406 }*/ |
0 | 407 pMouse->_469E24(); |
2394 | 408 if ( window_SpeakInHouse && window_SpeakInHouse->ptr_1C == (void *)165 && !pMovie_Track)//!this->pSmackerMovie ) |
0 | 409 { |
2218 | 410 bGameoverLoop = true; |
1919 | 411 HouseDialogPressCloseBtn(); |
336 | 412 window_SpeakInHouse->Release(); |
2218 | 413 pParty->uFlags &= 0xFFFFFFFD; |
481 | 414 if ( EnterHouse(HOUSE_BODY_GUILD_ERATHIA) ) |
0 | 415 { |
388 | 416 pAudioPlayer->PlaySound(SOUND_Invalid, 0, 0, -1, 0, 0, 0, 0); |
2215
e9625ad08541
fog fix and change 640,480 - window->GetWidth(), window->GetHeight()
Ritor1
parents:
2154
diff
changeset
|
417 window_SpeakInHouse = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_HouseInterior, 165, 0); |
2218 | 418 window_SpeakInHouse->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 1, 0x31, "", 0); |
419 window_SpeakInHouse->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 2, 0x32, "", 0); | |
420 window_SpeakInHouse->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 3, 0x33, "", 0); | |
421 window_SpeakInHouse->CreateButton(0x197u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 4, 0x34, "", 0); | |
0 | 422 } |
423 bGameoverLoop = 0; | |
424 } | |
425 } | |
426 | |
427 //----- (004BF73A) -------------------------------------------------------- | |
898 | 428 void VideoPlayer::SelectMovieType() |
0 | 429 { |
430 char Source[32]; // [sp+Ch] [bp-40h]@1 | |
431 | |
432 strcpy(Source, this->pCurrentMovieName); | |
433 Unload(); | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
434 if ( this->uMovieFormatSwapped == 1 ) |
1429
c7489dd19f88
BuildingType_Tavern and CastSpellInfo_PushCastSpellInfo fix
Ritor1
parents:
1397
diff
changeset
|
435 OpenHouseMovie(Source, LOBYTE(this->bLoopPlaying)); |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
436 else if ( this->uMovieFormatSwapped == 2 ) |
2431 | 437 OpenGlobalMovie(Source, LOBYTE(this->bLoopPlaying)); |
0 | 438 else |
1429
c7489dd19f88
BuildingType_Tavern and CastSpellInfo_PushCastSpellInfo fix
Ritor1
parents:
1397
diff
changeset
|
439 __debugbreak(); |
0 | 440 } |
441 | |
442 //----- (004BF8F6) -------------------------------------------------------- | |
443 void VideoPlayer::PlayDeathMovie() | |
444 { | |
445 bStopBeforeSchedule = 0; | |
165 | 446 pResetflag = 0; |
1397 | 447 PlayFullscreenMovie(MOVIE_Death, true); |
448 //pGame->pCShow->PlayMovie(MOVIE_Death, 1); | |
1262 | 449 } |
450 | |
451 //----- (004BE6F5) -------------------------------------------------------- | |
452 VideoPlayer::VideoPlayer() : | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
453 bBufferLoaded(0), |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
454 //pBinkMovie(nullptr), pBinkBuffer(nullptr), |
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
455 //pSmackerMovie(nullptr), pSmackerBuffer(nullptr), |
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
456 pSmackMovieBlit(nullptr) |
1262 | 457 { |
458 //RGBTexture::RGBTexture(&pVideoPlayer->pVideoFrame); | |
459 bStopBeforeSchedule = false; | |
460 pResetflag = 0; | |
2356 | 461 pMediaPlayer = new Media::MPlayer;//создаётся плеер |
2393 | 462 Log::Warning(L"allocation dynamic memory for pMediaPlayer\n"); |
2394 | 463 pMovie_Track = nullptr; |
1262 | 464 //pBinkMovie = nullptr; |
465 } | |
2134 | 466 |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
467 int VideoPlayer::readFunction(void* opaque, uint8_t* buf, int buf_size) |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
468 { |
2218 | 469 HANDLE stream = (HANDLE)opaque; |
470 //int numBytes = stream->read((char*)buf, buf_size); | |
471 int numBytes; | |
472 ReadFile(stream, (char *)buf, buf_size, (LPDWORD)&numBytes, NULL); | |
473 return numBytes; | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
474 } |
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
475 |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
476 int64_t VideoPlayer::seekFunction(void* opaque, int64_t offset, int whence) |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
477 { |
2218 | 478 if (whence == AVSEEK_SIZE) |
479 return pVideoPlayer->uSize; | |
480 HANDLE h = (HANDLE)opaque; | |
481 LARGE_INTEGER li; | |
482 li.QuadPart = offset; | |
483 | |
484 if (!SetFilePointerEx(h, li, (PLARGE_INTEGER)&li, FILE_BEGIN)) | |
485 return -1; | |
486 return li.QuadPart; | |
2137
d24ee391fd1f
libavcodec playing movies and houses, loops not working yet
zipi
parents:
2134
diff
changeset
|
487 } |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
488 |
2430
cb66a1082fcf
* ITrack, IMovie now properly propogate destructors
a.parshin
parents:
2429
diff
changeset
|
489 void VideoPlayer::LoadMovie(const char *pFilename) |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
490 { |
2218 | 491 char pVideoNameBik[120]; // [sp+Ch] [bp-28h]@2 |
492 char pVideoNameSmk[120]; // [sp+Ch] [bp-28h]@2 | |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
493 |
2218 | 494 sprintf(pVideoNameBik, "%s.bik", pFilename); |
495 sprintf(pVideoNameSmk, "%s.smk", pFilename); | |
496 for (uint i = 0; i < uNumMightVideoHeaders; ++i) | |
497 { | |
498 if (!_stricmp(pVideoNameSmk, pMightVideoHeaders[i].pVideoName)) | |
499 { | |
500 hVidFile = hMightVid; | |
501 uOffset = pMightVideoHeaders[i].uFileOffset; | |
502 uSize = pMightVideoHeaders[i + 1].uFileOffset - uOffset; | |
503 this->uMovieFormat = 1; | |
504 this->uMovieFormatSwapped = 2; | |
505 } | |
506 } | |
507 for (uint i = 0; i < uNumMagicVideoHeaders; ++i) | |
508 { | |
509 if (!_stricmp(pVideoNameBik, pMagicVideoHeaders[i].pVideoName)) | |
510 { | |
511 hVidFile = hMagicVid; | |
512 uOffset = pMagicVideoHeaders[i].uFileOffset; | |
513 uSize = pMagicVideoHeaders[i + 1].uFileOffset - uOffset; | |
514 this->uMovieFormat = 2; | |
515 this->uMovieFormatSwapped = 1; | |
516 } | |
517 if (!_stricmp(pVideoNameSmk, pMagicVideoHeaders[i].pVideoName)) | |
518 { | |
519 hVidFile = hMagicVid; | |
520 uOffset = pMagicVideoHeaders[i].uFileOffset; | |
521 uSize = pMagicVideoHeaders[i + 1].uFileOffset - uOffset; | |
522 this->uMovieFormat = 1; | |
523 this->uMovieFormatSwapped = 2; | |
524 } | |
525 } | |
526 if (!hVidFile) | |
527 { | |
528 Unload(); | |
529 MessageBoxA(0, "VideoPlayer error", "VideoPlayer Error", 0); | |
530 return; | |
531 } | |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
532 |
2218 | 533 SetFilePointer(hVidFile, uOffset, 0, FILE_BEGIN); |
534 strcpy(this->pCurrentMovieName, pFilename); | |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
535 |
2218 | 536 auto hwnd = pVideoPlayer->window->GetApiHandle(); |
537 RECT rc_client; | |
538 GetClientRect(hwnd, &rc_client); | |
539 int client_width = rc_client.right - rc_client.left, | |
540 client_height = rc_client.bottom - rc_client.top; | |
2142
ca548138d6aa
some code cleaning in video playing, loops play but there is a memory leak
zipi
parents:
2137
diff
changeset
|
541 |
2394 | 542 pMovie_Track = pMediaPlayer->LoadMovieFromLOD(hVidFile, &readFunction, &seekFunction, client_width, client_height); |
2345 | 543 } |