mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-12-11 20:05:58 +03:00
feat(ui): introduce cross-platform solution for CSimpleMovieFrame
This commit is contained in:
parent
bd0e59a795
commit
fbaeb2e052
@ -11,6 +11,38 @@
|
|||||||
#include <tempest/Matrix.hpp>
|
#include <tempest/Matrix.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
#define XVDEC_CALL
|
||||||
|
|
||||||
|
#if defined(WHOA_SYSTEM_WIN)
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#if defined(WHOA_ARCH_32)
|
||||||
|
#undef XVDEC_CALL
|
||||||
|
#define XVDEC_CALL __cdecl
|
||||||
|
#elif defined(__GNUC__) || defined(__clang__)
|
||||||
|
#undef XVDEC_CALL
|
||||||
|
#define XVDEC_CALL __attribute__((cdecl))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define RTLD_LAZY 1
|
||||||
|
|
||||||
|
static inline void* dlopen(const char* filename, int flag) {
|
||||||
|
(void)flag;
|
||||||
|
return LoadLibraryA(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void* dlsym(void* handle, const char* symbol) {
|
||||||
|
return GetProcAddress(reinterpret_cast<HMODULE>(handle), symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int dlclose(void* handle) {
|
||||||
|
return static_cast<int>(FreeLibrary(reinterpret_cast<HMODULE>(handle)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // !defined(WHOA_SYSTEM_WIN)
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -22,26 +54,34 @@ typedef struct {
|
|||||||
int zero1;
|
int zero1;
|
||||||
} decoder_data_t;
|
} decoder_data_t;
|
||||||
|
|
||||||
typedef int(__cdecl* INITIALIZEDIVXDECODER)(unsigned int index, unsigned int width, unsigned int height);
|
typedef int (XVDEC_CALL * INITIALIZEDIVXDECODER)(unsigned int index, unsigned int width, unsigned int height);
|
||||||
typedef int(__cdecl* SETOUTPUTFORMAT)(unsigned int index, unsigned int one, unsigned int width, unsigned int height);
|
typedef int (XVDEC_CALL * SETOUTPUTFORMAT)(unsigned int index, unsigned int one, unsigned int width, unsigned int height);
|
||||||
typedef int(__cdecl* DIVXDECODE)(unsigned int index, void* data, unsigned int zero);
|
typedef int (XVDEC_CALL * DIVXDECODE)(unsigned int index, void* data, unsigned int zero);
|
||||||
typedef int(__cdecl* UNINITIALIZEDIVXDECODER)(unsigned int index);
|
typedef int (XVDEC_CALL * UNINITIALIZEDIVXDECODER)(unsigned int index);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void* s_decoderLibrary = nullptr;
|
||||||
|
|
||||||
static INITIALIZEDIVXDECODER InitializeDivxDecoder = nullptr;
|
static INITIALIZEDIVXDECODER InitializeDivxDecoder = nullptr;
|
||||||
static SETOUTPUTFORMAT SetOutputFormat = nullptr;
|
static SETOUTPUTFORMAT SetOutputFormat = nullptr;
|
||||||
static DIVXDECODE DivxDecode = nullptr;
|
static DIVXDECODE DivxDecode = nullptr;
|
||||||
static UNINITIALIZEDIVXDECODER UnInitializeDivxDecoder = nullptr;
|
static UNINITIALIZEDIVXDECODER UnInitializeDivxDecoder = nullptr;
|
||||||
|
|
||||||
#if defined(WHOA_SYSTEM_WIN)
|
|
||||||
|
|
||||||
#include <windows.h>
|
static const char* s_decoderNames[] = {
|
||||||
|
"DivxDecoder.dll",
|
||||||
|
"XvidDecoder.dll",
|
||||||
|
"libXvidDecoder.dylib",
|
||||||
|
"XvidDecoder.dylib",
|
||||||
|
"libXvidDecoder.so",
|
||||||
|
"XvidDecoder.so",
|
||||||
|
nullptr
|
||||||
|
};
|
||||||
|
|
||||||
static HMODULE s_decoderLibrary = NULL;
|
|
||||||
|
|
||||||
static int32_t UnloadDivxDecoder() {
|
static int32_t UnloadDivxDecoder() {
|
||||||
if (s_decoderLibrary == NULL) {
|
if (!s_decoderLibrary) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,8 +90,8 @@ static int32_t UnloadDivxDecoder() {
|
|||||||
DivxDecode = nullptr;
|
DivxDecode = nullptr;
|
||||||
UnInitializeDivxDecoder = nullptr;
|
UnInitializeDivxDecoder = nullptr;
|
||||||
|
|
||||||
FreeLibrary(s_decoderLibrary);
|
dlclose(s_decoderLibrary);
|
||||||
s_decoderLibrary = NULL;
|
s_decoderLibrary = nullptr;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -61,20 +101,20 @@ static int32_t LoadDivxDecoder() {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to load original decoder first
|
const char** decoderName = s_decoderNames;
|
||||||
s_decoderLibrary = LoadLibraryA("DivxDecoder.dll");
|
while (!s_decoderLibrary && *decoderName) {
|
||||||
if (s_decoderLibrary == NULL) {
|
s_decoderLibrary = dlopen(*decoderName, RTLD_LAZY);
|
||||||
// Try to load open source decoder
|
++decoderName;
|
||||||
s_decoderLibrary = LoadLibraryA("XvidDecoder.dll");
|
|
||||||
if (s_decoderLibrary == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InitializeDivxDecoder = reinterpret_cast<INITIALIZEDIVXDECODER>(GetProcAddress(s_decoderLibrary, "InitializeDivxDecoder"));
|
if (!s_decoderLibrary) {
|
||||||
SetOutputFormat = reinterpret_cast<SETOUTPUTFORMAT>(GetProcAddress(s_decoderLibrary, "SetOutputFormat"));
|
return 0;
|
||||||
DivxDecode = reinterpret_cast<DIVXDECODE>(GetProcAddress(s_decoderLibrary, "DivxDecode"));
|
}
|
||||||
UnInitializeDivxDecoder = reinterpret_cast<UNINITIALIZEDIVXDECODER>(GetProcAddress(s_decoderLibrary, "UnInitializeDivxDecoder"));
|
|
||||||
|
InitializeDivxDecoder = reinterpret_cast<INITIALIZEDIVXDECODER>(dlsym(s_decoderLibrary, "InitializeDivxDecoder"));
|
||||||
|
SetOutputFormat = reinterpret_cast<SETOUTPUTFORMAT>(dlsym(s_decoderLibrary, "SetOutputFormat"));
|
||||||
|
DivxDecode = reinterpret_cast<DIVXDECODE>(dlsym(s_decoderLibrary, "DivxDecode"));
|
||||||
|
UnInitializeDivxDecoder = reinterpret_cast<UNINITIALIZEDIVXDECODER>(dlsym(s_decoderLibrary, "UnInitializeDivxDecoder"));
|
||||||
|
|
||||||
if (!InitializeDivxDecoder || !SetOutputFormat || !DivxDecode || !UnInitializeDivxDecoder) {
|
if (!InitializeDivxDecoder || !SetOutputFormat || !DivxDecode || !UnInitializeDivxDecoder) {
|
||||||
UnloadDivxDecoder();
|
UnloadDivxDecoder();
|
||||||
@ -84,18 +124,6 @@ static int32_t LoadDivxDecoder() {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static int32_t UnloadDivxDecoder() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t LoadDivxDecoder() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static uint32_t s_decoderIndex = 0;
|
static uint32_t s_decoderIndex = 0;
|
||||||
static uint32_t s_strideData[144] = {
|
static uint32_t s_strideData[144] = {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user