From 0d8d9b881b73ce84f8e024de5506a30fefc7634f Mon Sep 17 00:00:00 2001 From: roytam1 Date: Thu, 4 Mar 2021 09:55:47 +0800 Subject: [PATCH 1/2] libaom: restore NT5-friendly aom_thread.h --- media/libaom/src/aom_util/aom_thread.h | 87 +++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 8 deletions(-) diff --git a/media/libaom/src/aom_util/aom_thread.h b/media/libaom/src/aom_util/aom_thread.h index 8d0431258f..bda8b756ec 100644 --- a/media/libaom/src/aom_util/aom_thread.h +++ b/media/libaom/src/aom_util/aom_thread.h @@ -23,6 +23,9 @@ extern "C" { #endif +// Set maximum decode threads to be 8 due to the limit of frame buffers +// and not enough semaphores in the emulation layer on windows. +#define MAX_DECODE_THREADS 8 #define MAX_NUM_THREADS 64 #if CONFIG_MULTITHREAD @@ -34,10 +37,16 @@ extern "C" { typedef HANDLE pthread_t; typedef CRITICAL_SECTION pthread_mutex_t; -#if _WIN32_WINNT < 0x0600 -#error _WIN32_WINNT must target Windows Vista / Server 2008 or newer. -#endif +#if _WIN32_WINNT >= 0x0600 // Windows Vista / Server 2008 or greater +#define USE_WINDOWS_CONDITION_VARIABLE typedef CONDITION_VARIABLE pthread_cond_t; +#else +typedef struct { + HANDLE waiting_sem_; + HANDLE received_sem_; + HANDLE signal_event_; +} pthread_cond_t; +#endif // _WIN32_WINNT >= 0x600 #ifndef WINAPI_FAMILY_PARTITION #define WINAPI_PARTITION_DESKTOP 1 @@ -55,6 +64,11 @@ typedef CONDITION_VARIABLE pthread_cond_t; #define THREADFN unsigned int __stdcall #define THREAD_RETURN(val) (unsigned int)((DWORD_PTR)val) +#if _WIN32_WINNT >= 0x0501 // Windows XP or greater +#define WaitForSingleObject(obj, timeout) \ + WaitForSingleObjectEx(obj, timeout, FALSE /*bAlertable*/) +#endif + static INLINE int pthread_create(pthread_t *const thread, const void *attr, unsigned int(__stdcall *start)(void *), void *arg) { @@ -77,8 +91,7 @@ static INLINE int pthread_create(pthread_t *const thread, const void *attr, static INLINE int pthread_join(pthread_t thread, void **value_ptr) { (void)value_ptr; - return (WaitForSingleObjectEx(thread, INFINITE, FALSE /*bAlertable*/) != - WAIT_OBJECT_0 || + return (WaitForSingleObject(thread, INFINITE) != WAIT_OBJECT_0 || CloseHandle(thread) == 0); } @@ -86,7 +99,11 @@ static INLINE int pthread_join(pthread_t thread, void **value_ptr) { static INLINE int pthread_mutex_init(pthread_mutex_t *const mutex, void *mutexattr) { (void)mutexattr; +#if _WIN32_WINNT >= 0x0600 // Windows Vista / Server 2008 or greater InitializeCriticalSectionEx(mutex, 0 /*dwSpinCount*/, 0 /*Flags*/); +#else + InitializeCriticalSection(mutex); +#endif return 0; } @@ -111,31 +128,85 @@ static INLINE int pthread_mutex_destroy(pthread_mutex_t *const mutex) { // Condition static INLINE int pthread_cond_destroy(pthread_cond_t *const condition) { + int ok = 1; +#ifdef USE_WINDOWS_CONDITION_VARIABLE (void)condition; - return 0; +#else + ok &= (CloseHandle(condition->waiting_sem_) != 0); + ok &= (CloseHandle(condition->received_sem_) != 0); + ok &= (CloseHandle(condition->signal_event_) != 0); +#endif + return !ok; } static INLINE int pthread_cond_init(pthread_cond_t *const condition, void *cond_attr) { (void)cond_attr; +#ifdef USE_WINDOWS_CONDITION_VARIABLE InitializeConditionVariable(condition); +#else + condition->waiting_sem_ = CreateSemaphore(NULL, 0, MAX_DECODE_THREADS, NULL); + condition->received_sem_ = CreateSemaphore(NULL, 0, MAX_DECODE_THREADS, NULL); + condition->signal_event_ = CreateEvent(NULL, FALSE, FALSE, NULL); + if (condition->waiting_sem_ == NULL || condition->received_sem_ == NULL || + condition->signal_event_ == NULL) { + pthread_cond_destroy(condition); + return 1; + } +#endif return 0; } static INLINE int pthread_cond_signal(pthread_cond_t *const condition) { + int ok = 1; +#ifdef USE_WINDOWS_CONDITION_VARIABLE WakeConditionVariable(condition); - return 0; +#else + if (WaitForSingleObject(condition->waiting_sem_, 0) == WAIT_OBJECT_0) { + // a thread is waiting in pthread_cond_wait: allow it to be notified + ok = SetEvent(condition->signal_event_); + // wait until the event is consumed so the signaler cannot consume + // the event via its own pthread_cond_wait. + ok &= (WaitForSingleObject(condition->received_sem_, INFINITE) != + WAIT_OBJECT_0); + } +#endif + return !ok; } static INLINE int pthread_cond_broadcast(pthread_cond_t *const condition) { + int ok = 1; +#ifdef USE_WINDOWS_CONDITION_VARIABLE WakeAllConditionVariable(condition); - return 0; +#else + while (WaitForSingleObject(condition->waiting_sem_, 0) == WAIT_OBJECT_0) { + // a thread is waiting in pthread_cond_wait: allow it to be notified + ok &= SetEvent(condition->signal_event_); + // wait until the event is consumed so the signaler cannot consume + // the event via its own pthread_cond_wait. + ok &= (WaitForSingleObject(condition->received_sem_, INFINITE) != + WAIT_OBJECT_0); + } +#endif + return !ok; } static INLINE int pthread_cond_wait(pthread_cond_t *const condition, pthread_mutex_t *const mutex) { int ok; +#ifdef USE_WINDOWS_CONDITION_VARIABLE ok = SleepConditionVariableCS(condition, mutex, INFINITE); +#else + // note that there is a consumer available so the signal isn't dropped in + // pthread_cond_signal + if (!ReleaseSemaphore(condition->waiting_sem_, 1, NULL)) return 1; + // now unlock the mutex so pthread_cond_signal may be issued + pthread_mutex_unlock(mutex); + ok = (WaitForSingleObject(condition->signal_event_, INFINITE) == + WAIT_OBJECT_0); + ok &= ReleaseSemaphore(condition->received_sem_, 1, NULL); + pthread_mutex_lock(mutex); +#endif return !ok; } #elif defined(__OS2__) From 650abe2cb9eb02c14369a807a6225ebb053d0b17 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 4 Mar 2021 10:57:15 +0000 Subject: [PATCH 2/2] [Pale-Moon] Issue #1862 - Add media format controls in Preferences -> Content --- .../components/preferences/content.xul | 28 ++++++++++++++++++- .../palemoon/components/preferences/jar.mn | 2 +- .../chrome/browser/preferences/content.dtd | 12 ++++++++ application/palemoon/locales/jar.mn | 2 +- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/application/palemoon/components/preferences/content.xul b/application/palemoon/components/preferences/content.xul index 19a6c34ab8..21f9e5d81a 100644 --- a/application/palemoon/components/preferences/content.xul +++ b/application/palemoon/components/preferences/content.xul @@ -40,7 +40,15 @@ - + + + + + + + + +