summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/ffmpeg/chromium/patches/ugly/w32pthreads_xp_fixes_and_vp8_workaround.patch
blob: dd61cd762776fcde7f57a7759e16fbb3a9e6381c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
From 5be5dce7e195b884edb514795c32a31785668fd4 Mon Sep 17 00:00:00 2001
From: Dale Curtis <dalecurtis@chromium.org>
Date: Mon, 26 Aug 2013 16:06:29 -0700
Subject: [PATCH] Fix w32pthreads on XP.  Workaround duplicate static variables
 in vp8.

Both reported upstream via email.
---
 compat/w32pthreads.h | 25 +++++++++++++------------
 libavcodec/vp8.c     |  7 +++++++
 2 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/compat/w32pthreads.h b/compat/w32pthreads.h
index 4b6924f..ba6da6a 100644
--- a/compat/w32pthreads.h
+++ b/compat/w32pthreads.h
@@ -130,7 +130,7 @@ typedef struct  win32_cond_t {
 static void pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
 {
     win32_cond_t *win32_cond = NULL;
-    if (_WIN32_WINNT >= 0x0600 || cond_init) {
+    if (cond_init) {
         cond_init(cond);
         return;
     }
@@ -155,7 +155,7 @@ static void pthread_cond_destroy(pthread_cond_t *cond)
 {
     win32_cond_t *win32_cond = cond->ptr;
     /* native condition variables do not destroy */
-    if (_WIN32_WINNT >= 0x0600 || cond_init)
+    if (cond_init)
         return;
 
     /* non native condition variables */
@@ -172,7 +172,7 @@ static void pthread_cond_broadcast(pthread_cond_t *cond)
     win32_cond_t *win32_cond = cond->ptr;
     int have_waiter;
 
-    if (_WIN32_WINNT >= 0x0600 || cond_broadcast) {
+    if (cond_broadcast) {
         cond_broadcast(cond);
         return;
     }
@@ -202,7 +202,7 @@ static int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
 {
     win32_cond_t *win32_cond = cond->ptr;
     int last_waiter;
-    if (_WIN32_WINNT >= 0x0600 || cond_wait) {
+    if (cond_wait) {
         cond_wait(cond, mutex, INFINITE);
         return 0;
     }
@@ -234,7 +234,7 @@ static void pthread_cond_signal(pthread_cond_t *cond)
 {
     win32_cond_t *win32_cond = cond->ptr;
     int have_waiter;
-    if (_WIN32_WINNT >= 0x0600 || cond_signal) {
+    if (cond_signal) {
         cond_signal(cond);
         return;
     }
@@ -257,7 +257,8 @@ static void pthread_cond_signal(pthread_cond_t *cond)
 
 static void w32thread_init(void)
 {
-#if _WIN32_WINNT < 0x0600
+    // TODO(dalecurtis): Upstream incorrectly assumes Vista+.  Reported.
+// #if _WIN32_WINNT < 0x0600
     HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
     /* if one is available, then they should all be available */
     cond_init      =
@@ -268,12 +269,12 @@ static void w32thread_init(void)
         (void*)GetProcAddress(kernel_dll, "WakeConditionVariable");
     cond_wait      =
         (void*)GetProcAddress(kernel_dll, "SleepConditionVariableCS");
-#else
-    cond_init      = InitializeConditionVariable;
-    cond_broadcast = WakeAllConditionVariable;
-    cond_signal    = WakeConditionVariable;
-    cond_wait      = SleepConditionVariableCS;
-#endif
+// #else
+//     cond_init      = InitializeConditionVariable;
+//     cond_broadcast = WakeAllConditionVariable;
+//     cond_signal    = WakeConditionVariable;
+//     cond_wait      = SleepConditionVariableCS;
+// #endif
 
 }
 
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index 9848802..d5ef9a2 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -2041,6 +2041,13 @@ static av_cold int vp8_decode_init(AVCodecContext *avctx)
     avctx->pix_fmt = AV_PIX_FMT_YUV420P;
     avctx->internal->allocate_progress = 1;
 
+    // TODO(dalecurtis): w32pthreads.h includes static variables which result
+    // in multiple copies for each includer.  Hack around our version not being
+    // initialized by calling initialize again.
+#if HAVE_W32THREADS
+    w32thread_init();
+#endif
+
     ff_videodsp_init(&s->vdsp, 8);
     ff_h264_pred_init(&s->hpc, AV_CODEC_ID_VP8, 8, 1);
     ff_vp8dsp_init(&s->vp8dsp);
-- 
1.8.3