# HG changeset patch
# User Ritor1
# Date 1406276277 -21600
# Node ID 90349b8048a5c2fc5d626057d5132749eb7ddeb3
# Parent 45dcf81c5b1c3da42f70fa61fa8863b8b71578a5
remove VideoPlayer.cpp/.h
diff -r 45dcf81c5b1c -r 90349b8048a5 Arcomage.cpp
--- a/Arcomage.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/Arcomage.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -8,7 +8,7 @@
#include "Render.h"
#include "Arcomage.h"
-#include "VideoPlayer.h"
+#include "MediaPlayer.h"
#include "AudioPlayer.h"
#include "Mouse.h"
#include "Game.h"
@@ -1114,7 +1114,7 @@
pArcomageGame->bGameInProgress = false;
viewparams->bRedrawGameUI = true;
if ( pMovie_Track )
- pVideoPlayer->_4BF5B2();
+ pMediaPlayer->_4BF5B2();
for( int i = 0; i < 12; ++i )
pSoundList->UnloadSound(am_sounds[i], 1);
}
diff -r 45dcf81c5b1c -r 90349b8048a5 AudioPlayer.cpp
--- a/AudioPlayer.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/AudioPlayer.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -7,7 +7,7 @@
#include "ZlibWrapper.h"
#include "mm7_data.h"
-#include "VideoPlayer.h"
+#include "MediaPlayer.h"
#include "AudioPlayer.h"
#include "FrameTableInc.h"
#include "Indoor.h"
@@ -128,7 +128,6 @@
pSoundList->UnloadSound(i, 1);
}
}
- //_CrtDumpMemoryLeaks();
}
//----- (004A9A67) --------------------------------------------------------
@@ -2346,8 +2345,8 @@
if ( this->bPlayerReady )
{
- CloseHandle(hMagicVid);
- CloseHandle(hMightVid);
+ CloseHandle(pMediaPlayer->hMagicVid);
+ CloseHandle(pMediaPlayer->hMightVid);
pAudioPlayer->StopChannels(-1, -1);
if ( pAudioPlayer->uMixerChannels > 0 )
{
diff -r 45dcf81c5b1c -r 90349b8048a5 Build/Visual Studio 2010/World of Might and Magic.vcxproj
--- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj Thu Jul 24 12:50:24 2014 +0600
+++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj Fri Jul 25 14:17:57 2014 +0600
@@ -244,7 +244,6 @@
-
@@ -486,7 +485,6 @@
-
diff -r 45dcf81c5b1c -r 90349b8048a5 Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters
--- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters Thu Jul 24 12:50:24 2014 +0600
+++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters Fri Jul 25 14:17:57 2014 +0600
@@ -76,7 +76,6 @@
-
@@ -706,7 +705,6 @@
-
diff -r 45dcf81c5b1c -r 90349b8048a5 CShow.h
--- a/CShow.h Thu Jul 24 12:50:24 2014 +0600
+++ b/CShow.h Fri Jul 25 14:17:57 2014 +0600
@@ -1,5 +1,5 @@
#pragma once
-#include "VideoPlayer.h"
+#include "MediaPlayer.h"
#include "ErrorHandling.h"
@@ -16,23 +16,23 @@
MOVIE_Outro = 0x7,
};
-inline void PlayFullscreenMovie(MovieType movie, bool bShowMouseAfterPlayback = false)
+inline void PlayFullscreenMovie(MovieType movie_type, bool bShowMouseAfterPlayback = false)
{
extern unsigned int bNoVideo;
if (bNoVideo) return;
- switch (movie)
+ switch (movie_type)
{
- case MOVIE_3DOLogo: pVideoPlayer->MovieLoop("3dologo", 0); break;
- case MOVIE_NWCLogo: pVideoPlayer->MovieLoop("new world logo", 0); break;
- case MOVIE_JVC: pVideoPlayer->MovieLoop("jvc", 0); break;
- case MOVIE_Intro: pVideoPlayer->MovieLoop("Intro", 0); break;
- case MOVIE_Emerald: pVideoPlayer->MovieLoop("Intro Post", 0); break;
- case MOVIE_Death: pVideoPlayer->MovieLoop("losegame", 2); break;
- case MOVIE_Outro: pVideoPlayer->MovieLoop("end_seq1", 20); break;
+ case MOVIE_3DOLogo: pMediaPlayer->GlobalMovieLoop("3dologo", 0); break;
+ case MOVIE_NWCLogo: pMediaPlayer->GlobalMovieLoop("new world logo", 0); break;
+ case MOVIE_JVC: pMediaPlayer->GlobalMovieLoop("jvc", 0); break;
+ case MOVIE_Intro: pMediaPlayer->GlobalMovieLoop("Intro", 0); break;
+ case MOVIE_Emerald: pMediaPlayer->GlobalMovieLoop("Intro Post", 0); break;
+ case MOVIE_Death: pMediaPlayer->GlobalMovieLoop("losegame", 2); break;
+ case MOVIE_Outro: pMediaPlayer->GlobalMovieLoop("end_seq1", 20); break;
default:
- Error("Invalid movie requested: %u", movie);
+ Error("Invalid movie requested: %u", movie_type);
break;
}
}
diff -r 45dcf81c5b1c -r 90349b8048a5 Events.cpp
--- a/Events.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/Events.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -10,7 +10,7 @@
#include "Weather.h"
#include "Texture.h"
#include "mm7_data.h"
-#include "VideoPlayer.h"
+#include "MediaPlayer.h"
#include "Mouse.h"
#include "MapInfo.h"
@@ -457,18 +457,18 @@
v12 = (char *)&item.uExpireTime + strlen(Source) + 7;
if ( *v12 == 32 )
*v12 = 0;
- if (pVideoPlayer->bBufferLoaded)
- pVideoPlayer->Unload();
- pVideoPlayer->bStopBeforeSchedule = 0;
- pVideoPlayer->pResetflag = 0;
+ if (pMediaPlayer->bPlaying_Movie)
+ pMediaPlayer->Unload();
+ pMediaPlayer->bStopBeforeSchedule = 0;
+// pMediaPlayer->pResetflag = 0;
v128 = pCurrentScreen;
strcpy(Str, Source);
v16 = RemoveQuotes(Str);
- pVideoPlayer->MovieLoop(v16, 0/*, _evt->v5*/);
+ pMediaPlayer->GlobalMovieLoop(v16, 0/*, _evt->v5*/);
if ( !_stricmp(v16, "arbiter good") )
- {
- pParty->alignment = PartyAlignment_Good;
+ {
+ pParty->alignment = PartyAlignment_Good;
v18 = 0;
LOBYTE(v17) = 1;
SetUserInterface(PartyAlignment_Good, v17);
@@ -478,7 +478,7 @@
if ( v128 == 3 )
pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen;
if ( v128 == 13 )
- pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
+ pMediaPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
}
++curr_seq_num;
break;
@@ -495,7 +495,7 @@
if ( v128 == 3 )
pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen;
if ( v128 == 13 )
- pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
+ pMediaPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1);
}
++curr_seq_num;
break;
@@ -512,7 +512,7 @@
if ( v128 == 3 )
pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen;
if ( v128 == 13 )
- pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1);
+ pMediaPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1);
}
++curr_seq_num;
}
@@ -694,7 +694,7 @@
if ( window_SpeakInHouse->par1C == 165 )
{
HouseDialogPressCloseBtn();
- pVideoPlayer->Unload();
+ pMediaPlayer->Unload();
window_SpeakInHouse->Release();
pParty->uFlags &= ~2;
activeLevelDecoration = (LevelDecoration*)1;
@@ -721,7 +721,7 @@
else
{
if ( window_SpeakInHouse->par1C == 553 )
- pVideoPlayer->bLoopPlaying = 0;
+ pMediaPlayer->bLoopPlaying = 0;
}
}
@@ -1184,7 +1184,7 @@
dialog_menu_id = HOUSE_DIALOGUE_NULL;
while ( HouseDialogPressCloseBtn() )
;
- pVideoPlayer->Unload();
+ pMediaPlayer->Unload();
window_SpeakInHouse->Release();
window_SpeakInHouse = 0;
if ( pMessageQueue_50CBD0->uNumMessages )
diff -r 45dcf81c5b1c -r 90349b8048a5 GUIWindow.cpp
--- a/GUIWindow.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/GUIWindow.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -11,7 +11,6 @@
#include "LOD.h"
#include "Keyboard.h"
#include "OurMath.h"
-#include "VideoPlayer.h"
#include "MapInfo.h"
#include "Timer.h"
#include "AudioPlayer.h"
diff -r 45dcf81c5b1c -r 90349b8048a5 Game.cpp
--- a/Game.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/Game.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -29,7 +29,6 @@
#include "LOD.h"
#include "GUIWindow.h"
#include "TurnEngine.h"
-#include "VideoPlayer.h"
#include "Bink_Smacker.h"
#include "Events.h"
#include "Arcomage.h"
@@ -353,7 +352,7 @@
continue;
}
- pVideoPlayer->_inlined_in_463149();
+ pMediaPlayer->HouseMovieLoop();
pEventTimer->Update();
pMiscTimer->Update();
@@ -428,9 +427,10 @@
if ( pNPCStats->pNewNPCData[i].field_24 )
pNPCStats->pNewNPCData[i].uFlags &= 0xFFFFFF7Fu;
}
- pVideoPlayer->PlayDeathMovie();
+ pMediaPlayer->bStopBeforeSchedule = 0;
+ PlayFullscreenMovie(MOVIE_Death, true);
if ( pMovie_Track )
- pVideoPlayer->Unload();
+ pMediaPlayer->Unload();
SaveGame(0, 0);
++pParty->uNumDeaths;
for ( uint i = 0; i < 4; ++i )
@@ -1240,7 +1240,7 @@
uGameState = GAME_FINISHED;
continue;
case UIMSG_PlayArcomage:
- pVideoPlayer->_4BF5B2();
+ pMediaPlayer->_4BF5B2();
pArcomageGame->bGameInProgress = 1;
ArcomageGame::PrepareArcomage();
continue;
@@ -1693,8 +1693,8 @@
case UIMSG_ToggleTint:
pRenderer->ToggleTint();
continue;
- case UIMSG_ChangeMusicVolume: //громкость музыки
- if ( uMessageParam == 4 )//кнопка понижения
+ case UIMSG_ChangeMusicVolume:
+ if ( uMessageParam == 4 )//-
{
--uMusicVolimeMultiplier;
if ( (char)uMusicVolimeMultiplier < 1 )
@@ -1705,7 +1705,7 @@
pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f);
continue;
}
- if ( uMessageParam == 5 )//кнопка повышения
+ if ( uMessageParam == 5 )//+
{
++uMusicVolimeMultiplier;
if ( (char)uMusicVolimeMultiplier > 9 )
@@ -1716,7 +1716,7 @@
pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f);
continue;
}
- uMusicVolimeMultiplier = (pMouse->GetCursorPos(&v202)->x - 263) / 17;//для задания громкости мышкой
+ uMusicVolimeMultiplier = (pMouse->GetCursorPos(&v202)->x - 263) / 17;//for mouse
if ( (char)uMusicVolimeMultiplier > 9 )
uMusicVolimeMultiplier = 9;
if ( uMusicVolimeMultiplier )
@@ -2152,7 +2152,7 @@
stru_506E40.Release();
break;
}
- pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0);
+ pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0);
break;
case SCREEN_REST://close rest screen
if ( dword_506F14 )
@@ -2222,7 +2222,7 @@
}
GetHouseGoodbyeSpeech();
pAudioPlayer->PlaySound(SOUND_7, 814, 0, -1, 0, 0, 0, 0);
- pVideoPlayer->Unload();
+ pMediaPlayer->Unload();
pGUIWindow_CurrentMenu = window_SpeakInHouse;
if ( pGUIWindow_Settings )
{
@@ -2252,7 +2252,7 @@
case SCREEN_INPUT_BLV://click escape
if ( uCurrentHouse_Animation == 153 )
PlayHouseSound(0x99u, HouseSound_Greeting_2);
- pVideoPlayer->Unload();
+ pMediaPlayer->Unload();
if ( npcIdToDismissAfterDialogue )
{
pParty->hirelingScrollPosition = 0;
@@ -2300,7 +2300,7 @@
viewparams->bRedrawGameUI = true;
continue;
case SCREEN_VIDEO:
- pVideoPlayer->Unload();
+ pMediaPlayer->Unload();
continue;
case SCREEN_CHARACTERS:
CharacterUI_ReleaseButtons();
@@ -2502,8 +2502,8 @@
sub_42FBDD();
PlayHouseSound(uCurrentHouse_Animation, HouseSound_NotEnoughMoney_TrainingSuccessful);
- if (pVideoPlayer->AnyMovieLoaded())
- pVideoPlayer->Unload();
+ if (pMovie_Track)
+ pMediaPlayer->Unload();
DialogueEnding();
viewparams->bRedrawGameUI = true;
if ( dword_59117C_teleportx | dword_591178_teleporty | dword_591174_teleportz | dword_591170_teleport_directiony | dword_59116C_teleport_directionx | dword_591168_teleport_speedz )
@@ -2554,7 +2554,7 @@
continue;
case UIMSG_TransitionWindowCloseBtn:
CloseWindowBackground();
- pVideoPlayer->Unload();
+ pMediaPlayer->Unload();
DialogueEnding();
viewparams->bRedrawGameUI = true;
continue;
@@ -4367,7 +4367,7 @@
if ( !(dword_6BE364_game_settings_1 & GAME_SETTINGS_4000))
break;
v15 = 1;
- pVideoPlayer->bStopBeforeSchedule = 1;
+ pMediaPlayer->bStopBeforeSchedule = 1;
viewparams->bRedrawGameUI = 1;
viewparams->field_48 = 1;
if ( GetCurrentMenuID() == MENU_MAIN || GetCurrentMenuID() == MENU_MMT_MAIN_MENU
diff -r 45dcf81c5b1c -r 90349b8048a5 MMT.cpp
--- a/MMT.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/MMT.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -12,7 +12,6 @@
#include "Mouse.h"
#include "LOD.h"
#include "Render.h"
-#include "VideoPlayer.h"
#include "CShow.h"
#include "GUIFont.h"
#include "lib/libpng/png.h"
@@ -24,17 +23,17 @@
//unsigned int uTrackStartMS; // [sp+34h] [bp-8h]@8
//unsigned int uTrackEndMS; // [sp+38h] [bp-4h]@8
- pVideoPlayer->bStopBeforeSchedule = false;
- pVideoPlayer->pResetflag = 0;
+ pMediaPlayer->bStopBeforeSchedule = false;
+// pMediaPlayer->pResetflag = 0;
bGameoverLoop = 1;
if (!bNoVideo)
{
pRenderer->PresentBlackScreen();
PlayFullscreenMovie(MOVIE_3DOLogo, true);
- if ( !pVideoPlayer->bStopBeforeSchedule )
+ if ( !pMediaPlayer->bStopBeforeSchedule )
{
PlayFullscreenMovie(MOVIE_NWCLogo, true);
- if ( !pVideoPlayer->bStopBeforeSchedule )
+ if ( !pMediaPlayer->bStopBeforeSchedule )
PlayFullscreenMovie(MOVIE_JVC, true);
}
}
@@ -48,7 +47,7 @@
free(tex.pPixels);
tex.pPixels = 0;
MainMenuUI_LoadFontsAndSomeStuff();
- DrawMMTCopyrightWindow();//Текстовое сообщение ММТ меню
+ DrawMMTCopyrightWindow();//Text message in ММТ menu
pRenderer->EndScene();
pRenderer->Present();
@@ -161,7 +160,7 @@
i++;
}
}
- //Ritor1: temporarily stopped, needed change RGBTexture structure/Пока приостановлено в связи с необходимостью внести изменения в структуру(создать)RGBTexture
+ //Ritor1: temporarily stopped, needed change RGBTexture structure
/*for (int i = 0; i < width * height; ++i)
tex->pPalette16[i] = 0x7FF;
memset(tex->pLevelOfDetail0_prolly_alpha_mask, 1, sizeof(unsigned __int8) * width * height);*/
@@ -180,25 +179,25 @@
pCurrentScreen = SCREEN_GAME;
pGUIWindow2 = 0;
- pAudioPlayer->StopChannels(-1, -1);//остановить/подготовить канал
+ pAudioPlayer->StopChannels(-1, -1);
//if (!bNoSound )
- //PlayAudio(L"Sounds\\New_Sounds/Stronghold_Theme.mp3");//воспроизводим мп3
+ //PlayAudio(L"Sounds\\New_Sounds/Stronghold_Theme.mp3");
//if (!bNoVideo )
//pVideoPlayer->PlayMovie(L"Anims\\New_Video/3DOLOGO.smk");
- pMouse->RemoveHoldingItem();//избавить курсор от вещи
+ pMouse->RemoveHoldingItem();
pIcons_LOD->_inlined_sub2();
- //Создание нового окна
- //WINDOW_MainMenu добавлено в GUIWindow.h
+ //Create new window
+ //WINDOW_MainMenu included in GUIWindow.h
pWindow_MMT_MainMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_MainMenu, 0, 0);
- //Загрузка кнопок
+ //load buttons
//Texture* MMT_MM6 = pIcons_LOD->LoadTexturePtr("title_new", TEXTURE_16BIT_PALETTE);
- sprintf(pContainerName, "data\\New_Icons/%s", "mm6_button_oval.png");//загружаем png из папки
+ sprintf(pContainerName, "data\\New_Icons/%s", "mm6_button_oval.png");
Texture* MMT_MM6 = LoadPNG(pContainerName);
Texture* MMT_MM7 = pIcons_LOD->LoadTexturePtr("title_load", TEXTURE_16BIT_PALETTE);
@@ -214,11 +213,11 @@
pTexture_PCX.Release();
- sprintf(pContainerName, "data\\New_Icons/%s", "MMTTITLE.pcx");//загружаем pcx из папки
+ sprintf(pContainerName, "data\\New_Icons/%s", "MMTTITLE.pcx");
if (pTexture_PCX.LoadPCXFile(pContainerName, 0) == 1)
Error("File not found: %s", pContainerName);
- SetCurrentMenuID(MENU_MMT_MAIN_MENU);//Добавлено в enum MENU_STATE в GUIWindows.h
+ SetCurrentMenuID(MENU_MMT_MAIN_MENU);//included in enum MENU_STATE in GUIWindows.h
SetForegroundWindow(window->GetApiHandle());
SendMessageW(window->GetApiHandle(), WM_ACTIVATEAPP, 1, 0);
while (GetCurrentMenuID() == MENU_MMT_MAIN_MENU )
@@ -243,7 +242,7 @@
pRenderer->BeginScene();
pRenderer->DrawTextureRGB(0, 0, &pTexture_PCX);
- MMT_MenuMessageProc();//отдельный для ММТ меню обработчик сообщений
+ MMT_MenuMessageProc();//for ММТ menu
GUI_UpdateWindows();
if ( !pModalWindow )// ???
@@ -255,7 +254,7 @@
&& cursor.y >= (signed int)pButton->uY && cursor.y <= (signed int)pButton->uW )
{
pControlParam = pButton->msg_param;
- switch (pControlParam) // подсветка кнопок
+ switch (pControlParam) // backlight for buttons
{
case 0:
pTexture = MMT_MM6;
@@ -283,7 +282,7 @@
pY = window->GetHeight() - 35;
break;
}
- pRenderer->DrawTextureIndexed(pX, pY, pTexture); //подсветка кнопок
+ pRenderer->DrawTextureIndexed(pX, pY, pTexture);
}
}
}
@@ -297,7 +296,7 @@
pRenderer->EndScene();
pRenderer->Present();
- //освобождаем ресурсы
+ //remove resurs
pTexture_PCX.Release();
if ( pGUIWindow2 )
{
@@ -323,12 +322,30 @@
switch (pUIMessageType)
{
- case UIMSG_MMT_MainMenu_MM7: //кнопка игры ММ7
+ case UIMSG_MMT_MainMenu_MM6:
+ //video
+ //SetCurrentMenuID(MENU_MAIN_MM6);
+ pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0);//temporarily
+ break;
+ case UIMSG_MMT_MainMenu_MM7: //new button for ММ7
//GUIWindow::Create(495, 172, 0, 0, WINDOW_PressedButton2, (int)pMainMenu_BtnNew, 0);
alSourceStop(mSourceID);
- ShowMM7IntroVideo_and_LoadingScreen();
+ pMediaPlayer->ShowMM7IntroVideo_and_LoadingScreen();
SetCurrentMenuID(MENU_MAIN);
break;
+ case UIMSG_MMT_MainMenu_MM8:
+ //video
+ //SetCurrentMenuID(MENU_MAIN_MM8);
+ pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0);//temporarily
+ break;
+ case UIMSG_MMT_MainMenu_Continue:
+ //video
+ //SetCurrentMenuID(MENU_MAIN_Continue);
+ pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0);//temporarily
+ break;
+ case UIMSG_ExitToWindows:
+ GUIWindow::Create(495, 337, 0, 0, WINDOW_PressedButton2, (int)pMainMenu_BtnExit, 0);
+ SetCurrentMenuID(MENU_EXIT_GAME);
default:
break;
diff -r 45dcf81c5b1c -r 90349b8048a5 MediaPlayer.cpp
--- a/MediaPlayer.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/MediaPlayer.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -21,16 +21,31 @@
#include
#include
+#define _CRT_SECURE_NO_WARNINGS
+
+#include "mm7_unsorted_subs.h"
+#include "Mouse.h"
+#include "Game.h"
+#include "Party.h"
+#include "GUIWindow.h"
+#include "texts.h"
+#include "UI\UIHouses.h"
#include "stuff.h"
+#include "mm7_data.h"
#include "OpenALSoundProvider.h"
-
#include "Log.h"
+#include "MediaPlayer.h"
+#include "CShow.h"
+#include "Bink_Smacker.h"
+#include "AudioPlayer.h"
+#include "Timer.h"
+#include "Render.h"
-#include "MediaPlayer.h"
-#include "Log.h"
+#pragma comment(lib, "Version.lib")
+
using namespace Media;
-Media::MPlayer *pMediaPlayer;
+Media::MPlayer *pMediaPlayer = nullptr;
Media::IMovie *pMovie_Track;
Media::ITrack *pAudio_Track;
Movie *movie;
@@ -139,12 +154,6 @@
size_t current_pos;
};
-bool end_current_file;
-bool loop_current_file;
-DWORD time_video_begin;
-int current_movie_width;
-int current_movie_height;
-
OpenALSoundProvider *provider = nullptr;
static int av_num_bytes_per_sample(AVSampleFormat sample_fmt)
@@ -767,10 +776,10 @@
OpenALSoundProvider::TrackBuffer *device_buffer;
};
-class Movie: public Media::IMovie//класс производная от базового Media::IMovie
+class Movie: public Media::IMovie
{
public:
- inline Movie()//прямая вставка в код
+ inline Movie()
{
this->movie_filename[0] = 0;
this->width = 0;
@@ -844,26 +853,14 @@
width = dst_width;
height = dst_height;
// Open video file
- //откроем входной файл(Шаг 2)
- //Функция avformat_open_input читает файловый заголовок и сохраняет информацию о найденных форматах в структуре
- //AVFormatContext. Остальные аргументы могут быть установлены в NULL, в этом случае libavformat использует
- //автоматическое определение параметров. Последние 2 аргумента используются для формата файла и опций.
if (avformat_open_input(&format_ctx, filenamea, nullptr, nullptr) >= 0)
{
// Retrieve stream information
- // Проверяем потоки
- //Т.к. avformat_open_input читает только заголовок файла, то следующим шагом нужно получить информацию о потоках
- //в файле. Это делается функцией avformat_find_stream_info.(Шаг 3)
if (avformat_find_stream_info(format_ctx, nullptr) >= 0)
{
// Dump information about file onto standard error
- //Инициализируем pFormatCtx->streams
- //После этого format_context->streams содержит все существующие потоки файла.
- //Их количество равно format_context->nb_streams.
- //Вывести подробную информацию о файле и обо всех потоках можно функцией av_dump_format.
av_dump_format(format_ctx, 0, filenamea, 0);
- //pFormatCtx->streams - массив указателей, размера pFormatCtx->nb_streams, поищем тут потоки.
if (!av_open_audio_stream(format_ctx, &audio))
{
Error("Cannot open audio stream: %s", filenamea);
@@ -879,30 +876,29 @@
//Ritor1: include
if (_stricmp("binkvideo", video.dec->name) )
{
- current_movie_width = video.dec_ctx->width;
- current_movie_height = video.dec_ctx->height;
+ pMediaPlayer->current_movie_width = video.dec_ctx->width;
+ pMediaPlayer->current_movie_height = video.dec_ctx->height;
}
else
{
- current_movie_width = width;
- current_movie_height = height;
+ pMediaPlayer->current_movie_width = width;
+ pMediaPlayer->current_movie_height = height;
}
//
decoding_packet = new AVPacket;
av_init_packet(decoding_packet);
// Allocate video frame
- //Выделим память для фрейма
decoding_frame = avcodec_alloc_frame();
audio_data_in_device = provider->CreateStreamingTrack16(audio.dec_ctx->channels, audio.dec_ctx->sample_rate, 2);
return true;
}
fprintf(stderr, "ffmpeg: Unable to find stream info\n");
- return Release(), false; // Не найдена информация о потоке
+ return Release(), false;
}
fprintf(stderr, "ffmpeg: Unable to open input file\n");
- return Release(), false; // Не может открыть файл
+ return Release(), false;
}
bool LoadFromLOD(HANDLE h, int readFunction(void*, uint8_t*, int), int64_t seekFunction(void*, int64_t, int), int width, int height)
@@ -917,66 +913,56 @@
return Load(L"dummyFilename", width, height, 0);
}
- virtual void GetNextFrame(double dt, void *dst_surface)// Получить следующий фрейм
+ virtual void GetNextFrame(double dt, void *dst_surface)
{
- playback_time += dt;//изменение времени
+ playback_time += dt;
- //Данные из файла читаются пакетами (AVPacket), а для отображения используется фрейм (AVFrame).
AVPacket *avpacket = decoding_packet;
AVFrame *avframe = decoding_frame;
-
- //Инизиализируем avframe
+
avcodec_get_frame_defaults(avframe);
int desired_frame_number = floor(playback_time * video.dec_ctx->time_base.den / video.dec_ctx->time_base.num + 0.5);
if (last_resampled_frame_num == desired_frame_number)
{
- memcpy(dst_surface, last_resampled_frame_data[0], current_movie_height * last_resampled_frame_linesize[0]);
+ memcpy(dst_surface, last_resampled_frame_data[0], pMediaPlayer->current_movie_height * last_resampled_frame_linesize[0]);
return;
}
volatile int frameFinished = false;
- //чтение пакетов
// keep reading packets until we hit the end or find a video packet
do
{
- if (loop_current_file)
+ if (pMediaPlayer->loop_current_file)
{
//Now seek back to the beginning of the stream
if (video.dec_ctx->frame_number >= video.stream->duration - 1 )
- end_current_file = true;
+ pMediaPlayer->bPlaying_Movie = false;
}
- //чтение пакетов
- if (av_read_frame(format_ctx, avpacket) < 0) //воспроизведение завершено
+ if (av_read_frame(format_ctx, avpacket) < 0)
{
// probably movie is finished
- end_current_file = true;
+ pMediaPlayer->bPlaying_Movie = false;
av_free_packet(avpacket);
return;
}
// Is this a packet from the video stream?
// audio packet - queue into playing
- //Принадлежит ли пакет к аудиопотоку
if (avpacket->stream_index == audio.stream_idx)
{
MemoryStream audio_data;
if (DecodeAudioFrame(audio.dec_ctx, avpacket, avframe, &audio_data, &num_audio_samples))
provider->Stream16(audio_data_in_device, num_audio_samples, audio_data.Ptr());
//continue;
- } //неявно вызывается деструктор для audio_data
+ }
// Decode video frame
- //пакет к видеопотоку
// video packet - decode & maybe show
else if (avpacket->stream_index == video.stream_idx)
{
do
{
- //Функция avcodec_decode_video2 осуществляет декодирование пакета в фрейм с использованием кодека,
- //который мы получили раньше (codec_context). Функция устанавливает положительное значение frame_finished в случае
- //если фрейм декодирован целиком (то есть один фрейм может занимать несколько пакетов и frame_finished будет
- //установлен только при декодировании последнего пакета).
if (avcodec_decode_video2(video.dec_ctx, avframe, (int *)&frameFinished, avpacket) < 0)
__debugbreak();
} while (!frameFinished);
@@ -995,27 +981,24 @@
uint8_t *rescaled_data[4] = {nullptr, nullptr, nullptr, nullptr};
int rescaled_linesize[4] = {0, 0, 0, 0};
- if (av_image_alloc(rescaled_data, rescaled_linesize, current_movie_width, current_movie_height, rescaled_format, 1) >= 0)
+ if (av_image_alloc(rescaled_data, rescaled_linesize, pMediaPlayer->current_movie_width, pMediaPlayer->current_movie_height, rescaled_format, 1) >= 0)
{
- // создание контекста для преобразования
SwsContext *converter = sws_getContext(avframe->width, avframe->height, (AVPixelFormat)avframe->format,
- current_movie_width, current_movie_height, rescaled_format,
+ pMediaPlayer->current_movie_width, pMediaPlayer->current_movie_height, rescaled_format,
SWS_BICUBIC, nullptr, nullptr, nullptr);
- // преобразование кадра(масштабирование)
sws_scale(converter, avframe->data, avframe->linesize, 0, avframe->height, rescaled_data, rescaled_linesize);
sws_freeContext(converter);
- //копирование в возвращаемую переменную
- memcpy(dst_surface, rescaled_data[0], current_movie_height * rescaled_linesize[0]);
+ memcpy(dst_surface, rescaled_data[0], pMediaPlayer->current_movie_height * rescaled_linesize[0]);
last_resampled_frame_num = desired_frame_number;
memcpy(last_resampled_frame_data, rescaled_data, sizeof(rescaled_data));
memcpy(last_resampled_frame_linesize, rescaled_linesize, sizeof(rescaled_linesize));
- //av_freep(&rescaled_data[0]);//вроде должен быть
+ //av_freep(&rescaled_data[0]);
}
}
else
- memset(dst_surface, 0, width * current_movie_height * 4);
+ memset(dst_surface, 0, width * pMediaPlayer->current_movie_height * 4);
// Free the packet that was allocated by av_read_frame
av_free_packet(avpacket);
@@ -1050,7 +1033,7 @@
int last_resampled_frame_linesize[4];
};
-ITrack *MPlayer::LoadTrack(const wchar_t *filename) //Загрузить mp3
+ITrack *MPlayer::LoadTrack(const wchar_t *filename)
{
auto audio_track = new Track;
Log::Warning(L"allocation dynamic memory for audio_track\n");
@@ -1076,6 +1059,425 @@
return movie;
}
+//----- (004BE9D8) --------------------------------------------------------
+void MPlayer::Initialize(OSWindow *target_window)
+{
+ DWORD NumberOfBytesRead; // [sp+10h] [bp-4h]@9
+
+ window = target_window;
+
+ unsigned int uBinkVersionMajor = -1,
+ uBinkVersionMinor = -1;
+ //GetDllVersion(L"BINKW32.DLL", &uBinkVersionMajor, &uBinkVersionMinor);
+ //uBinkVersion = (unsigned __int64)uBinkVersionMajor << 32 | uBinkVersionMinor;
+
+ strcpy(pTmpBuf.data(), "anims\\might7.vid");
+ hMightVid = CreateFileW(L"anims\\might7.vid", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0x8000080, 0);
+ if ( hMightVid == INVALID_HANDLE_VALUE )
+ {
+ sprintf(pTmpBuf2.data(), "Can't open file - anims\\%s.smk", pTmpBuf.data());
+ MessageBoxA(0, pTmpBuf2.data(), "Video File Error", 0);
+ return;
+ }
+ strcpy(pTmpBuf.data(), "anims\\magic7.vid");
+ hMagicVid = CreateFileW(L"anims\\magic7.vid", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0x8000080, 0);
+ if ( hMagicVid == INVALID_HANDLE_VALUE )
+ {
+ if ( !bCanLoadFromCD )
+ {
+ sprintf(pTmpBuf2.data(), "Can't open file - anims\\%s.smk", pTmpBuf.data());
+ MessageBoxA(0, pTmpBuf2.data(), "Video File Error", 0);
+ return;
+ }
+ sprintf(pTmpBuf2.data(), "%c:\\%s", (unsigned __int8)cMM7GameCDDriveLetter, pTmpBuf.data());
+ hMagicVid = CreateFileA(pTmpBuf2.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0x8000080, 0);
+ if ( hMagicVid == (HANDLE)INVALID_HANDLE_VALUE )
+ {
+ sprintf(pTmpBuf2.data(), "Can't open file - %s", pTmpBuf.data());
+ MessageBoxA(0, pTmpBuf2.data(), "Video File Error", 0);
+ return;
+ }
+ }
+ ReadFile(hMightVid, &uNumMightVideoHeaders, 4, &NumberOfBytesRead, 0);
+ ReadFile(hMagicVid, &uNumMagicVideoHeaders, 4, &NumberOfBytesRead, 0);
+ pMightVideoHeaders = (MovieHeader *)malloc(sizeof(MovieHeader) * uNumMightVideoHeaders + 2);
+ pMagicVideoHeaders = (MovieHeader *)malloc(sizeof(MovieHeader) * uNumMagicVideoHeaders + 2);
+ ReadFile(hMightVid, pMightVideoHeaders, 44 * uNumMightVideoHeaders, &NumberOfBytesRead, 0);
+ ReadFile(hMagicVid, pMagicVideoHeaders, 44 * uNumMagicVideoHeaders, &NumberOfBytesRead, 0);
+}
+
+//----- (004BF411) --------------------------------------------------------
+void MPlayer::OpenGlobalMovie(const char *pFilename, unsigned int bLoop/*, int ScreenSizeFlag*/)
+{
+ if (!this->bPlaying_Movie)
+ {
+ pEventTimer->Pause();
+ if (pAudioPlayer->hAILRedbook)
+ AIL_redbook_pause(pAudioPlayer->hAILRedbook);
+
+ bStopBeforeSchedule = false;
+ bFirstFrame = false;
+ this->bLoopPlaying = bLoop;
+ LoadMovie(pFilename);
+ return;
+ }
+}
+
+//----- (004BF28F) --------------------------------------------------------
+void MPlayer::OpenHouseMovie(const char *pMovieName, unsigned int a3_1)
+{
+ if (!this->bPlaying_Movie)
+ {
+ //Prepare();
+ pEventTimer->Pause();
+ if (pAudioPlayer->hAILRedbook)
+ AIL_redbook_pause(pAudioPlayer->hAILRedbook);
+
+ bStopBeforeSchedule = false;
+ bFirstFrame = false;
+
+ this->bLoopPlaying = a3_1;
+ /*if ( LOBYTE(this->field_104) == 1 )
+ {
+ MessageBoxA(nullptr, "Unsupported Bink playback!", "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Video.cpp:925", 0);
+ return;
+ }*/
+
+ LoadMovie(pMovieName);
+ time_video_begin = GetTickCount();
+ }
+}
+
+//----- (004BE70E) --------------------------------------------------------
+void MPlayer::GlobalMovieLoop(const char *pMovieName, int a2/*, int ScreenSizeFlag, int a4*/)
+{
+ int v4; // ebp@1
+ MSG Msg; // [sp+Ch] [bp-1Ch]@12
+
+ v4 = a2;
+ if ( dword_6BE364_game_settings_1 & (GAME_SETTINGS_NO_HOUSE_ANIM | GAME_SETTINGS_NO_INTRO) ||
+ bNoVideo)
+ return;
+
+ if ( a2 == 2 )
+ v4 = 0;
+ ShowCursor(0);
+ OpenGlobalMovie(pMovieName, 0);
+ bPlaying_Movie = 1;
+ field_44 = v4;
+ pRenderer->ClearTarget(0);
+ pCurrentScreen = SCREEN_VIDEO;
+
+ auto hwnd = pMediaPlayer->window->GetApiHandle();
+
+ RECT rc_client;
+ GetClientRect(hwnd, &rc_client);
+ int client_width = rc_client.right - rc_client.left,
+ client_height = rc_client.bottom - rc_client.top;
+
+ HDC dc = GetDC(hwnd);
+ HDC back_dc = CreateCompatibleDC(dc);
+ HBITMAP back_bmp = CreateCompatibleBitmap(dc, client_width, client_height);
+ auto frame_buffer = new char[client_width * client_height * 4];
+ SelectObject(back_dc, back_bmp);
+
+ DWORD t = GetTickCount();
+
+ bPlaying_Movie = true;
+
+ while (true)
+ {
+ if (pMediaPlayer->bStopBeforeSchedule)
+ break;
+ while (PeekMessageA(&Msg, hwnd, 0, 0, PM_REMOVE))
+ {
+ if (Msg.message == WM_QUIT)
+ Game_DeinitializeAndTerminate(0);
+ if (Msg.message == WM_PAINT)
+ break;
+ TranslateMessage(&Msg);
+ DispatchMessageA(&Msg);
+ }
+
+ double dt = (GetTickCount() - t) / 1000.0;
+ t = GetTickCount();
+
+ pMovie_Track->GetNextFrame(dt, frame_buffer);
+
+ if (!bPlaying_Movie)
+ break;
+
+ if (frame_buffer)
+ {
+ // draw to hwnd
+ BITMAPINFO bmi;
+ bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ bmi.bmiHeader.biWidth = client_width;
+ bmi.bmiHeader.biHeight = -client_height;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biBitCount = 32;
+ bmi.bmiHeader.biCompression = BI_RGB;
+ bmi.bmiHeader.biSizeImage = 0;
+ bmi.bmiHeader.biXPelsPerMeter = 0;
+ bmi.bmiHeader.biYPelsPerMeter = 0;
+ bmi.bmiHeader.biClrUsed = 0;
+ bmi.bmiHeader.biClrImportant = 0;
+ GetDIBits(back_dc, back_bmp, 0, client_height, 0, &bmi, DIB_RGB_COLORS);
+ SetDIBits(back_dc, back_bmp, 0, client_height, frame_buffer, &bmi, DIB_RGB_COLORS);
+ BitBlt(dc, 0, 0, client_width, client_height, back_dc, 0, 0, SRCCOPY);
+ }
+
+ GUI_MainMenuMessageProc();
+
+ if (pMediaPlayer->bStopBeforeSchedule == 1)
+ Sleep(1000);
+ }
+ delete [] frame_buffer;
+ DeleteObject(back_bmp);
+ DeleteObject(back_dc);
+ ReleaseDC(hwnd, dc);
+
+ pMediaPlayer->Unload();
+
+ //if (a4 == 1)
+ pCurrentScreen = SCREEN_GAME;
+
+ pMediaPlayer->bPlaying_Movie = false;
+
+ ShowCursor(1);
+
+ /*if ( pCurrentScreen == SCREEN_VIDEO )
+ pCurrentScreen = SCREEN_GAME;*/
+}
+
+void MPlayer::HouseMovieLoop()
+{
+ if (pMovie_Track && !bNoVideo)
+ {
+ pRenderer->BeginScene();
+ pMouse->DrawCursorToTarget();
+
+ Log::Warning(L"smacker");
+ loop_current_file = true;
+ pRenderer->BeginScene();
+ if (!bPlaying_Movie)//reload
+ {
+ unsigned int width = game_viewport_width;
+ unsigned int height = game_viewport_height;
+ MovieRelease();
+
+ SetFilePointer(hVidFile, uOffset, nullptr, FILE_BEGIN);
+ pMovie_Track = nullptr;
+ Log::Warning(L"reload pMovie_Track");
+ pMovie_Track = pMediaPlayer->LoadMovieFromLOD(hVidFile, &readFunction, &seekFunction, width, height);
+ bPlaying_Movie = true;
+ }
+ //else
+ //{
+ double dt = (GetTickCount() - time_video_begin) / 1000.0;
+ //dt = 1.0/15.0;
+ time_video_begin = GetTickCount();
+
+ //log("dt=%.5f\n", dt);
+
+ auto image = new char[current_movie_width * current_movie_height * 4];
+
+ pMovie_Track->GetNextFrame(dt, image);
+
+ int image_array[460 * 344];//game_viewport_width * game_viewport_height
+ if (image)
+ {
+ memcpy(image_array, image, sizeof (image_array));
+ for (unsigned int y = 8; y < 8 + game_viewport_height; ++y)//координаты местоположения видеоролика
+ {
+ for (unsigned int x = 8; x < 8 + game_viewport_width; ++x)
+ {
+ auto p = (unsigned __int32 *)pRenderer->pTargetSurface + x + y * pRenderer->uTargetSurfacePitch;
+ *p = image_array[((x - 8) + ((y - 8)*game_viewport_width))];
+ }
+ }
+ delete[] image;
+ }
+ //}
+ pRenderer->EndScene();
+ pMouse->ReadCursorWithItem();
+ pRenderer->EndScene();
+ }
+}
+
+//----- (004BF5B2) --------------------------------------------------------
+void MPlayer::_4BF5B2()
+{
+ pMouse->_469E24();
+ if ( window_SpeakInHouse && window_SpeakInHouse->ptr_1C == (void *)165 && !pMovie_Track)//!this->pSmackerMovie )
+ {
+ bGameoverLoop = true;
+ HouseDialogPressCloseBtn();
+ window_SpeakInHouse->Release();
+ pParty->uFlags &= 0xFFFFFFFD;
+ if ( EnterHouse(HOUSE_BODY_GUILD_ERATHIA) )
+ {
+ pAudioPlayer->PlaySound(SOUND_Invalid, 0, 0, -1, 0, 0, 0, 0);
+ window_SpeakInHouse = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_HouseInterior, 165, 0);
+ window_SpeakInHouse->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 1, 0x31, "", 0);
+ window_SpeakInHouse->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 2, 0x32, "", 0);
+ window_SpeakInHouse->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 3, 0x33, "", 0);
+ window_SpeakInHouse->CreateButton(0x197u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 4, 0x34, "", 0);
+ }
+ bGameoverLoop = 0;
+ }
+}
+
+//----- (004BF73A) --------------------------------------------------------
+void MPlayer::SelectMovieType()
+{
+ char Source[32]; // [sp+Ch] [bp-40h]@1
+
+ strcpy(Source, this->pCurrentMovieName);
+ pMediaPlayer->Unload();
+ if ( this->uMovieType == 1 )
+ OpenHouseMovie(Source, LOBYTE(this->bLoopPlaying));
+ else if ( this->uMovieType == 2 )
+ OpenGlobalMovie(Source, LOBYTE(this->bLoopPlaying));
+ else
+ __debugbreak();
+}
+
+void MPlayer::LoadMovie(const char *pFilename)
+{
+ char pVideoNameBik[120]; // [sp+Ch] [bp-28h]@2
+ char pVideoNameSmk[120]; // [sp+Ch] [bp-28h]@2
+
+ sprintf(pVideoNameBik, "%s.bik", pFilename);
+ sprintf(pVideoNameSmk, "%s.smk", pFilename);
+ for (uint i = 0; i < uNumMightVideoHeaders; ++i)
+ {
+ if (!_stricmp(pVideoNameSmk, pMightVideoHeaders[i].pVideoName))
+ {
+ hVidFile = hMightVid;
+ uOffset = pMightVideoHeaders[i].uFileOffset;
+ uSize = pMightVideoHeaders[i + 1].uFileOffset - uOffset;
+ this->uMovieType = 2;
+ }
+ }
+ for (uint i = 0; i < uNumMagicVideoHeaders; ++i)
+ {
+ if (!_stricmp(pVideoNameBik, pMagicVideoHeaders[i].pVideoName))
+ {
+ hVidFile = hMagicVid;
+ uOffset = pMagicVideoHeaders[i].uFileOffset;
+ uSize = pMagicVideoHeaders[i + 1].uFileOffset - uOffset;
+ this->uMovieType = 1;
+ }
+ if (!_stricmp(pVideoNameSmk, pMagicVideoHeaders[i].pVideoName))
+ {
+ hVidFile = hMagicVid;
+ uOffset = pMagicVideoHeaders[i].uFileOffset;
+ uSize = pMagicVideoHeaders[i + 1].uFileOffset - uOffset;
+ this->uMovieType = 2;
+ }
+ }
+ if (!hVidFile)
+ {
+ pMediaPlayer->Unload();
+ MessageBoxA(0, "MediaPlayer error", "MediaPlayer Error", 0);
+ return;
+ }
+
+ SetFilePointer(hVidFile, uOffset, 0, FILE_BEGIN);
+ strcpy(this->pCurrentMovieName, pFilename);
+
+ auto hwnd = pMediaPlayer->window->GetApiHandle();
+ RECT rc_client;
+ GetClientRect(hwnd, &rc_client);
+ int client_width = rc_client.right - rc_client.left,
+ client_height = rc_client.bottom - rc_client.top;
+
+ pMovie_Track = pMediaPlayer->LoadMovieFromLOD(hVidFile, &readFunction, &seekFunction, client_width, client_height);
+}
+
+
+//----- (004BF794) --------------------------------------------------------
+void MPlayer::ShowMM7IntroVideo_and_LoadingScreen()
+{
+ RGBTexture tex; // [sp+Ch] [bp-30h]@1
+ unsigned int uTrackStartMS; // [sp+34h] [bp-8h]@8
+ unsigned int uTrackEndMS; // [sp+38h] [bp-4h]@8
+
+ pMediaPlayer->bStopBeforeSchedule = false;
+// pMediaPlayer->pResetflag = 0;
+ bGameoverLoop = true;
+ if (!bNoVideo)
+ {
+ pRenderer->PresentBlackScreen();
+ if ( !pMediaPlayer->bStopBeforeSchedule )
+ PlayFullscreenMovie(MOVIE_Intro, true);
+ }
+
+ tex.Load("mm6title.pcx", 2);
+ pRenderer->BeginScene();
+ pRenderer->DrawTextureRGB(0, 0, &tex);
+ free(tex.pPixels);
+ tex.pPixels = 0;
+
+ //LoadFonts_and_DrawCopyrightWindow();
+ DrawMM7CopyrightWindow();
+
+ pRenderer->EndScene();
+ pRenderer->Present();
+
+ #ifndef _DEBUG
+ Sleep(1500); // let the copyright window stay for a while
+ #endif
+
+ if (!bNoSound && pAudioPlayer->hAILRedbook )
+ {
+ pAudioPlayer->SetMusicVolume((signed __int64)(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0));
+ AIL_redbook_stop(pAudioPlayer->hAILRedbook);
+ AIL_redbook_track_info(pAudioPlayer->hAILRedbook, 14, &uTrackStartMS, &uTrackEndMS);
+ AIL_redbook_play(pAudioPlayer->hAILRedbook, uTrackStartMS + 1, uTrackEndMS);
+ }
+ bGameoverLoop = false;
+}
+
+//----- (004BEBD7) --------------------------------------------------------
+void MPlayer::Unload()
+{
+ bPlaying_Movie = false;
+ uMovieType = 0;
+ memset(pCurrentMovieName, 0, 0x40);
+ if ( pAudioPlayer->hAILRedbook && !bGameoverLoop )
+ AIL_redbook_resume(pAudioPlayer->hAILRedbook);
+ pEventTimer->Resume();
+
+ pMovie_Track->Release();
+ delete pMovie_Track;
+ pMovie_Track = nullptr;
+}
+
+int MPlayer::readFunction(void* opaque, uint8_t* buf, int buf_size)
+{
+ HANDLE stream = (HANDLE)opaque;
+ //int numBytes = stream->read((char*)buf, buf_size);
+ int numBytes;
+ ReadFile(stream, (char *)buf, buf_size, (LPDWORD)&numBytes, NULL);
+ return numBytes;
+}
+
+int64_t MPlayer::seekFunction(void* opaque, int64_t offset, int whence)
+{
+ if (whence == AVSEEK_SIZE)
+ return pMediaPlayer->uSize;
+ HANDLE h = (HANDLE)opaque;
+ LARGE_INTEGER li;
+ li.QuadPart = offset;
+
+ if (!SetFilePointerEx(h, li, (PLARGE_INTEGER)&li, FILE_BEGIN))
+ return -1;
+ return li.QuadPart;
+}
+
+
IMovie *MPlayer::LoadMovieFromLOD(HANDLE h, int readFunction(void*, uint8_t*, int), int64_t seekFunction(void*, int64_t, int), int width, int height)
{
movie = new Movie;
@@ -1103,6 +1505,9 @@
MPlayer::MPlayer()
{
+ bPlaying_Movie = false;
+ //pSmackMovieBlit = nullptr;
+
static int libavcodec_initialized = false;
if (!libavcodec_initialized)
@@ -1111,14 +1516,15 @@
avcodec_register_all();
// Register all available file formats and codecs
- //инициализируем библиотеку ffmpeg(Шаг 1)
- //Во время инициализации регистрируются все имеющиеся в библиотеке форматы файлов и кодеков.
- //После этого они будут использоваться автоматически при открытии файлов этого формата и с этими кодеками.
av_register_all();
libavcodec_initialized = true;
}
+ bStopBeforeSchedule = false;
+// pResetflag = 0;
+ pMovie_Track = nullptr;
+
if (!provider)
{
provider = new OpenALSoundProvider;
@@ -1131,6 +1537,10 @@
{
delete provider;
Log::Warning(L"delete dynamic memory for provider\n");
+
+ bStopBeforeSchedule = false;
+// pResetflag = 0;
+ pVideoFrame.Release();
}
void PlayAudio(const wchar_t * pFilename)
@@ -1154,19 +1564,4 @@
delete movie;
Log::Warning(L"delete dynamic memory for movie\n");
movie = nullptr;
-}
-
-//////////////////////////////////////////////////////////////////////////
-//Included from a VideoPlayer.cpp file/вставлено из файла VideoPlayer.cpp/
-//////////////////////////////////////////////////////////////////////////
-
-//used in void VideoPlayer::Initialize(OSWindow *target_window) for open .vid files
-MovieHeader *pMightVideoHeaders;
-MovieHeader *pMagicVideoHeaders;
-HANDLE hMightVid;
-HANDLE hMagicVid;
-unsigned __int64 uBinkVersion;
-unsigned int uNumMightVideoHeaders;
-unsigned int uNumMagicVideoHeaders;
-//
-
+}
\ No newline at end of file
diff -r 45dcf81c5b1c -r 90349b8048a5 MediaPlayer.h
--- a/MediaPlayer.h Thu Jul 24 12:50:24 2014 +0600
+++ b/MediaPlayer.h Fri Jul 25 14:17:57 2014 +0600
@@ -1,4 +1,44 @@
#pragma once
+#include "OSWindow.h"
+#include "Texture.h"
+#include "MediaPlayer.h"
+
+#pragma pack(push, 1)
+
+#pragma pack(pop)
+
+#pragma pack(push, 1)
+#pragma pack(pop)
+
+
+
+extern "C"
+{
+#include "lib/libavcodec/avcodec.h"
+#include "lib/libavformat/avformat.h"
+#include "lib/libavutil/avutil.h"
+#include "lib/libavutil/imgutils.h"
+#include "lib/libswscale/swscale.h"
+#include "lib/libswresample/swresample.h"
+#include "lib/libavutil/opt.h"
+}
+#pragma comment(lib, "avcodec.lib")
+#pragma comment(lib, "avformat.lib")
+#pragma comment(lib, "avutil.lib")
+#pragma comment(lib, "swscale.lib")
+#pragma comment(lib, "swresample.lib")
+
+#include "lib/OpenAL/al.h"
+#include "lib/OpenAL/alc.h"
+#pragma comment(lib, "OpenAL32.lib")
+
+#pragma pack(push, 1)
+
+struct MovieHeader
+{
+ char pVideoName[40];
+ unsigned int uFileOffset;
+};
namespace Media
{
@@ -19,6 +59,7 @@
virtual void Play() = 0;
virtual void GetNextFrame(double dt, void *target_surface) = 0;
virtual void Release() = 0;
+
};
class MPlayer
@@ -27,46 +68,67 @@
MPlayer();
virtual ~MPlayer();
- ITrack *LoadTrack(const wchar_t *name);
+ //for video/////////////////////////////////////////////////
+ RGBTexture pVideoFrame;
+ int field_44;//final video
+ unsigned int bFirstFrame;
+ unsigned int bLoopPlaying;
+ unsigned int bStopBeforeSchedule;
+ OSWindow *window;
+ int uMovieType;//0 - null, 1 - bik, 2 - smk
+ char pCurrentMovieName[64];
+ char pVideoFrameTextureFilename[32];
+ MovieHeader *pMightVideoHeaders;
+ MovieHeader *pMagicVideoHeaders;
+ HANDLE hMightVid;
+ HANDLE hMagicVid;
+ unsigned int uNumMightVideoHeaders;
+ unsigned int uNumMagicVideoHeaders;
+ bool bPlaying_Movie;
+ bool loop_current_file;
+ DWORD time_video_begin;
+ int current_movie_width;
+ int current_movie_height;
+
+ HANDLE hVidFile;
+ int uSize;
+ int uOffset;
+
+ void Initialize(OSWindow *window);
+
+ void OpenGlobalMovie(const char *pFilename, unsigned int bLoop);
+ void OpenHouseMovie(const char *pMovieName, unsigned int a3_1);
+
+ void _4BF5B2();
+ void LoadMovie(const char *);
+ void SelectMovieType();
+
+ void GlobalMovieLoop(const char *pMovieName, int a2);
+ void HouseMovieLoop();
+
+ void ShowMM7IntroVideo_and_LoadingScreen();
+ void Unload();
+ ///////////////////////////////////////////////
+
IMovie *LoadMovie(const wchar_t *name, int width, int height, int cache_ms);
IMovie *LoadMovieFromLOD(HANDLE h, int readFunction(void*, uint8_t*, int), int64_t seekFunction(void*, int64_t, int), int width, int height);
+
+
+ ITrack *LoadTrack(const wchar_t *name);
+
+ protected:
+ static int readFunction(void *, uint8_t *, int);
+ static int64_t seekFunction(void *, int64_t, int);
};
};
-
+#pragma pack(pop)
extern Media::MPlayer *pMediaPlayer;
extern Media::IMovie *pMovie_Track;
extern Media::ITrack *pAudio_Track;
extern class Movie *movie;
-extern bool end_current_file;
-extern bool loop_current_file;
-extern DWORD time_video_begin;
-extern int current_movie_width;
-extern int current_movie_height;
-
extern int mSourceID;
-//int64_t seekFunction(void* opaque, int64_t offset, int whence);
extern void PlayMovie(const wchar_t * pFilename);
extern void PlayAudio(const wchar_t * pFilename);
extern void MovieRelease();
-
-//////////////////////////////////////////////////////////////////////////
-//Included from a VideoPlayer.h file/вставлено из файла VideoPlayer.h/
-//////////////////////////////////////////////////////////////////////////
-
-//used in void VideoPlayer::Initialize(OSWindow *target_window) for open .vid files
-struct MovieHeader
-{
- char pVideoName[40];
- unsigned int uFileOffset;
-};
-
-extern MovieHeader *pMightVideoHeaders;
-extern MovieHeader *pMagicVideoHeaders;
-extern HANDLE hMightVid;
-extern HANDLE hMagicVid;
-extern unsigned __int64 uBinkVersion;
-extern unsigned int uNumMightVideoHeaders;
-extern unsigned int uNumMagicVideoHeaders;
-//
\ No newline at end of file
diff -r 45dcf81c5b1c -r 90349b8048a5 NPC.cpp
--- a/NPC.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/NPC.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -1,6 +1,7 @@
#define _CRTDBG_MAP_ALLOC
#include
#include
+
#define _CRT_SECURE_NO_WARNINGS
#include "mm7_unsorted_subs.h"
#include "texts.h"
@@ -12,7 +13,7 @@
#include "Party.h"
#include "NPC.h"
#include "GUIWindow.h"
-#include "VideoPlayer.h"
+#include "MediaPlayer.h"
#include "Events.h"
#include "UI\UIHouses.h"
#include "Indoor.h"
@@ -290,7 +291,6 @@
test_string=tmp_pos+1;
} while ((decode_step<2)&&!break_loop);
}
-//_CrtDumpMemoryLeaks();
free(pNPCTopicTXT_Raw);
pNPCTopicTXT_Raw = (char *)pEvents_LOD->LoadRaw("npctopic.txt", 0);
strtok(pNPCTopicTXT_Raw, "\r");
@@ -1575,7 +1575,7 @@
if ( uActiveCharacter )
pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)61, 0);
_return:
- pVideoPlayer->_4BF5B2();//HouseVideo
+ pMediaPlayer->_4BF5B2();//HouseVideo
}
//----- (004B29F2) --------------------------------------------------------
const char * ContractSelectText( int pEventCode )
diff -r 45dcf81c5b1c -r 90349b8048a5 OSWindow.cpp
--- a/OSWindow.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/OSWindow.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -8,7 +8,7 @@
#include "mm7_data.h"
#include "Arcomage.h"
#include "AudioPlayer.h"
-#include "VideoPlayer.h"
+#include "MediaPlayer.h"
#include "Mouse.h"
#include "Timer.h"
#include "GUIWindow.h"
@@ -44,8 +44,8 @@
if (UIControl::OnMouseLeftClick(x, y))
return true;
- if (pVideoPlayer->pVideoFrame.pPixels)
- pVideoPlayer->bStopBeforeSchedule = true;
+ //if (pMediaPlayer->bPlaying_Movie)
+ //pMediaPlayer->bPlaying_Movie = false;
pMouse->SetMouseClick(x, y);
@@ -64,8 +64,8 @@
if (UIControl::OnMouseRightClick(x, y))
return true;
- if (pVideoPlayer->pVideoFrame.pPixels)
- pVideoPlayer->bStopBeforeSchedule = true;
+ if (pMediaPlayer->bPlaying_Movie)
+ pMediaPlayer->bPlaying_Movie = false;
pMouse->SetMouseClick(x, y);
@@ -225,8 +225,8 @@
}
if ( !pArcomageGame->bGameInProgress )
{
- if ( pVideoPlayer->pVideoFrame.pPixels )
- pVideoPlayer->bStopBeforeSchedule = 1;
+ if ( pMediaPlayer->bPlaying_Movie )
+ pMediaPlayer->bPlaying_Movie = false;
if ( wparam == VK_RETURN )
{
if ( !viewparams->field_4C )
@@ -247,7 +247,7 @@
return 0;
if ( wparam > VK_DOWN )
{
- if ( wparam != VK_F4 || pVideoPlayer->AnyMovieLoaded() )
+ if ( wparam != VK_F4 || pMovie_Track )
return 0;
// F4 - toggle fullscreen
@@ -280,7 +280,7 @@
}
if ( wparam != 114 )
{
- if ( wparam == 115 && !pVideoPlayer->AnyMovieLoaded() )
+ if ( wparam == 115 && !pMovie_Track )
SendMessage(api_handle, WM_COMMAND, 104, 0);
return false;
}
@@ -336,9 +336,8 @@
if (!(dword_6BE364_game_settings_1 & GAME_SETTINGS_APP_INACTIVE))
{
dword_4E98BC_bApplicationActive = 0;
- if ( pMovie_Track//(pVideoPlayer->pSmackerMovie || pVideoPlayer->pBinkMovie)
- && pVideoPlayer->bPlayingMovie )
- pVideoPlayer->bStopBeforeSchedule = 1;
+ if ( pMovie_Track )
+ pMediaPlayer->bPlaying_Movie = true;
ClipCursor(0);
dword_6BE364_game_settings_1 |= GAME_SETTINGS_APP_INACTIVE;
@@ -466,15 +465,9 @@
{
CREATESTRUCTA* cs = (CREATESTRUCTA *)(lparam);
OSWindow* window = (OSWindow *)cs->lpCreateParams;
- //Функция SetWindowLongPtr изменяет атрибуты указанного окна. Функция также устанавливает и значение
- // при заданном смещении в дополнительной памяти окна.
SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR)window);
return DefWindowProcW(hwnd, msg, wparam, lparam);
}
- //Функция GetWindowLongPtr извлекает информацию об определяемом окне. Функция также извлекает данные и о значение
- //при заданном смещении в дополнительной памяти окна.
- //GWLP_USERDATA - Извлекает пользовательские данные, связанные с окном. Эти данные предназначаются для использования приложением,
- //которое создавало окно. Его значение первоначально является нулевым.
OSWindow* window = (OSWindow *)GetWindowLongPtrW(hwnd, GWLP_USERDATA);
if (window && window->api_handle == hwnd) //Uninitialized memory access
{
@@ -482,19 +475,15 @@
if (window->WinApiMessageProc(msg, wparam, lparam, &result))//Unhandled application exception
return result;
}
- //Функция DefWindowProc вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку по умолчанию любого
- //сообщения окна, которые приложение не обрабатывает. Эта функция гарантирует то, что обрабатывается каждое сообщение.
return DefWindowProcW(hwnd, msg, (WPARAM)wparam, (LPARAM)lparam);
}
-
void OSWindow::Show()
{
ShowWindow(api_handle, SW_SHOWNORMAL);
UpdateWindow(api_handle);
}
-
void OSWindow::SetCursor(const char *cursor_name)
{
POINT cursor_pos;
@@ -505,19 +494,19 @@
SetClassLongPtrW(api_handle, GCLP_HCURSOR, (LONG)LoadCursorW(NULL, IDC_ARROW));
else if (!strcmp(cursor_name, "MICON2") )
{
- //HCURSOR hCurs1; // дескриптор курсора
+ //HCURSOR hCurs1;
- // Создаем курсор в виде мишени.
+ // Create target
- //pMouse->uCursorTextureID = pIcons_LOD->LoadTexture(cursor_name, TEXTURE_16BIT_PALETTE);//есть альфа маска
- //hCurs1 = LoadCursor(NULL, L"Target");//неверно, наверно нужно загрузить/создать курсор
+ //pMouse->uCursorTextureID = pIcons_LOD->LoadTexture(cursor_name, TEXTURE_16BIT_PALETTE);
+ //hCurs1 = LoadCursor(NULL, L"Target");
SetClassLongPtrW(api_handle, GCLP_HCURSOR, (LONG)LoadCursorW(NULL, IDC_CROSS));
}
else if (!strcmp(cursor_name, "MICON3") )
SetClassLongPtrW(api_handle, GCLP_HCURSOR, (LONG)LoadCursorW(NULL, IDC_WAIT));
- //ClientToScreen(api_handle, &cursor_pos); //кидает курсор в другую часть экрана
+ //ClientToScreen(api_handle, &cursor_pos); //???
SetCursorPos(cursor_pos.x, cursor_pos.y);
}
@@ -891,26 +880,26 @@
}
break;
//SubMenu "Other"
- case 40101: wizard_eye = true; break; //включить око чародея
- case 40102: wizard_eye = false; break; //выключить око чародея
- case 40103: pODMRenderParams->shading_dist_mist = 0x6000; break;//новая дальность отрисовки объектов
- case 40104: pODMRenderParams->shading_dist_mist = 0x2000; break;////обычная дальность отрисовки объектов
- case 40105: change_seasons = true; break; //включить смену времён года
- case 40106: change_seasons = false; break; //выключить смену времён года
- case 40107: all_magic = true; break; //включить все заклы(нажимать в окне создания группы)
- case 40108: all_magic = false; break; //выключить все заклы
- case 40109: debug_information = true; break; //включить информацию fps, положение группы, уровень пола и т.п.
- case 40110: debug_information = false; break; //выключить информацию fps, положение группы, уровень пола и т.п.
- case 40111: show_picked_face = true; break; //включить выделение активного фейса
- case 40112: show_picked_face = false; break; //выключить выделение активного фейса
- case 40113: draw_portals_loops = true; break; //включить отрисовку рамок порталов
- case 40114: draw_portals_loops = false; break; //включить отрисовку рамок порталов
- case 40115: new_speed = true; break; //включить двойную скорость
- case 40116: new_speed = false; break; //включить двойную скорость
- case 40117: bSnow = true; break; //включить снег
- case 40118: bSnow = false; break; //включить снег
- case 40119: draw_terrain_dist_mist = true; break; //новая дальность отрисовки тайлов
- case 40120: draw_terrain_dist_mist = false; break; //обычная дальность отрисовки тайлов
+ case 40101: wizard_eye = true; break;
+ case 40102: wizard_eye = false; break;
+ case 40103: pODMRenderParams->shading_dist_mist = 0x6000; break;
+ case 40104: pODMRenderParams->shading_dist_mist = 0x2000; break;
+ case 40105: change_seasons = true; break;
+ case 40106: change_seasons = false; break;
+ case 40107: all_magic = true; break;
+ case 40108: all_magic = false; break;
+ case 40109: debug_information = true; break;
+ case 40110: debug_information = false; break;
+ case 40111: show_picked_face = true; break;
+ case 40112: show_picked_face = false; break;
+ case 40113: draw_portals_loops = true; break;
+ case 40114: draw_portals_loops = false; break;
+ case 40115: new_speed = true; break;
+ case 40116: new_speed = false; break;
+ case 40117: bSnow = true; break;
+ case 40118: bSnow = false; break;
+ case 40119: draw_terrain_dist_mist = true; break;
+ case 40120: draw_terrain_dist_mist = false; break;
}
diff -r 45dcf81c5b1c -r 90349b8048a5 Render.cpp
--- a/Render.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/Render.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -9,7 +9,7 @@
#include "Render.h"
#include "Outdoor_stuff.h"
-#include "VideoPlayer.h"
+#include "MediaPlayer.h"
#include "Sprites.h"
#include "Mouse.h"
#include "GammaControl.h"
@@ -8246,8 +8246,8 @@
v5->uParticleTrailColor = v5->uParticleTrailColorB | (v4 << 8);
}
SetUserInterface(pParty->alignment, true);
- if ( pVideoPlayer->pVideoFrame.pPixels )
- pVideoPlayer->pVideoFrame.Load(pVideoPlayer->pVideoFrameTextureFilename, 1);
+ if ( pMediaPlayer->pVideoFrame.pPixels )
+ pMediaPlayer->pVideoFrame.Load(pMediaPlayer->pVideoFrameTextureFilename, 1);
if ( sCurrentMenuID != MENU_CREATEPARTY )
{
if ( sCurrentMenuID == MENU_CREDITSPROC )
@@ -8282,8 +8282,8 @@
ShowWindow(hWnd, SW_SHOWNORMAL);
}*/
pMouse->bActive = true;
- if ( pVideoPlayer->AnyMovieLoaded() )
- pVideoPlayer->SelectMovieType();
+ if ( pMovie_Track )
+ pMediaPlayer->SelectMovieType();
if (dword_6BE364_game_settings_1 & GAME_SETTINGS_0800)
dword_6BE364_game_settings_1 &= ~GAME_SETTINGS_0800;
else
diff -r 45dcf81c5b1c -r 90349b8048a5 SaveLoad.cpp
--- a/SaveLoad.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/SaveLoad.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -26,9 +26,9 @@
#include "stru123.h"
#include "texts.h"
#include "Log.h"
-#include "VideoPlayer.h"
#include "Level/Decoration.h"
#include "Render.h"
+#include "MediaPlayer.h"
#include "mm7_data.h"
@@ -574,7 +574,7 @@
void *pSave; // [sp+170h] [bp-8h]@3
if ( pMovie_Track )
- pVideoPlayer->Unload();
+ pMediaPlayer->Unload();
pSave = malloc(1000000);
pNew_LOD->CloseWriteFile();
remove("data\\new.lod");//удалить new.lod
diff -r 45dcf81c5b1c -r 90349b8048a5 UI/UIHouses.cpp
--- a/UI/UIHouses.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/UI/UIHouses.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -25,7 +25,7 @@
#include "..\Outdoor.h"
#include "..\Outdoor_stuff.h"
#include "..\AudioPlayer.h"
-#include "..\VideoPlayer.h"
+#include "..\MediaPlayer.h"
#include "..\Monsters.h"
#include "..\Viewport.h"
#include "..\Keyboard.h"
@@ -893,7 +893,7 @@
uTextureID_right_panel_loop = uTextureID_right_panel;
if ( uNumDialogueNPCPortraits == 1 )
pDialogueNPCCount = 1;
- pVideoPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
+ pMediaPlayer->OpenHouseMovie(pAnimatedRooms[uCurrentHouse_Animation].video_name, 1u);
dword_5C35D4 = 1;
if ( (signed int)uHouseID < 139 || (signed int)uHouseID > 172 )
{
@@ -2059,7 +2059,7 @@
dialog_menu_id = HOUSE_DIALOGUE_NULL;
HouseDialogPressCloseBtn();
GetHouseGoodbyeSpeech();
- pVideoPlayer->Unload();
+ pMediaPlayer->Unload();
/*if ( pMessageQueue_50CBD0->uNumMessages )
pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
pMessageQueue_50CBD0->pMessages[0].eType = UIMSG_RentRoom;
@@ -3329,13 +3329,13 @@
{
case -1:
_4B4224_UpdateNPCTopics((int)((char *)pDialogueNPCCount - 1));
- pVideoPlayer->_4BF5B2();
+ pMediaPlayer->_4BF5B2();
break;
case HOUSE_DIALOGUE_SHOP_DISPLAY_EQUIPMENT:
case HOUSE_DIALOGUE_LEARN_SKILLS:
case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN:
- pVideoPlayer->_4BF5B2();
+ pMediaPlayer->_4BF5B2();
UI_CreateEndConversationButton();
dialog_menu_id = HOUSE_DIALOGUE_MAIN;
InitializaDialogueOptions(in_current_building_type);
@@ -3352,7 +3352,7 @@
case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RULES:
case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_VICTORY_CONDITIONS:
case HOUSE_DIALOGUE_TAVERN_ARCOMAGE_RESULT:
- pVideoPlayer->_4BF5B2();
+ pMediaPlayer->_4BF5B2();
UI_CreateEndConversationButton();
dialog_menu_id = HOUSE_DIALOGUE_TAVERN_ARCOMAGE_MAIN;
InitializaDialogueOptions_Tavern(in_current_building_type);
@@ -3380,11 +3380,11 @@
}
}
- pVideoPlayer->_4BF5B2();
+ pMediaPlayer->_4BF5B2();
break;
default:
- pVideoPlayer->_4BF5B2();
+ pMediaPlayer->_4BF5B2();
dialog_menu_id = HOUSE_DIALOGUE_MAIN;
InitializaDialogueOptions(in_current_building_type);
break;
diff -r 45dcf81c5b1c -r 90349b8048a5 UI/UITransition.cpp
--- a/UI/UITransition.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/UI/UITransition.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -8,7 +8,7 @@
#include "..\ErrorHandling.h"
#include "..\mm7_unsorted_subs.h"
#include "..\mm7_data.h"
-#include "..\VideoPlayer.h"
+#include "..\MediaPlayer.h"
#include "..\MapInfo.h"
#include "..\GUIWindow.h"
#include "..\GUIFont.h"
@@ -56,7 +56,7 @@
if (anim_id)
{
if ( !IndoorLocation::GetLocationIndex(pLocationName) )
- pVideoPlayer->OpenHouseMovie(pAnimatedRooms[p2DEvents[anim_id - 1].uAnimationID].video_name, 1);
+ pMediaPlayer->OpenHouseMovie(pAnimatedRooms[p2DEvents[anim_id - 1].uAnimationID].video_name, 1);
}
else if ( !IndoorLocation::GetLocationIndex(pLocationName) )
{
diff -r 45dcf81c5b1c -r 90349b8048a5 VideoPlayer.cpp
--- a/VideoPlayer.cpp Thu Jul 24 12:50:24 2014 +0600
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,543 +0,0 @@
-#define _CRTDBG_MAP_ALLOC
-#include
-#include
-
-#define _CRT_SECURE_NO_WARNINGS
-
-#include "mm7_unsorted_subs.h"
-#include "Bink_Smacker.h"
-
-#include "mm7_data.h"
-#include "CShow.h"
-#include "Mouse.h"
-
-#include "VideoPlayer.h"
-#include "MediaPlayer.h"
-#include "AudioPlayer.h"
-#include "Game.h"
-#include "Render.h"
-#include "Party.h"
-#include "GUIWindow.h"
-#include "Timer.h"
-#include "Log.h"
-#include "texts.h"
-#include "UI\UIHouses.h"
-
-VideoPlayer *pVideoPlayer = nullptr;
-
- #pragma comment(lib, "Version.lib")
-bool GetDllVersion(const wchar_t *pDllName, uint *pMajor, uint *pMinor)
-{
- uint uVersionSize = GetFileVersionInfoSizeW(pDllName, nullptr);
- void *pVersionData = HeapAlloc(GetProcessHeap(), 0, uVersionSize);
- {
- GetFileVersionInfoW(pDllName, 0, uVersionSize, pVersionData);
-
- VS_FIXEDFILEINFO *pInfo = nullptr;
- UINT uInfoSize = 0;
- VerQueryValueW(pVersionData, L"\\", (void **)&pInfo, &uInfoSize);
-
- if (!pMajor || !pMinor)
- {
- HeapFree(GetProcessHeap(), 0, pVersionData);
- return false;
- }
- *pMajor = pInfo->dwFileVersionMS;
- *pMinor = pInfo->dwFileVersionLS;
- }
- HeapFree(GetProcessHeap(), 0, pVersionData);
- return true;
-}
-
-//----- (004BF794) --------------------------------------------------------
-void ShowMM7IntroVideo_and_LoadingScreen()
-{
- RGBTexture tex; // [sp+Ch] [bp-30h]@1
- unsigned int uTrackStartMS; // [sp+34h] [bp-8h]@8
- unsigned int uTrackEndMS; // [sp+38h] [bp-4h]@8
-
- pVideoPlayer->bStopBeforeSchedule = false;
- pVideoPlayer->pResetflag = 0;
- bGameoverLoop = true;
- if (!bNoVideo)
- {
- pRenderer->PresentBlackScreen();
- if ( !pVideoPlayer->bStopBeforeSchedule )
- PlayFullscreenMovie(MOVIE_Intro, true);
- }
-// char pContainerName[64];
-
- tex.Load("mm6title.pcx", 2);
- pRenderer->BeginScene();
- pRenderer->DrawTextureRGB(0, 0, &tex);
- free(tex.pPixels);
- tex.pPixels = 0;
-
- //LoadFonts_and_DrawCopyrightWindow();
- DrawMM7CopyrightWindow();
-
- pRenderer->EndScene();
- pRenderer->Present();
-
- #ifndef _DEBUG
- Sleep(1500); // let the copyright window stay for a while
- #endif
-
- if (!bNoSound && pAudioPlayer->hAILRedbook )
- {
- pAudioPlayer->SetMusicVolume((signed __int64)(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0));
- AIL_redbook_stop(pAudioPlayer->hAILRedbook);
- AIL_redbook_track_info(pAudioPlayer->hAILRedbook, 14, &uTrackStartMS, &uTrackEndMS);
- AIL_redbook_play(pAudioPlayer->hAILRedbook, uTrackStartMS + 1, uTrackEndMS);
- }
- bGameoverLoop = false;
-}
-
-//----- (004BE70E) --------------------------------------------------------
-void VideoPlayer::MovieLoop(const char *pMovieName, int a2/*, int ScreenSizeFlag, int a4*/)
-{
- int v4; // ebp@1
- MSG Msg; // [sp+Ch] [bp-1Ch]@12
-
- v4 = a2;
- if ( dword_6BE364_game_settings_1 & (GAME_SETTINGS_NO_HOUSE_ANIM | GAME_SETTINGS_NO_INTRO) ||
- bNoVideo)
- return;
-
- if ( a2 == 2 )
- v4 = 0;
- ShowCursor(0);//Убрать курсор
- OpenGlobalMovie(pMovieName, 0);
- bPlayingMovie = 1;
- field_44 = v4;
- pRenderer->ClearTarget(0);
- pCurrentScreen = SCREEN_VIDEO;
-
- auto hwnd = pVideoPlayer->window->GetApiHandle();
-
- RECT rc_client;
- GetClientRect(hwnd, &rc_client);
- int client_width = rc_client.right - rc_client.left,
- client_height = rc_client.bottom - rc_client.top;
-
- HDC dc = GetDC(hwnd);
- HDC back_dc = CreateCompatibleDC(dc);
- HBITMAP back_bmp = CreateCompatibleBitmap(dc, client_width, client_height);
- auto frame_buffer = new char[client_width * client_height * 4];
- SelectObject(back_dc, back_bmp);
-
- DWORD t = GetTickCount();//текущее время от запуска ОС
-
- end_current_file = false;//установить флаг конца видеоролика
-
- while (true) //Цикл воспроизведения видеоролика
- {
- if (pVideoPlayer->bStopBeforeSchedule)
- break;
- while (PeekMessageA(&Msg, hwnd, 0, 0, PM_REMOVE))
- {
- if (Msg.message == WM_QUIT)
- Game_DeinitializeAndTerminate(0);
- if (Msg.message == WM_PAINT)
- break;
- TranslateMessage(&Msg);
- DispatchMessageA(&Msg);
- }
-
- double dt = (GetTickCount() - t) / 1000.0; //изменение времени
- t = GetTickCount();
-
- pMovie_Track->GetNextFrame(dt, frame_buffer); //получить следующий кадр
-
- if (end_current_file)//достигнут ли конец видео?
- break;
-
- if (frame_buffer)
- {
- // draw to hwnd
- BITMAPINFO bmi;
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi.bmiHeader.biWidth = client_width;
- bmi.bmiHeader.biHeight = -client_height;
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biBitCount = 32;
- bmi.bmiHeader.biCompression = BI_RGB;
- bmi.bmiHeader.biSizeImage = 0;
- bmi.bmiHeader.biXPelsPerMeter = 0;
- bmi.bmiHeader.biYPelsPerMeter = 0;
- bmi.bmiHeader.biClrUsed = 0;
- bmi.bmiHeader.biClrImportant = 0;
- GetDIBits(back_dc, back_bmp, 0, client_height, 0, &bmi, DIB_RGB_COLORS);
- SetDIBits(back_dc, back_bmp, 0, client_height, frame_buffer, &bmi, DIB_RGB_COLORS);
- BitBlt(dc, 0, 0, client_width, client_height, back_dc, 0, 0, SRCCOPY);
- }
-
- GUI_MainMenuMessageProc(); //после отрисовки, т.к. иначе вылетает dt = 0.03, image - ???
-
- if (pVideoPlayer->bStopBeforeSchedule == 1)//остановка видео
- Sleep(1000); //пауза после видеоролика
- }
- delete [] frame_buffer;
- DeleteObject(back_bmp);
- DeleteObject(back_dc);
- ReleaseDC(hwnd, dc);
-
- pVideoPlayer->Unload();
-
- //if (a4 == 1)
- pCurrentScreen = SCREEN_GAME;
-
- pVideoPlayer->bPlayingMovie = 0;
-
- ShowCursor(1);//вернуть курсор
-
- /*if ( pCurrentScreen == SCREEN_VIDEO )
- pCurrentScreen = SCREEN_GAME;*/
-}
-
-//----- (004BE9D8) --------------------------------------------------------
-void VideoPlayer::Initialize(OSWindow *target_window)
-{
- DWORD NumberOfBytesRead; // [sp+10h] [bp-4h]@9
-
- window = target_window;
-
- uint uBinkVersionMajor = -1,
- uBinkVersionMinor = -1;
- GetDllVersion(L"BINKW32.DLL", &uBinkVersionMajor, &uBinkVersionMinor);
- uBinkVersion = (unsigned __int64)uBinkVersionMajor << 32 | uBinkVersionMinor;
-
- strcpy(pTmpBuf.data(), "anims\\might7.vid");
- hMightVid = CreateFileW(L"anims\\might7.vid", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0x8000080, 0);
- if ( hMightVid == INVALID_HANDLE_VALUE )
- {
- sprintf(pTmpBuf2.data(), "Can't open file - anims\\%s.smk", pTmpBuf.data());
- MessageBoxA(0, pTmpBuf2.data(), "Video File Error", 0);
- return;
- }
- strcpy(pTmpBuf.data(), "anims\\magic7.vid");
- hMagicVid = CreateFileW(L"anims\\magic7.vid", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0x8000080, 0);
- if ( hMagicVid == INVALID_HANDLE_VALUE )
- {
- if ( !bCanLoadFromCD )
- {
- sprintf(pTmpBuf2.data(), "Can't open file - anims\\%s.smk", pTmpBuf.data());
- MessageBoxA(0, pTmpBuf2.data(), "Video File Error", 0);
- return;
- }
- sprintf(pTmpBuf2.data(), "%c:\\%s", (unsigned __int8)cMM7GameCDDriveLetter, pTmpBuf.data());
- hMagicVid = CreateFileA(pTmpBuf2.data(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0x8000080, 0);
- if ( hMagicVid == (HANDLE)INVALID_HANDLE_VALUE )
- {
- sprintf(pTmpBuf2.data(), "Can't open file - %s", pTmpBuf.data());
- MessageBoxA(0, pTmpBuf2.data(), "Video File Error", 0);
- return;
- }
- }
- ReadFile(hMightVid, &uNumMightVideoHeaders, 4, &NumberOfBytesRead, 0);
- ReadFile(hMagicVid, &uNumMagicVideoHeaders, 4, &NumberOfBytesRead, 0);
- pMightVideoHeaders = (MovieHeader *)malloc(sizeof(MovieHeader) * uNumMightVideoHeaders + 2);
- pMagicVideoHeaders = (MovieHeader *)malloc(sizeof(MovieHeader) * uNumMagicVideoHeaders + 2);
- ReadFile(hMightVid, pMightVideoHeaders, 44 * uNumMightVideoHeaders, &NumberOfBytesRead, 0);
- ReadFile(hMagicVid, pMagicVideoHeaders, 44 * uNumMagicVideoHeaders, &NumberOfBytesRead, 0);
-}
-
-//----- (004BEBD7) --------------------------------------------------------
-void VideoPlayer::Unload()
-{
- if ( pSmackMovieBlit )
- {
- SmackBlitClose(pSmackMovieBlit);
- pSmackMovieBlit = 0;
- }
- bBufferLoaded = 0;
- uMovieFormat = 0;
- uMovieFormatSwapped = 0;
- memset(pCurrentMovieName, 0, 0x40);
- if ( pAudioPlayer->hAILRedbook && !bGameoverLoop )
- AIL_redbook_resume(pAudioPlayer->hAILRedbook);
- pEventTimer->Resume();
-
- pMovie_Track->Release();
- delete pMovie_Track;
- pMovie_Track = nullptr;
-}
-
-void VideoPlayer::_inlined_in_463149()
-{
- if (pMovie_Track && !bNoVideo)
- {
- pRenderer->BeginScene();
- pMouse->DrawCursorToTarget();
- UpdatePalette();
- pMouse->ReadCursorWithItem();
- pRenderer->EndScene();
- }
-}
-
-void VideoPlayer::UpdatePalette() //UpdateVideo
-{
- Log::Warning(L"smacker");
- loop_current_file = true;//зацикленный ролик
- pRenderer->BeginScene();
- if (end_current_file)//видео завершено/перезагрузка
- {
- unsigned int width = game_viewport_width;
- unsigned int height = game_viewport_height;
- MovieRelease();
-
- SetFilePointer(hVidFile, uOffset, nullptr, FILE_BEGIN);
- pMovie_Track = nullptr;
- Log::Warning(L"reload pMovie_Track");
- pMovie_Track = pMediaPlayer->LoadMovieFromLOD(hVidFile, &readFunction, &seekFunction, width, height);
- end_current_file = false;
- }
- //else
- //{
- double dt = (GetTickCount() - time_video_begin) / 1000.0;
- //dt = 1.0/15.0;
- time_video_begin = GetTickCount();
-
- //log("dt=%.5f\n", dt);
-
- auto image = new char[current_movie_width * current_movie_height * 4];
-
- pMovie_Track->GetNextFrame(dt, image);
-
- int image_array[460 * 344];//game_viewport_width * game_viewport_height
- if (image)
- {
- memcpy(image_array, image, sizeof (image_array));
- for (unsigned int y = 8; y < 8 + game_viewport_height; ++y)//координаты местоположения видеоролика
- {
- for (unsigned int x = 8; x < 8 + game_viewport_width; ++x)
- {
- auto p = (unsigned __int32 *)pRenderer->pTargetSurface + x + y * pRenderer->uTargetSurfacePitch;
- *p = image_array[((x - 8) + ((y - 8)*game_viewport_width))];
- }
- }
- delete[] image;
- }
- //}
- pRenderer->EndScene();
-}
-
-//----- (004BF28F) --------------------------------------------------------
-void VideoPlayer::OpenHouseMovie(const char *pMovieName, unsigned int a3_1)
-{
- if (!this->bBufferLoaded)
- {
- //Prepare();
- pEventTimer->Pause();
- if (pAudioPlayer->hAILRedbook)
- AIL_redbook_pause(pAudioPlayer->hAILRedbook);
-
- bStopBeforeSchedule = false;
- bBufferLoaded = 1;
- bPlayingMovie = false;
- bFirstFrame = false;
- bUsingSmackerMMX = SmackUseMMX(1);
-
- this->bLoopPlaying = a3_1;
- if ( LOBYTE(this->field_104) == 1 )
- {
- MessageBoxA(nullptr, "Unsupported Bink playback!", "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Video.cpp:925", 0);
- return;
- }
-
- LoadMovie(pMovieName);
- time_video_begin = GetTickCount();
- }
-}
-
-//----- (004BF3F9) --------------------------------------------------------
-bool VideoPlayer::AnyMovieLoaded()
-{
- return pMovie_Track != 0;
- /*if (pMovie_Track)
- return pMovie_Track;// pSmackerMovie || pBinkMovie;
- else
- return false;*/
-}
-
-//----- (004BF411) --------------------------------------------------------
-void VideoPlayer::OpenGlobalMovie(const char *pFilename, unsigned int bLoop/*, int ScreenSizeFlag*/)
-{
-// unsigned int v10; // eax@11
-
- if (!this->bBufferLoaded)
- {
- pEventTimer->Pause();
- if (pAudioPlayer->hAILRedbook)
- AIL_redbook_pause(pAudioPlayer->hAILRedbook);
-
- bStopBeforeSchedule = false;
- bBufferLoaded = 1;
- bPlayingMovie = false;
- bFirstFrame = false;
- bUsingSmackerMMX = SmackUseMMX(1);
- this->bLoopPlaying = bLoop;
- LoadMovie(pFilename);
- return;
- }
-}
-
- //----- (004BF5B2) --------------------------------------------------------
-void VideoPlayer::_4BF5B2()
-{
- //__debugbreak();
-
- /*if ( this->uMovieFormat == 2 )
- {
- BinkGoto(pBinkMovie, 1, 0);
- BinkDoFrame(pBinkMovie);
- BinkNextFrame(pBinkMovie);
- }
- else
- {
- if ( this->uMovieFormat != 1 )
- return;
- SmackGoto(pSmackerMovie, 1);
- if ( pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion != 4 )
- {
- SmackDoFrame(pSmackerMovie);
- SmackNextFrame(pSmackerMovie);
- }
- }*/
- pMouse->_469E24();
- if ( window_SpeakInHouse && window_SpeakInHouse->ptr_1C == (void *)165 && !pMovie_Track)//!this->pSmackerMovie )
- {
- bGameoverLoop = true;
- HouseDialogPressCloseBtn();
- window_SpeakInHouse->Release();
- pParty->uFlags &= 0xFFFFFFFD;
- if ( EnterHouse(HOUSE_BODY_GUILD_ERATHIA) )
- {
- pAudioPlayer->PlaySound(SOUND_Invalid, 0, 0, -1, 0, 0, 0, 0);
- window_SpeakInHouse = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_HouseInterior, 165, 0);
- window_SpeakInHouse->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 1, 0x31, "", 0);
- window_SpeakInHouse->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 2, 0x32, "", 0);
- window_SpeakInHouse->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 3, 0x33, "", 0);
- window_SpeakInHouse->CreateButton(0x197u, 0x1A8u, 0x1Fu, 0, 2, 94, UIMSG_SelectCharacter, 4, 0x34, "", 0);
- }
- bGameoverLoop = 0;
- }
-}
-
-//----- (004BF73A) --------------------------------------------------------
-void VideoPlayer::SelectMovieType()
-{
- char Source[32]; // [sp+Ch] [bp-40h]@1
-
- strcpy(Source, this->pCurrentMovieName);
- Unload();
- if ( this->uMovieFormatSwapped == 1 )
- OpenHouseMovie(Source, LOBYTE(this->bLoopPlaying));
- else if ( this->uMovieFormatSwapped == 2 )
- OpenGlobalMovie(Source, LOBYTE(this->bLoopPlaying));
- else
- __debugbreak();
-}
-
-//----- (004BF8F6) --------------------------------------------------------
-void VideoPlayer::PlayDeathMovie()
-{
- bStopBeforeSchedule = 0;
- pResetflag = 0;
- PlayFullscreenMovie(MOVIE_Death, true);
- //pGame->pCShow->PlayMovie(MOVIE_Death, 1);
-}
-
-//----- (004BE6F5) --------------------------------------------------------
-VideoPlayer::VideoPlayer() :
-bBufferLoaded(0),
- //pBinkMovie(nullptr), pBinkBuffer(nullptr),
- //pSmackerMovie(nullptr), pSmackerBuffer(nullptr),
- pSmackMovieBlit(nullptr)
-{
- //RGBTexture::RGBTexture(&pVideoPlayer->pVideoFrame);
- bStopBeforeSchedule = false;
- pResetflag = 0;
- pMediaPlayer = new Media::MPlayer;//создаётся плеер
- Log::Warning(L"allocation dynamic memory for pMediaPlayer\n");
- pMovie_Track = nullptr;
- //pBinkMovie = nullptr;
-}
-
-int VideoPlayer::readFunction(void* opaque, uint8_t* buf, int buf_size)
-{
- HANDLE stream = (HANDLE)opaque;
- //int numBytes = stream->read((char*)buf, buf_size);
- int numBytes;
- ReadFile(stream, (char *)buf, buf_size, (LPDWORD)&numBytes, NULL);
- return numBytes;
-}
-
-int64_t VideoPlayer::seekFunction(void* opaque, int64_t offset, int whence)
-{
- if (whence == AVSEEK_SIZE)
- return pVideoPlayer->uSize;
- HANDLE h = (HANDLE)opaque;
- LARGE_INTEGER li;
- li.QuadPart = offset;
-
- if (!SetFilePointerEx(h, li, (PLARGE_INTEGER)&li, FILE_BEGIN))
- return -1;
- return li.QuadPart;
-}
-
-void VideoPlayer::LoadMovie(const char *pFilename)
-{
- char pVideoNameBik[120]; // [sp+Ch] [bp-28h]@2
- char pVideoNameSmk[120]; // [sp+Ch] [bp-28h]@2
-
- sprintf(pVideoNameBik, "%s.bik", pFilename);
- sprintf(pVideoNameSmk, "%s.smk", pFilename);
- for (uint i = 0; i < uNumMightVideoHeaders; ++i)
- {
- if (!_stricmp(pVideoNameSmk, pMightVideoHeaders[i].pVideoName))
- {
- hVidFile = hMightVid;
- uOffset = pMightVideoHeaders[i].uFileOffset;
- uSize = pMightVideoHeaders[i + 1].uFileOffset - uOffset;
- this->uMovieFormat = 1;
- this->uMovieFormatSwapped = 2;
- }
- }
- for (uint i = 0; i < uNumMagicVideoHeaders; ++i)
- {
- if (!_stricmp(pVideoNameBik, pMagicVideoHeaders[i].pVideoName))
- {
- hVidFile = hMagicVid;
- uOffset = pMagicVideoHeaders[i].uFileOffset;
- uSize = pMagicVideoHeaders[i + 1].uFileOffset - uOffset;
- this->uMovieFormat = 2;
- this->uMovieFormatSwapped = 1;
- }
- if (!_stricmp(pVideoNameSmk, pMagicVideoHeaders[i].pVideoName))
- {
- hVidFile = hMagicVid;
- uOffset = pMagicVideoHeaders[i].uFileOffset;
- uSize = pMagicVideoHeaders[i + 1].uFileOffset - uOffset;
- this->uMovieFormat = 1;
- this->uMovieFormatSwapped = 2;
- }
- }
- if (!hVidFile)
- {
- Unload();
- MessageBoxA(0, "VideoPlayer error", "VideoPlayer Error", 0);
- return;
- }
-
- SetFilePointer(hVidFile, uOffset, 0, FILE_BEGIN);
- strcpy(this->pCurrentMovieName, pFilename);
-
- auto hwnd = pVideoPlayer->window->GetApiHandle();
- RECT rc_client;
- GetClientRect(hwnd, &rc_client);
- int client_width = rc_client.right - rc_client.left,
- client_height = rc_client.bottom - rc_client.top;
-
- pMovie_Track = pMediaPlayer->LoadMovieFromLOD(hVidFile, &readFunction, &seekFunction, client_width, client_height);
-}
diff -r 45dcf81c5b1c -r 90349b8048a5 VideoPlayer.h
--- a/VideoPlayer.h Thu Jul 24 12:50:24 2014 +0600
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-#pragma once
-#include "OSWindow.h"
-#include "Texture.h"
-#include "MediaPlayer.h"
-
-#pragma pack(push, 1)
-
-#pragma pack(pop)
-
-#pragma pack(push, 1)
-#pragma pack(pop)
-
-void ShowMM7IntroVideo_and_LoadingScreen();
-
-extern "C"
-{
-#include "lib/libavcodec/avcodec.h"
-#include "lib/libavformat/avformat.h"
-#include "lib/libavutil/avutil.h"
-#include "lib/libavutil/imgutils.h"
-#include "lib/libswscale/swscale.h"
-#include "lib/libswresample/swresample.h"
-#include "lib/libavutil/opt.h"
-}
-#pragma comment(lib, "avcodec.lib")
-#pragma comment(lib, "avformat.lib")
-#pragma comment(lib, "avutil.lib")
-#pragma comment(lib, "swscale.lib")
-#pragma comment(lib, "swresample.lib")
-
-#include "lib/OpenAL/al.h"
-#include "lib/OpenAL/alc.h"
-#pragma comment(lib, "OpenAL32.lib")
-
-#pragma pack(push, 1)
-struct VideoPlayer
-{
- VideoPlayer();
- //----- (004BECBD) --------------------------------------------------------
- virtual ~VideoPlayer()
- {
- bStopBeforeSchedule = false;
- pResetflag = 0;
- pVideoFrame.Release();
- }
-
- void Initialize(OSWindow *window);
- void Unload();
-
- void OpenHouseMovie(const char *pMovieName, unsigned int a3_1);//0x4BF28F
- void PlayDeathMovie();
- bool AnyMovieLoaded();
- void OpenGlobalMovie(const char *pFilename, unsigned int bLoop);
- void _4BF5B2();
- void SelectMovieType();//0x4BF73A
- void _inlined_in_463149();
-
- void MovieLoop(const char *pMovieName, int a2);
- void UpdatePalette();
- void LoadMovie(const char *);
-
- RGBTexture pVideoFrame;
- int field_34;
-
- int pResetflag;
- int field_44;
-
- int uBinkDirectDrawSurfaceType;
- int bBufferLoaded;
- unsigned int bPlayingMovie;
- unsigned int bFirstFrame;
- unsigned int bUsingSmackerMMX;
- unsigned int bLoopPlaying;
- int field_68;
- unsigned int bStopBeforeSchedule;
- OSWindow *window;
- struct _SMACKBLIT *pSmackMovieBlit;
-
- char field_88[20];
- unsigned int uMovieFormat;
- int uMovieFormatSwapped;
- char pCurrentMovieName[64];
- char pVideoFrameTextureFilename[32];
- int field_104;
-
- HANDLE hVidFile;
- int uSize;
- int uOffset;
-
- protected:
- static int readFunction(void *, uint8_t *, int);
- static int64_t seekFunction(void *, int64_t, int);
-};
-#pragma pack(pop)
-
-extern VideoPlayer *pVideoPlayer;
-extern LRESULT __stdcall wWinProc(HWND hwnd, unsigned int msg, WPARAM wparam, LPARAM lparam);
\ No newline at end of file
diff -r 45dcf81c5b1c -r 90349b8048a5 _deleted.cpp
--- a/_deleted.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/_deleted.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -14644,4 +14644,15 @@
goto LABEL_154;
}
}
+//----- (004BF3F9) --------------------------------------------------------
+bool MPlayer::AnyMovieLoaded()
+{
+ return pMovie_Track != 0;
+}
+//----- (004BF8F6) --------------------------------------------------------
+void MPlayer::PlayDeathMovie()
+{
+ bStopBeforeSchedule = 0;
+ PlayFullscreenMovie(MOVIE_Death, true);
+}
*/
\ No newline at end of file
diff -r 45dcf81c5b1c -r 90349b8048a5 mm7_2.cpp
--- a/mm7_2.cpp Thu Jul 24 12:50:24 2014 +0600
+++ b/mm7_2.cpp Fri Jul 25 14:17:57 2014 +0600
@@ -158,13 +158,13 @@
dword_6BE364_game_settings_1 &= ~GAME_SETTINGS_4000;
bGameoverLoop = 1;
- pVideoPlayer->bStopBeforeSchedule = 0;
+ pMediaPlayer->bStopBeforeSchedule = 0;
pAudioPlayer->StopChannels(-1, -1);
pRenderer->BeginScene();
pRenderer->ClearBlack();
pRenderer->EndScene();
pRenderer->Present();
- pVideoPlayer->pResetflag = 0;
+ //pMediaPlayer->pResetflag = 0;
_449B57_test_bit(pParty->_quest_bits, 99);
_this.Load("winbg.pcx", 2);
pRenderer->BeginScene();
@@ -216,9 +216,9 @@
if ( v17 != 1 )
v7 = pGlobalTXT_LocalizationStrings[57];
- v8 = pGlobalTXT_LocalizationStrings[146];//Month, Месяц
+ v8 = pGlobalTXT_LocalizationStrings[146];//Month
if ( v18 != 1 )
- v8 = pGlobalTXT_LocalizationStrings[148];//Months,Месяцев
+ v8 = pGlobalTXT_LocalizationStrings[148];//Months
v9 = pGlobalTXT_LocalizationStrings[245];
if ( v14 != 1 )
@@ -911,18 +911,15 @@
{
GUIButton *pButton; // eax@27
unsigned int pControlParam; // ecx@35
-// int v10; // ecx@36
-// int v11; // ecx@37
unsigned int pY; // [sp-18h] [bp-54h]@39
Texture *pTexture; // [sp-14h] [bp-50h]@39
-// GUIButton *pButton2; // [sp+0h] [bp-3Ch]@27
GUIWindow *pWindow; // [sp+4h] [bp-38h]@11
pCurrentScreen = SCREEN_GAME;
pGUIWindow2 = 0;
- pAudioPlayer->StopChannels(-1, -1);//остановить/подготовить канал
- pMouse->RemoveHoldingItem();//избавить курсор от вещи
+ pAudioPlayer->StopChannels(-1, -1);
+ pMouse->RemoveHoldingItem();
pIcons_LOD->_inlined_sub2();
@@ -1003,7 +1000,7 @@
&& pWindow == pWindow_MainMenu )
{
pControlParam = pButton->msg_param;
- switch (pControlParam) // подсветка кнопок
+ switch (pControlParam) // backlight for buttons
{
case 0:
pTexture = pNew;
@@ -1022,7 +1019,7 @@
pY = 337;
break;
}
- pRenderer->DrawTextureIndexed(495, pY, pTexture); //подсветка кнопок
+ pRenderer->DrawTextureIndexed(495, pY, pTexture);
}
}
}
@@ -1145,12 +1142,8 @@
//----- (00464866) --------------------------------------------------------
void DoPrepareWorld(unsigned int bLoading, int _1_fullscreen_loading_2_box)
{
- //int v2; // esi@1
char *v3; // eax@1
- //char *v4; // eax@1
unsigned int v5; // eax@3
- //size_t v6; // ecx@10
- //char *v7; // eax@11
char Str1[20]; // [sp+Ch] [bp-18h]@1
unsigned int v9; // [sp+20h] [bp-4h]@1
@@ -1207,7 +1200,6 @@
_flushall();
}
-
//----- (00464E17) --------------------------------------------------------
bool __fastcall CheckMM7CD(char c)
{
@@ -1461,7 +1453,6 @@
pKeyActionMap = new KeyboardActionMapping;
- // _CrtDumpMemoryLeaks();
OnTimer(1);
GameUI_StatusBar_UpdateTimedString(1);
pGame = Game::Create();
@@ -1724,8 +1715,8 @@
if (!bNoSound)
pAudioPlayer->Initialize();
- pVideoPlayer = new VideoPlayer();
- pVideoPlayer->Initialize(window);
+ pMediaPlayer = new Media::MPlayer();
+ pMediaPlayer->Initialize(window);
dword_6BE364_game_settings_1 |= GAME_SETTINGS_4000;
@@ -1977,8 +1968,8 @@
static_assert(sizeof(LODSprite) == 0x28, "Wrong type size");
}
-bool new_sky = false; //новое небо(требуются текстурки)
-int max_flight_height = 4000; //максимальная высота полёта
+bool new_sky = false; //new sky(need texture)
+int max_flight_height = 4000; //maximum altitude
@@ -2033,9 +2024,9 @@
uCPUSpeed = Rect.bottom;*/
uCPUSpeed = 2048; // about 2GHz
- //_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );//Ritor1: for memory test(для проверки памяти)
+ //_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );//Ritor1: for memory test
- if (!MM7_Initialize(640, 480))//задаётся размер окна
+ if (!MM7_Initialize(640, 480))
{
Log::Warning(L"MM init: failed");
pGame->Deinitialize();
@@ -2177,15 +2168,10 @@
//----- (00466082) --------------------------------------------------------
void MM6_Initialize(const wchar_t *pIniFilename)
{
- //int v0; // eax@1
- //UINT v1; // eax@18
size_t v2; // eax@31
size_t v3; // ebx@32
size_t v4; // edi@36
- //char v5[120]; // [sp+Ch] [bp-17Ch]@1
- //char String[120]; // [sp+84h] [bp-104h]@32
char pDefaultGroundTexture[16]; // [sp+FCh] [bp-8Ch]@32
- //char pIniFilename[120]; // [sp+10Ch] [bp-7Ch]@1
unsigned int v9; // [sp+184h] [bp-4h]@28
//_getcwd(v5, 120);
@@ -2246,11 +2232,7 @@
pODMRenderParams->shading_dist_shade = GetPrivateProfileIntW(L"shading", L"dist_shade", 2048, pIniFilename);
pODMRenderParams->shading_dist_shademist = GetPrivateProfileIntW(L"shading", L"dist_shademist", 4096, pIniFilename);
- //int dist = 0x2000;
-
- //if ( new_draw_object_dist )
- //dist = 0x6000;
- pODMRenderParams->shading_dist_mist = GetPrivateProfileIntW(L"shading", L"dist_mist", 0x2000, pIniFilename);//дальность отрисовки 0x2000
+ pODMRenderParams->shading_dist_mist = GetPrivateProfileIntW(L"shading", L"dist_mist", 0x2000, pIniFilename);//drawing dist 0x2000
wchar_t pDefaultSkyTextureW[1024];
GetPrivateProfileStringW(L"textures", L"sky", L"plansky1", pDefaultSkyTextureW, 0x10u, pIniFilename);
@@ -2405,103 +2387,55 @@
char *v11; // edx@20
unsigned __int16 v12; // ax@23
int v13; // eax@27
-// unsigned int v14; // ebx@33
int v16; // eax@36
-// unsigned int v17; // eax@37
__int16 v18; // di@37
signed int v19; // edx@37
-// unsigned __int8 v20; // sf@37
-// char *v21; // ecx@38
unsigned __int16 v22; // ax@41
-// unsigned int v23; // eax@46
signed int v24; // ebx@46
char *v25; // edx@47
-// int v26; // edx@54
-// int v27; // edx@55
-// int v28; // edx@56
-// int v29; // edx@57
-// unsigned __int16 v30; // ax@60
-// unsigned int v31; // ecx@60
-// int v32; // edi@60
-// unsigned int v33; // eax@65
signed int v34; // edx@65
-// char *v35; // ecx@66
unsigned __int16 v36; // ax@69
int v37; // ST14_4@72
int v38; // eax@72
int v39; // ST10_4@72
int v40; // ST0C_4@72
- //int v41; // edx@76
-// int v42; // edx@77
-// int v43; // edx@78
unsigned __int8 v44; // zf@79
-// int v45; // edx@79
-// unsigned __int16 v46; // ax@80
int v47; // eax@81
-// int v48; // edx@87
-// int v49; // edx@88
-// int v50; // edx@89
signed int v52; // ebx@93
-// char *v53; // edx@94
-// unsigned __int16 v54; // ax@98
-// unsigned int v55; // ecx@98
signed int v56; // ebx@98
-// char *v57; // edx@99
unsigned __int16 v58; // ax@102
unsigned __int16 v59; // ax@107
-// unsigned int v60; // ecx@107
signed int v61; // ebx@107
-// char *v62; // edx@108
unsigned __int16 v63; // ax@111
int v64; // ebx@114
signed int v65; // eax@114
-// unsigned int v66; // edi@123
-// unsigned __int16 v67; // ax@124
-// unsigned int v68; // ecx@124
signed int v69; // ebx@124
-// char *v70; // edx@125
unsigned __int16 v71; // ax@128
unsigned int v72; // ebx@131
int v78; // eax@133
-// char v79; // zf@139
-// unsigned int v80; // eax@140
signed int v81; // edx@140
-// char *v82; // ecx@141
unsigned __int16 v83; // ax@144
-// unsigned __int16 v84; // ax@151
-// unsigned int v85; // ecx@151
signed int v86; // ebx@151
-// char *v87; // edx@152
unsigned __int16 v88; // ax@155
unsigned int v89; // eax@158
int v90; // ST34_4@159
int v91; // eax@159
unsigned int v92; // eax@163
-// unsigned int v93; // eax@177
-// char *v94; // ecx@178
unsigned __int16 v95; // ax@181
unsigned __int16 v96; // ax@184
int v97; // eax@185
-// unsigned __int16 v98; // ax@191
char v100; // ST18_1@198
int v102; // eax@198
signed int v106; // eax@208
unsigned int v107; // edx@220
signed int v108; // ebx@225
-// unsigned int v109; // eax@234
signed int v110; // ebx@234
-// char *v111; // ecx@235
unsigned __int16 v112; // ax@238
unsigned __int16 v113; // si@241
int v114; // eax@242
int v115; // eax@245
-// unsigned __int16 v117; // ax@251
-// unsigned int v118; // ecx@251
signed int v119; // ebx@251
-// char *v120; // edx@252
unsigned __int16 v121; // ax@255
-// unsigned int v122; // eax@260
-// char *v123; // edx@261
int v124; // eax@267
int v125; // [sp-20h] [bp-4Ch]@28
char v132; // [sp-8h] [bp-34h]@131
@@ -2511,18 +2445,15 @@
int v137; // [sp+10h] [bp-1Ch]@208
signed int v138; // [sp+14h] [bp-18h]@207
signed int v139; // [sp+18h] [bp-14h]@208
-// char *v140; // [sp+1Ch] [bp-10h]@61
signed int v141; // [sp+1Ch] [bp-10h]@117
unsigned int v142; // [sp+1Ch] [bp-10h]@158
signed int v143; // [sp+1Ch] [bp-10h]@172
-// char *v144; // [sp+1Ch] [bp-10h]@192
signed int v146; // [sp+20h] [bp-Ch]@60
int v147; // [sp+20h] [bp-Ch]@72
signed int v148; // [sp+20h] [bp-Ch]@158
unsigned __int16 v150; // [sp+20h] [bp-Ch]@208
signed int v152; // [sp+24h] [bp-8h]@208
- //применение: фаерболт в храме луны
object = &pObjectList->pObjects[pSpriteObjects[uLayingItemID].uObjectDescID];
//v151 = PID_TYPE(a2);
if ( PID_TYPE(a2) == OBJECT_Actor)