Mercurial > mm7
diff Media/MediaPlayer.h @ 2502:a77c34acdbc9
Media folder
author | Ritor1 |
---|---|
date | Fri, 19 Sep 2014 05:13:32 +0600 |
parents | |
children | a902abdfc7f2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Media/MediaPlayer.h Fri Sep 19 05:13:32 2014 +0600 @@ -0,0 +1,179 @@ +#pragma once +#include "OSWindow.h" +#include "Engine/Graphics/Texture.h" +#include "Engine/ErrorHandling.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; +}; +struct SoundHeader +{ + char pSoundName[40]; + unsigned int uFileOffset; + unsigned int uCompressedSize; + unsigned int uDecompressedSize; +}; + +enum MovieType +{ + MOVIE_Invalid = 0x0, + MOVIE_3DOLogo = 0x1, + MOVIE_NWCLogo = 0x2, + MOVIE_JVC = 0x3, + MOVIE_Emerald = 0x4, + MOVIE_Intro = 0x5, + MOVIE_Death = 0x6, + MOVIE_Outro = 0x7, +}; + +namespace Media +{ + class ITrack + { + public: + virtual ~ITrack() {} + + virtual void Play(bool loop = false) = 0; + virtual void Release() = 0; + }; + + class IMovie + { + public: + virtual ~IMovie() {} + + virtual void Play() = 0; + virtual void GetNextFrame(double dt, void *target_surface) = 0; + virtual void Release() = 0; + + }; + + class MPlayer + { + public: + MPlayer(); + virtual ~MPlayer(); + + //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 OpenFullscreenMovie(const char *pFilename, unsigned int bLoop); + void OpenHouseMovie(const char *pMovieName, unsigned int a3_1); + + void LoadMovie(const char *); + void SelectMovieType(); + + inline void PlayFullscreenMovie(MovieType movie_type, bool bShowMouseAfterPlayback) + { + extern unsigned int bNoVideo; + if (bNoVideo) return; + + switch (movie_type) + { + case MOVIE_3DOLogo: FullscreenMovieLoop("3dologo", 0); break; + case MOVIE_NWCLogo: FullscreenMovieLoop("new world logo", 0); break; + case MOVIE_JVC: FullscreenMovieLoop("jvc", 0); break; + case MOVIE_Intro: FullscreenMovieLoop("Intro", 0); break; + case MOVIE_Emerald: FullscreenMovieLoop("Intro Post", 0); break; + case MOVIE_Death: FullscreenMovieLoop("losegame", 2); break; + case MOVIE_Outro: FullscreenMovieLoop("end_seq1", 20); break; + + default: + Error("Invalid movie requested: %u", movie_type); + break; + } + } + void FullscreenMovieLoop(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); + + //for audio//////////////////////////////////// + HANDLE hAudioSnd; + unsigned int uNumSoundHeaders; + struct SoundHeader *pSoundHeaders; + + void LoadAudioSnd(); + /////////////////////////////////////////////// + + + 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 int mSourceID; + +extern void PlayMovie(const wchar_t * pFilename); +extern void PlayAudio(const wchar_t * pFilename); +extern void MovieRelease();