# HG changeset patch # User a.parshin # Date 1406136508 -10800 # Node ID cb66a1082fcf2bfce8ed63125fe40a7f77ce6d6b # Parent 6d587789973035dbce6e0d181187bd10a99b3fe7 * ITrack, IMovie now properly propogate destructors * VideoPlayer correctly deallocates memory after playing a movie diff -r 6d5877899730 -r cb66a1082fcf Build/Visual Studio 2012/World of Might and Magic.vcxproj.user --- a/Build/Visual Studio 2012/World of Might and Magic.vcxproj.user Wed Jul 23 19:42:39 2014 +0300 +++ b/Build/Visual Studio 2012/World of Might and Magic.vcxproj.user Wed Jul 23 20:28:28 2014 +0300 @@ -4,6 +4,6 @@ $(OutDir)$(TargetName)$(TargetExt) $(OutDir) WindowsLocalDebugger - -nomarg -window -nointro -nologo -novideo + -nomarg -window -nointro -nologo \ No newline at end of file diff -r 6d5877899730 -r cb66a1082fcf CShow.h --- a/CShow.h Wed Jul 23 19:42:39 2014 +0300 +++ b/CShow.h Wed Jul 23 20:28:28 2014 +0300 @@ -23,13 +23,13 @@ switch (movie) { - case MOVIE_3DOLogo: pVideoPlayer->MovieLoop("3dologo", 0, 0, 1); break; - case MOVIE_NWCLogo: pVideoPlayer->MovieLoop("new world logo", 0, 1, 1); break; - case MOVIE_JVC: pVideoPlayer->MovieLoop("jvc", 0, 1, 1); break; - case MOVIE_Intro: pVideoPlayer->MovieLoop("Intro", 0, 1, 1); break; - case MOVIE_Emerald: pVideoPlayer->MovieLoop("Intro Post", 0, 1, 1); break; - case MOVIE_Death: pVideoPlayer->MovieLoop("losegame", 2, 1, 1); break; - case MOVIE_Outro: pVideoPlayer->MovieLoop("end_seq1", 20, 1, 1); break; + case MOVIE_3DOLogo: pVideoPlayer->MovieLoop("3dologo", 0, 0); break; + case MOVIE_NWCLogo: pVideoPlayer->MovieLoop("new world logo", 0, 1); break; + case MOVIE_JVC: pVideoPlayer->MovieLoop("jvc", 0, 1); break; + case MOVIE_Intro: pVideoPlayer->MovieLoop("Intro", 0, 1); break; + case MOVIE_Emerald: pVideoPlayer->MovieLoop("Intro Post", 0, 1); break; + case MOVIE_Death: pVideoPlayer->MovieLoop("losegame", 2, 1); break; + case MOVIE_Outro: pVideoPlayer->MovieLoop("end_seq1", 20, 1); break; default: Error("Invalid movie requested: %u", movie); diff -r 6d5877899730 -r cb66a1082fcf Events.cpp --- a/Events.cpp Wed Jul 23 19:42:39 2014 +0300 +++ b/Events.cpp Wed Jul 23 20:28:28 2014 +0300 @@ -465,7 +465,7 @@ v128 = pCurrentScreen; strcpy(Str, Source); v16 = RemoveQuotes(Str); - pVideoPlayer->MovieLoop(v16, 0, _evt->v5, 1); + pVideoPlayer->MovieLoop(v16, 0, _evt->v5); if ( !_stricmp(v16, "arbiter good") ) { pParty->alignment = PartyAlignment_Good; diff -r 6d5877899730 -r cb66a1082fcf MediaPlayer.cpp --- a/MediaPlayer.cpp Wed Jul 23 19:42:39 2014 +0300 +++ b/MediaPlayer.cpp Wed Jul 23 20:28:28 2014 +0300 @@ -791,8 +791,10 @@ format_ctx = nullptr; avioContext = nullptr; } + + virtual ~Movie() {} - inline void Release() + virtual void Release() { ReleaseAVCodec(); } @@ -880,7 +882,7 @@ { current_movie_width = width; current_movie_height = height; - } + } // decoding_packet = new AVPacket; av_init_packet(decoding_packet); @@ -1033,8 +1035,8 @@ AVAudioStream audio; int num_audio_frames; int num_audio_samples; - unsigned char * ioBuffer; - AVIOContext *avioContext; + unsigned char *ioBuffer; + AVIOContext *avioContext; OpenALSoundProvider::StreamingTrackBuffer *audio_data_in_device; AVVideoStream video; diff -r 6d5877899730 -r cb66a1082fcf MediaPlayer.h --- a/MediaPlayer.h Wed Jul 23 19:42:39 2014 +0300 +++ b/MediaPlayer.h Wed Jul 23 20:28:28 2014 +0300 @@ -5,14 +5,20 @@ class ITrack { public: - virtual void Play(bool loop = false) = 0; + virtual ~ITrack() {} + + virtual void Play(bool loop = false) = 0; + virtual void Release() = 0; }; class IMovie { public: - virtual void Play() = 0; - virtual void GetNextFrame(double dt, void *target_surface) = 0; + virtual ~IMovie() {} + + virtual void Play() = 0; + virtual void GetNextFrame(double dt, void *target_surface) = 0; + virtual void Release() = 0; }; class MPlayer diff -r 6d5877899730 -r cb66a1082fcf VideoPlayer.cpp --- a/VideoPlayer.cpp Wed Jul 23 19:42:39 2014 +0300 +++ b/VideoPlayer.cpp Wed Jul 23 20:28:28 2014 +0300 @@ -94,14 +94,16 @@ } //----- (004BE70E) -------------------------------------------------------- -void VideoPlayer::MovieLoop(const char *pMovieName, int a2, int ScreenSizeFlag, int a4) +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)) ) - { + if ( dword_6BE364_game_settings_1 & (GAME_SETTINGS_NO_HOUSE_ANIM | GAME_SETTINGS_NO_INTRO) || + bNoVideo) + return; + if ( a2 == 2 ) v4 = 0; ShowCursor(0);//Убрать курсор @@ -112,6 +114,7 @@ pCurrentScreen = SCREEN_VIDEO; auto hwnd = pVideoPlayer->window->GetApiHandle(); + RECT rc_client; GetClientRect(hwnd, &rc_client); int client_width = rc_client.right - rc_client.left, @@ -120,6 +123,7 @@ 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();//текущее время от запуска ОС @@ -128,32 +132,27 @@ while (true) //Цикл воспроизведения видеоролика { - if ( pVideoPlayer->bStopBeforeSchedule ) + if (pVideoPlayer->bStopBeforeSchedule) break; while (PeekMessageA(&Msg, hwnd, 0, 0, PM_REMOVE)) { - if (Msg.message == 18) + if (Msg.message == WM_QUIT) Game_DeinitializeAndTerminate(0); - if (Msg.message == 15) + if (Msg.message == WM_PAINT) break; TranslateMessage(&Msg); DispatchMessageA(&Msg); } double dt = (GetTickCount() - t) / 1000.0; //изменение времени - //dt = 1.0/15.0; t = GetTickCount(); - //log("dt=%.5f\n", dt); - - auto image = new char[client_width * client_height * 4]; - - pMovie_Track->GetNextFrame(dt, image); //получить следующий кадр + pMovie_Track->GetNextFrame(dt, frame_buffer); //получить следующий кадр if (end_current_file)//достигнут ли конец видео? break; - if (image) + if (frame_buffer) { // draw to hwnd BITMAPINFO bmi; @@ -169,32 +168,31 @@ 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, image, &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); - } - delete[] image;//удалить кадр - 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) + //if (a4 == 1) pCurrentScreen = SCREEN_GAME; pVideoPlayer->bPlayingMovie = 0; ShowCursor(1);//вернуть курсор - if ( pCurrentScreen == SCREEN_VIDEO ) - pCurrentScreen = SCREEN_GAME; - } + /*if ( pCurrentScreen == SCREEN_VIDEO ) + pCurrentScreen = SCREEN_GAME;*/ } //----- (004BE9D8) -------------------------------------------------------- @@ -260,8 +258,8 @@ AIL_redbook_resume(pAudioPlayer->hAILRedbook); pEventTimer->Resume(); + pMovie_Track->Release(); delete pMovie_Track; - Log::Warning(L"delete dynamic memory for pMovie_Track\n"); pMovie_Track = nullptr; } @@ -487,7 +485,7 @@ return li.QuadPart; } -void VideoPlayer::LoadMovie(const char * pFilename) +void VideoPlayer::LoadMovie(const char *pFilename) { char pVideoNameBik[120]; // [sp+Ch] [bp-28h]@2 char pVideoNameSmk[120]; // [sp+Ch] [bp-28h]@2 @@ -540,7 +538,5 @@ 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 6d5877899730 -r cb66a1082fcf VideoPlayer.h --- a/VideoPlayer.h Wed Jul 23 19:42:39 2014 +0300 +++ b/VideoPlayer.h Wed Jul 23 20:28:28 2014 +0300 @@ -55,10 +55,8 @@ void SelectMovieType();//0x4BF73A void _inlined_in_463149(); - void MovieLoop(const char *pMovieName, int a2, int a3, int a4); + void MovieLoop(const char *pMovieName, int a2, int a3); void UpdatePalette(); - static int readFunction(void *, uint8_t *, int); - static int64_t seekFunction(void *, int64_t, int); void LoadMovie(const char *); RGBTexture pVideoFrame; @@ -88,6 +86,10 @@ 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)