mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-04-13 14:42:51 -07:00
Rebase against f712a98d12d091c5437159a291857dfb9f0cea7c.
This commit is contained in:
parent
164b361be6
commit
feb91195ff
File diff suppressed because it is too large
Load Diff
@ -1,168 +0,0 @@
|
||||
From 2c3d9dfc09ee64767347574e0bd6e8f5511a6a54 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sat, 9 Oct 2021 13:47:39 +1100
|
||||
Subject: [PATCH 02/22] Revert "wmvcore: Move the async reader implementation
|
||||
to winegstreamer."
|
||||
|
||||
This reverts commit bf7c05d87a65b7b9999d71fc0df602e3dfa2fafa.
|
||||
---
|
||||
dlls/winegstreamer/Makefile.in | 1 -
|
||||
dlls/winegstreamer/winegstreamer.spec | 1 -
|
||||
dlls/wmvcore/Makefile.in | 1 +
|
||||
.../wm_asyncreader.c => wmvcore/reader.c} | 54 +++++++++++--------
|
||||
dlls/wmvcore/wmvcore_main.c | 15 ------
|
||||
5 files changed, 32 insertions(+), 40 deletions(-)
|
||||
rename dlls/{winegstreamer/wm_asyncreader.c => wmvcore/reader.c} (98%)
|
||||
|
||||
diff --git a/dlls/winegstreamer/Makefile.in b/dlls/winegstreamer/Makefile.in
|
||||
index 17311cd663c..671e3bcb7ba 100644
|
||||
--- a/dlls/winegstreamer/Makefile.in
|
||||
+++ b/dlls/winegstreamer/Makefile.in
|
||||
@@ -13,7 +13,6 @@ C_SRCS = \
|
||||
mfplat.c \
|
||||
quartz_parser.c \
|
||||
wg_parser.c \
|
||||
- wm_asyncreader.c \
|
||||
wm_syncreader.c
|
||||
|
||||
IDL_SRCS = \
|
||||
diff --git a/dlls/winegstreamer/winegstreamer.spec b/dlls/winegstreamer/winegstreamer.spec
|
||||
index bc6a390f8b1..bd9f53a7445 100644
|
||||
--- a/dlls/winegstreamer/winegstreamer.spec
|
||||
+++ b/dlls/winegstreamer/winegstreamer.spec
|
||||
@@ -2,5 +2,4 @@
|
||||
@ stdcall -private DllGetClassObject(ptr ptr ptr)
|
||||
@ stdcall -private DllRegisterServer()
|
||||
@ stdcall -private DllUnregisterServer()
|
||||
-@ stdcall winegstreamer_create_wm_async_reader(ptr)
|
||||
@ stdcall winegstreamer_create_wm_sync_reader(ptr)
|
||||
diff --git a/dlls/wmvcore/Makefile.in b/dlls/wmvcore/Makefile.in
|
||||
index 6aed828abae..d0b230dd7c0 100644
|
||||
--- a/dlls/wmvcore/Makefile.in
|
||||
+++ b/dlls/wmvcore/Makefile.in
|
||||
@@ -6,6 +6,7 @@ DELAYIMPORTS = winegstreamer
|
||||
EXTRADLLFLAGS = -Wb,--prefer-native
|
||||
|
||||
C_SRCS = \
|
||||
+ reader.c \
|
||||
wmvcore_main.c \
|
||||
writer.c
|
||||
|
||||
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/wmvcore/reader.c
|
||||
similarity index 98%
|
||||
rename from dlls/winegstreamer/wm_asyncreader.c
|
||||
rename to dlls/wmvcore/reader.c
|
||||
index d3fd1624f24..12ba8099ab1 100644
|
||||
--- a/dlls/winegstreamer/wm_asyncreader.c
|
||||
+++ b/dlls/wmvcore/reader.c
|
||||
@@ -16,8 +16,11 @@
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
-#include "gst_private.h"
|
||||
+#include "wmvcore.h"
|
||||
+
|
||||
#include "wmsdk.h"
|
||||
+#include "wine/debug.h"
|
||||
+#include "wine/heap.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(wmvcore);
|
||||
|
||||
@@ -150,7 +153,7 @@ static ULONG WINAPI WMReader_Release(IWMReader *iface)
|
||||
TRACE("(%p) ref=%d\n", This, ref);
|
||||
|
||||
if(!ref)
|
||||
- free(This);
|
||||
+ heap_free(This);
|
||||
|
||||
return ref;
|
||||
}
|
||||
@@ -2036,31 +2039,36 @@ static const IWMPacketSize2Vtbl WMPacketSize2Vtbl =
|
||||
packetsize_SetMinPacketSize
|
||||
};
|
||||
|
||||
-HRESULT WINAPI winegstreamer_create_wm_async_reader(IWMReader **reader)
|
||||
+HRESULT WINAPI WMCreateReader(IUnknown *reserved, DWORD rights, IWMReader **ret_reader)
|
||||
{
|
||||
- WMReader *object;
|
||||
+ WMReader *reader;
|
||||
|
||||
- TRACE("reader %p.\n", reader);
|
||||
+ TRACE("(%p, %x, %p)\n", reserved, rights, ret_reader);
|
||||
|
||||
- if (!(object = calloc(1, sizeof(*object))))
|
||||
+ reader = heap_alloc(sizeof(*reader));
|
||||
+ if(!reader)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
- object->IReferenceClock_iface.lpVtbl = &ReferenceClockVtbl;
|
||||
- object->IWMHeaderInfo3_iface.lpVtbl = &WMHeaderInfo3Vtbl;
|
||||
- object->IWMLanguageList_iface.lpVtbl = &WMLanguageListVtbl;
|
||||
- object->IWMPacketSize2_iface.lpVtbl = &WMPacketSize2Vtbl;
|
||||
- object->IWMProfile3_iface.lpVtbl = &WMProfile3Vtbl;
|
||||
- object->IWMReader_iface.lpVtbl = &WMReaderVtbl;
|
||||
- object->IWMReaderAdvanced6_iface.lpVtbl = &WMReaderAdvanced6Vtbl;
|
||||
- object->IWMReaderAccelerator_iface.lpVtbl = &WMReaderAcceleratorVtbl;
|
||||
- object->IWMReaderNetworkConfig2_iface.lpVtbl = &WMReaderNetworkConfig2Vtbl;
|
||||
- object->IWMReaderPlaylistBurn_iface.lpVtbl = &WMReaderPlaylistBurnVtbl;
|
||||
- object->IWMReaderStreamClock_iface.lpVtbl = &WMReaderStreamClockVtbl;
|
||||
- object->IWMReaderTimecode_iface.lpVtbl = &WMReaderTimecodeVtbl;
|
||||
- object->IWMReaderTypeNegotiation_iface.lpVtbl = &WMReaderTypeNegotiationVtbl;
|
||||
- object->ref = 1;
|
||||
-
|
||||
- TRACE("Created async reader %p.\n", object);
|
||||
- *reader = (IWMReader *)&object->IWMReader_iface;
|
||||
+ reader->IWMReader_iface.lpVtbl = &WMReaderVtbl;
|
||||
+ reader->IWMReaderAdvanced6_iface.lpVtbl = &WMReaderAdvanced6Vtbl;
|
||||
+ reader->IWMReaderAccelerator_iface.lpVtbl = &WMReaderAcceleratorVtbl;
|
||||
+ reader->IWMReaderNetworkConfig2_iface.lpVtbl = &WMReaderNetworkConfig2Vtbl;
|
||||
+ reader->IWMReaderStreamClock_iface.lpVtbl = &WMReaderStreamClockVtbl;
|
||||
+ reader->IWMReaderTypeNegotiation_iface.lpVtbl = &WMReaderTypeNegotiationVtbl;
|
||||
+ reader->IWMReaderTimecode_iface.lpVtbl = &WMReaderTimecodeVtbl;
|
||||
+ reader->IWMReaderPlaylistBurn_iface.lpVtbl = &WMReaderPlaylistBurnVtbl;
|
||||
+ reader->IWMHeaderInfo3_iface.lpVtbl = &WMHeaderInfo3Vtbl;
|
||||
+ reader->IWMLanguageList_iface.lpVtbl = &WMLanguageListVtbl;
|
||||
+ reader->IReferenceClock_iface.lpVtbl = &ReferenceClockVtbl;
|
||||
+ reader->IWMProfile3_iface.lpVtbl = &WMProfile3Vtbl;
|
||||
+ reader->IWMPacketSize2_iface.lpVtbl = &WMPacketSize2Vtbl;
|
||||
+ reader->ref = 1;
|
||||
+
|
||||
+ *ret_reader = &reader->IWMReader_iface;
|
||||
return S_OK;
|
||||
}
|
||||
+
|
||||
+HRESULT WINAPI WMCreateReaderPriv(IWMReader **ret_reader)
|
||||
+{
|
||||
+ return WMCreateReader(NULL, 0, ret_reader);
|
||||
+}
|
||||
diff --git a/dlls/wmvcore/wmvcore_main.c b/dlls/wmvcore/wmvcore_main.c
|
||||
index ff837921286..8d4d4251369 100644
|
||||
--- a/dlls/wmvcore/wmvcore_main.c
|
||||
+++ b/dlls/wmvcore/wmvcore_main.c
|
||||
@@ -25,23 +25,8 @@
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(wmvcore);
|
||||
|
||||
-HRESULT WINAPI winegstreamer_create_wm_async_reader(IWMReader **reader);
|
||||
HRESULT WINAPI winegstreamer_create_wm_sync_reader(IWMSyncReader **reader);
|
||||
|
||||
-HRESULT WINAPI WMCreateReader(IUnknown *reserved, DWORD rights, IWMReader **reader)
|
||||
-{
|
||||
- TRACE("reserved %p, rights %#x, reader %p.\n", reserved, rights, reader);
|
||||
-
|
||||
- return winegstreamer_create_wm_async_reader(reader);
|
||||
-}
|
||||
-
|
||||
-HRESULT WINAPI WMCreateReaderPriv(IWMReader **reader)
|
||||
-{
|
||||
- TRACE("reader %p.\n", reader);
|
||||
-
|
||||
- return winegstreamer_create_wm_async_reader(reader);
|
||||
-}
|
||||
-
|
||||
HRESULT WINAPI WMCreateSyncReader(IUnknown *reserved, DWORD rights, IWMSyncReader **reader)
|
||||
{
|
||||
TRACE("reserved %p, rights %#x, reader %p.\n", reserved, rights, reader);
|
||||
--
|
||||
2.33.0
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,161 +0,0 @@
|
||||
From 59b60c9a19de54bc0f6541395ffcf49d96437b8c Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sat, 9 Oct 2021 13:47:42 +1100
|
||||
Subject: [PATCH 04/22] Revert "wmvcore: Move the sync reader implementation to
|
||||
winegstreamer."
|
||||
|
||||
This reverts commit e4767ea6126fce8b419ef10a3cfce8bf43206d6f.
|
||||
---
|
||||
dlls/winegstreamer/Makefile.in | 4 +--
|
||||
dlls/winegstreamer/winegstreamer.spec | 1 -
|
||||
dlls/wmvcore/Makefile.in | 2 +-
|
||||
.../wm_syncreader.c => wmvcore/syncreader.c} | 33 ++++++++++++-------
|
||||
dlls/wmvcore/wmvcore_main.c | 16 ---------
|
||||
5 files changed, 23 insertions(+), 33 deletions(-)
|
||||
rename dlls/{winegstreamer/wm_syncreader.c => wmvcore/syncreader.c} (96%)
|
||||
|
||||
diff --git a/dlls/winegstreamer/Makefile.in b/dlls/winegstreamer/Makefile.in
|
||||
index 671e3bcb7ba..e35df3cf3f9 100644
|
||||
--- a/dlls/winegstreamer/Makefile.in
|
||||
+++ b/dlls/winegstreamer/Makefile.in
|
||||
@@ -1,6 +1,5 @@
|
||||
MODULE = winegstreamer.dll
|
||||
UNIXLIB = winegstreamer.so
|
||||
-IMPORTLIB = winegstreamer
|
||||
IMPORTS = strmbase strmiids uuid ole32 mfuuid
|
||||
DELAYIMPORTS = mfplat
|
||||
EXTRAINCL = $(GSTREAMER_CFLAGS)
|
||||
@@ -12,8 +11,7 @@ C_SRCS = \
|
||||
media_source.c \
|
||||
mfplat.c \
|
||||
quartz_parser.c \
|
||||
- wg_parser.c \
|
||||
- wm_syncreader.c
|
||||
+ wg_parser.c
|
||||
|
||||
IDL_SRCS = \
|
||||
winegstreamer_classes.idl
|
||||
diff --git a/dlls/winegstreamer/winegstreamer.spec b/dlls/winegstreamer/winegstreamer.spec
|
||||
index bd9f53a7445..b16365d0c9f 100644
|
||||
--- a/dlls/winegstreamer/winegstreamer.spec
|
||||
+++ b/dlls/winegstreamer/winegstreamer.spec
|
||||
@@ -2,4 +2,3 @@
|
||||
@ stdcall -private DllGetClassObject(ptr ptr ptr)
|
||||
@ stdcall -private DllRegisterServer()
|
||||
@ stdcall -private DllUnregisterServer()
|
||||
-@ stdcall winegstreamer_create_wm_sync_reader(ptr)
|
||||
diff --git a/dlls/wmvcore/Makefile.in b/dlls/wmvcore/Makefile.in
|
||||
index d0b230dd7c0..15c017f86d9 100644
|
||||
--- a/dlls/wmvcore/Makefile.in
|
||||
+++ b/dlls/wmvcore/Makefile.in
|
||||
@@ -1,12 +1,12 @@
|
||||
MODULE = wmvcore.dll
|
||||
IMPORTLIB = wmvcore
|
||||
IMPORTS = kernel32
|
||||
-DELAYIMPORTS = winegstreamer
|
||||
|
||||
EXTRADLLFLAGS = -Wb,--prefer-native
|
||||
|
||||
C_SRCS = \
|
||||
reader.c \
|
||||
+ syncreader.c \
|
||||
wmvcore_main.c \
|
||||
writer.c
|
||||
|
||||
diff --git a/dlls/winegstreamer/wm_syncreader.c b/dlls/wmvcore/syncreader.c
|
||||
similarity index 96%
|
||||
rename from dlls/winegstreamer/wm_syncreader.c
|
||||
rename to dlls/wmvcore/syncreader.c
|
||||
index 75b8e021148..b245ff20d31 100644
|
||||
--- a/dlls/winegstreamer/wm_syncreader.c
|
||||
+++ b/dlls/wmvcore/syncreader.c
|
||||
@@ -16,9 +16,11 @@
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
-#include "gst_private.h"
|
||||
-#include "initguid.h"
|
||||
+#include "wmvcore.h"
|
||||
+
|
||||
#include "wmsdk.h"
|
||||
+#include "wine/debug.h"
|
||||
+#include "wine/heap.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(wmvcore);
|
||||
|
||||
@@ -83,7 +85,7 @@ static ULONG WINAPI WMSyncReader_Release(IWMSyncReader2 *iface)
|
||||
TRACE("(%p) ref=%d\n", This, ref);
|
||||
|
||||
if(!ref)
|
||||
- free(This);
|
||||
+ heap_free(This);
|
||||
|
||||
return ref;
|
||||
}
|
||||
@@ -603,20 +605,27 @@ static const IWMProfile3Vtbl WMProfile3Vtbl =
|
||||
WMProfile3_GetExpectedPacketCount
|
||||
};
|
||||
|
||||
-HRESULT WINAPI winegstreamer_create_wm_sync_reader(IWMSyncReader **reader)
|
||||
+HRESULT WINAPI WMCreateSyncReader(IUnknown *pcert, DWORD rights, IWMSyncReader **syncreader)
|
||||
{
|
||||
- WMSyncReader *object;
|
||||
+ WMSyncReader *sync;
|
||||
+
|
||||
+ TRACE("(%p, %x, %p)\n", pcert, rights, syncreader);
|
||||
|
||||
- TRACE("reader %p.\n", reader);
|
||||
+ sync = heap_alloc(sizeof(*sync));
|
||||
|
||||
- if (!(object = calloc(1, sizeof(*object))))
|
||||
+ if (!sync)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
- object->IWMProfile3_iface.lpVtbl = &WMProfile3Vtbl;
|
||||
- object->IWMSyncReader2_iface.lpVtbl = &WMSyncReader2Vtbl;
|
||||
- object->ref = 1;
|
||||
+ sync->IWMProfile3_iface.lpVtbl = &WMProfile3Vtbl;
|
||||
+ sync->IWMSyncReader2_iface.lpVtbl = &WMSyncReader2Vtbl;
|
||||
+ sync->ref = 1;
|
||||
+
|
||||
+ *syncreader = (IWMSyncReader *)&sync->IWMSyncReader2_iface;
|
||||
|
||||
- TRACE("Created sync reader %p.\n", object);
|
||||
- *reader = (IWMSyncReader *)&object->IWMSyncReader2_iface;
|
||||
return S_OK;
|
||||
}
|
||||
+
|
||||
+HRESULT WINAPI WMCreateSyncReaderPriv(IWMSyncReader **syncreader)
|
||||
+{
|
||||
+ return WMCreateSyncReader(NULL, 0, syncreader);
|
||||
+}
|
||||
diff --git a/dlls/wmvcore/wmvcore_main.c b/dlls/wmvcore/wmvcore_main.c
|
||||
index 8d4d4251369..5f93fc68e3b 100644
|
||||
--- a/dlls/wmvcore/wmvcore_main.c
|
||||
+++ b/dlls/wmvcore/wmvcore_main.c
|
||||
@@ -25,22 +25,6 @@
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(wmvcore);
|
||||
|
||||
-HRESULT WINAPI winegstreamer_create_wm_sync_reader(IWMSyncReader **reader);
|
||||
-
|
||||
-HRESULT WINAPI WMCreateSyncReader(IUnknown *reserved, DWORD rights, IWMSyncReader **reader)
|
||||
-{
|
||||
- TRACE("reserved %p, rights %#x, reader %p.\n", reserved, rights, reader);
|
||||
-
|
||||
- return winegstreamer_create_wm_sync_reader(reader);
|
||||
-}
|
||||
-
|
||||
-HRESULT WINAPI WMCreateSyncReaderPriv(IWMSyncReader **reader)
|
||||
-{
|
||||
- TRACE("reader %p.\n", reader);
|
||||
-
|
||||
- return winegstreamer_create_wm_sync_reader(reader);
|
||||
-}
|
||||
-
|
||||
HRESULT WINAPI WMCheckURLExtension(const WCHAR *url)
|
||||
{
|
||||
FIXME("(%s): stub\n", wine_dbgstr_w(url));
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,30 +0,0 @@
|
||||
From 6bde437d76c256778d706da4874a4db2a37e0e3a Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sat, 9 Oct 2021 13:47:44 +1100
|
||||
Subject: [PATCH 05/22] Revert "winegstreamer: Translate
|
||||
GST_AUDIO_CHANNEL_POSITION_MONO to SPEAKER_FRONT_CENTER."
|
||||
|
||||
This reverts commit 009c1d66fa202666f778d7df2bbcc522993935cf.
|
||||
---
|
||||
dlls/winegstreamer/wg_parser.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index c3c9051a174..0c23ae6d351 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -159,10 +159,7 @@ static uint32_t wg_channel_position_from_gst(GstAudioChannelPosition position)
|
||||
SPEAKER_TOP_BACK_CENTER,
|
||||
};
|
||||
|
||||
- if (position == GST_AUDIO_CHANNEL_POSITION_MONO)
|
||||
- return SPEAKER_FRONT_CENTER;
|
||||
-
|
||||
- if (position >= 0 && position < ARRAY_SIZE(position_map))
|
||||
+ if (position < ARRAY_SIZE(position_map))
|
||||
return position_map[position];
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,37 +0,0 @@
|
||||
From 0cc0b9856041daede1d49ce5ba3bde736edd0a92 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Thu, 7 Oct 2021 09:00:38 +1100
|
||||
Subject: [PATCH 06/22] Revert "winegstreamer: Trace the unfiltered caps in
|
||||
sink_query_cb()."
|
||||
|
||||
This reverts commit fd6315eb8f6809b89b7449f4b9dd01453de32eda.
|
||||
---
|
||||
dlls/winegstreamer/wg_parser.c | 5 -----
|
||||
1 file changed, 5 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index 0c23ae6d351..9a382cb724c 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -1006,7 +1006,6 @@ static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query)
|
||||
case GST_QUERY_CAPS:
|
||||
{
|
||||
GstCaps *caps, *filter, *temp;
|
||||
- gchar *str;
|
||||
|
||||
gst_query_parse_caps(query, &filter);
|
||||
|
||||
@@ -1017,10 +1016,6 @@ static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query)
|
||||
if (!caps)
|
||||
return FALSE;
|
||||
|
||||
- str = gst_caps_to_string(caps);
|
||||
- GST_LOG("Stream caps are \"%s\".", str);
|
||||
- g_free(str);
|
||||
-
|
||||
if (filter)
|
||||
{
|
||||
temp = gst_caps_intersect(caps, filter);
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,33 +0,0 @@
|
||||
From dd5d76af94c794f9679c29bec0dc436bfaa78edc Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Thu, 7 Oct 2021 09:00:39 +1100
|
||||
Subject: [PATCH 07/22] Revert "winegstreamer: Avoid seeking past the end of an
|
||||
IMFByteStream."
|
||||
|
||||
This reverts commit 3efb72de5aca01d3d979ce697728e51bc3e99901.
|
||||
---
|
||||
dlls/winegstreamer/media_source.c | 8 --------
|
||||
1 file changed, 8 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index 6ecd345cb73..dab85e4689d 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -639,14 +639,6 @@ static DWORD CALLBACK read_thread(void *arg)
|
||||
else if (offset + size >= file_size)
|
||||
size = file_size - offset;
|
||||
|
||||
- /* Some IMFByteStreams (including the standard file-based stream) return
|
||||
- * an error when reading past the file size. */
|
||||
- if (!size)
|
||||
- {
|
||||
- wg_parser_push_data(source->wg_parser, data, 0);
|
||||
- continue;
|
||||
- }
|
||||
-
|
||||
if (!array_reserve(&data, &buffer_size, size, 1))
|
||||
{
|
||||
free(data);
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,52 +0,0 @@
|
||||
From 9d20d8d508a65ef044a3d903eb2c96e9b4d08429 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Thu, 7 Oct 2021 09:00:39 +1100
|
||||
Subject: [PATCH 08/22] Revert "winegstreamer: Avoid passing a NULL buffer to
|
||||
wg_parser_push_data() in the case of a zero-length read."
|
||||
|
||||
This reverts commit 585acfa04188f85fb9138e57d56dd44b870dca41.
|
||||
---
|
||||
dlls/winegstreamer/media_source.c | 7 ++-----
|
||||
dlls/winegstreamer/quartz_parser.c | 5 +----
|
||||
2 files changed, 3 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index dab85e4689d..703bdd7c57d 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -613,12 +613,9 @@ static DWORD CALLBACK read_thread(void *arg)
|
||||
{
|
||||
struct media_source *source = arg;
|
||||
IMFByteStream *byte_stream = source->byte_stream;
|
||||
- size_t buffer_size = 4096;
|
||||
+ size_t buffer_size = 0;
|
||||
uint64_t file_size;
|
||||
- void *data;
|
||||
-
|
||||
- if (!(data = malloc(buffer_size)))
|
||||
- return 0;
|
||||
+ void *data = NULL;
|
||||
|
||||
IMFByteStream_GetLength(byte_stream, &file_size);
|
||||
|
||||
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
|
||||
index 6d79d2ef129..b6655d5da3c 100644
|
||||
--- a/dlls/winegstreamer/quartz_parser.c
|
||||
+++ b/dlls/winegstreamer/quartz_parser.c
|
||||
@@ -786,12 +786,9 @@ static DWORD CALLBACK read_thread(void *arg)
|
||||
{
|
||||
struct parser *filter = arg;
|
||||
LONGLONG file_size, unused;
|
||||
- size_t buffer_size = 4096;
|
||||
+ size_t buffer_size = 0;
|
||||
void *data = NULL;
|
||||
|
||||
- if (!(data = malloc(buffer_size)))
|
||||
- return 0;
|
||||
-
|
||||
IAsyncReader_Length(filter->reader, &file_size, &unused);
|
||||
|
||||
TRACE("Starting read thread for filter %p.\n", filter);
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,122 +0,0 @@
|
||||
From 997978816252d56a53b53d8d0a1913f78b3aad42 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Thu, 7 Oct 2021 09:00:40 +1100
|
||||
Subject: [PATCH 09/22] Revert "winegstreamer: Use array_reserve() to
|
||||
reallocate read buffers."
|
||||
|
||||
This reverts commit 59997c355fdc9cb5857c767b3bf16c9513b3d1f3.
|
||||
---
|
||||
dlls/winegstreamer/gst_private.h | 2 --
|
||||
dlls/winegstreamer/main.c | 27 ---------------------------
|
||||
dlls/winegstreamer/media_source.c | 8 ++++----
|
||||
dlls/winegstreamer/quartz_parser.c | 8 ++++----
|
||||
4 files changed, 8 insertions(+), 37 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
|
||||
index 986c8ca695d..ebe0bf6f50d 100644
|
||||
--- a/dlls/winegstreamer/gst_private.h
|
||||
+++ b/dlls/winegstreamer/gst_private.h
|
||||
@@ -38,8 +38,6 @@
|
||||
|
||||
#include "unixlib.h"
|
||||
|
||||
-bool array_reserve(void **elements, size_t *capacity, size_t count, size_t size) DECLSPEC_HIDDEN;
|
||||
-
|
||||
static inline const char *debugstr_time(REFERENCE_TIME time)
|
||||
{
|
||||
ULONGLONG abstime = time >= 0 ? time : -time;
|
||||
diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c
|
||||
index d6f19fb4ad1..c799aa06d1b 100644
|
||||
--- a/dlls/winegstreamer/main.c
|
||||
+++ b/dlls/winegstreamer/main.c
|
||||
@@ -31,33 +31,6 @@ static unixlib_handle_t unix_handle;
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(quartz);
|
||||
|
||||
-bool array_reserve(void **elements, size_t *capacity, size_t count, size_t size)
|
||||
-{
|
||||
- unsigned int new_capacity, max_capacity;
|
||||
- void *new_elements;
|
||||
-
|
||||
- if (count <= *capacity)
|
||||
- return TRUE;
|
||||
-
|
||||
- max_capacity = ~(SIZE_T)0 / size;
|
||||
- if (count > max_capacity)
|
||||
- return FALSE;
|
||||
-
|
||||
- new_capacity = max(4, *capacity);
|
||||
- while (new_capacity < count && new_capacity <= max_capacity / 2)
|
||||
- new_capacity *= 2;
|
||||
- if (new_capacity < count)
|
||||
- new_capacity = max_capacity;
|
||||
-
|
||||
- if (!(new_elements = realloc(*elements, new_capacity * size)))
|
||||
- return FALSE;
|
||||
-
|
||||
- *elements = new_elements;
|
||||
- *capacity = new_capacity;
|
||||
-
|
||||
- return TRUE;
|
||||
-}
|
||||
-
|
||||
struct wg_parser *wg_parser_create(enum wg_parser_type type, bool unlimited_buffering)
|
||||
{
|
||||
struct wg_parser_create_params params =
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index 703bdd7c57d..da898f20f66 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -613,7 +613,7 @@ static DWORD CALLBACK read_thread(void *arg)
|
||||
{
|
||||
struct media_source *source = arg;
|
||||
IMFByteStream *byte_stream = source->byte_stream;
|
||||
- size_t buffer_size = 0;
|
||||
+ uint32_t buffer_size = 0;
|
||||
uint64_t file_size;
|
||||
void *data = NULL;
|
||||
|
||||
@@ -636,10 +636,10 @@ static DWORD CALLBACK read_thread(void *arg)
|
||||
else if (offset + size >= file_size)
|
||||
size = file_size - offset;
|
||||
|
||||
- if (!array_reserve(&data, &buffer_size, size, 1))
|
||||
+ if (size > buffer_size)
|
||||
{
|
||||
- free(data);
|
||||
- return 0;
|
||||
+ buffer_size = size;
|
||||
+ data = realloc(data, size);
|
||||
}
|
||||
|
||||
ret_size = 0;
|
||||
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
|
||||
index b6655d5da3c..6ae1a99a14a 100644
|
||||
--- a/dlls/winegstreamer/quartz_parser.c
|
||||
+++ b/dlls/winegstreamer/quartz_parser.c
|
||||
@@ -786,7 +786,7 @@ static DWORD CALLBACK read_thread(void *arg)
|
||||
{
|
||||
struct parser *filter = arg;
|
||||
LONGLONG file_size, unused;
|
||||
- size_t buffer_size = 0;
|
||||
+ uint32_t buffer_size = 0;
|
||||
void *data = NULL;
|
||||
|
||||
IAsyncReader_Length(filter->reader, &file_size, &unused);
|
||||
@@ -807,10 +807,10 @@ static DWORD CALLBACK read_thread(void *arg)
|
||||
else if (offset + size >= file_size)
|
||||
size = file_size - offset;
|
||||
|
||||
- if (!array_reserve(&data, &buffer_size, size, 1))
|
||||
+ if (size > buffer_size)
|
||||
{
|
||||
- free(data);
|
||||
- return 0;
|
||||
+ buffer_size = size;
|
||||
+ data = realloc(data, size);
|
||||
}
|
||||
|
||||
hr = IAsyncReader_SyncRead(filter->reader, offset, size, data);
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,44 +0,0 @@
|
||||
From 6e82f802820e9ed145201091cd636f2e83d85e67 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Thu, 7 Oct 2021 09:00:41 +1100
|
||||
Subject: [PATCH 10/22] Revert "winegstreamer: Handle zero-length reads in
|
||||
src_getrange_cb()."
|
||||
|
||||
This reverts commit 8e9d7b031f7b0c93471cfbffe8f720c34623a273.
|
||||
---
|
||||
dlls/winegstreamer/wg_parser.c | 12 +-----------
|
||||
1 file changed, 1 insertion(+), 11 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index 9a382cb724c..72dfab8f3d6 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -1272,7 +1272,7 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent,
|
||||
GstMapInfo map_info;
|
||||
bool ret;
|
||||
|
||||
- GST_LOG("pad %p, offset %" G_GINT64_MODIFIER "u, size %u, buffer %p.", pad, offset, size, *buffer);
|
||||
+ GST_LOG("pad %p, offset %" G_GINT64_MODIFIER "u, length %u, buffer %p.", pad, offset, size, *buffer);
|
||||
|
||||
if (offset == GST_BUFFER_OFFSET_NONE)
|
||||
offset = parser->next_pull_offset;
|
||||
@@ -1281,16 +1281,6 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent,
|
||||
if (!*buffer)
|
||||
*buffer = new_buffer = gst_buffer_new_and_alloc(size);
|
||||
|
||||
- if (!size)
|
||||
- {
|
||||
- /* asfreader occasionally asks for zero bytes. gst_buffer_map() will
|
||||
- * return NULL in this case. Avoid confusing the read thread by asking
|
||||
- * it for zero bytes. */
|
||||
- gst_buffer_set_size(*buffer, 0);
|
||||
- GST_LOG("Returning empty buffer.");
|
||||
- return GST_FLOW_OK;
|
||||
- }
|
||||
-
|
||||
gst_buffer_map(*buffer, &map_info, GST_MAP_WRITE);
|
||||
|
||||
pthread_mutex_lock(&parser->mutex);
|
||||
--
|
||||
2.33.0
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,91 +0,0 @@
|
||||
From 3753c3b6c8c99a664430805c3e7bd7273064f379 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Wed, 6 Oct 2021 08:38:12 +1100
|
||||
Subject: [PATCH 12/22] Revert "winegstreamer: Return void from
|
||||
wg_parser_stream_seek()."
|
||||
|
||||
This reverts commit 494039d0d0df8fd5b2b3442caac7bd6c0c7433c0.
|
||||
---
|
||||
dlls/winegstreamer/quartz_parser.c | 12 +++++++++---
|
||||
dlls/winegstreamer/unixlib.h | 2 +-
|
||||
dlls/winegstreamer/wg_parser.c | 7 +++----
|
||||
3 files changed, 13 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
|
||||
index 5dd232ea0da..a1fa7daec6f 100644
|
||||
--- a/dlls/winegstreamer/quartz_parser.c
|
||||
+++ b/dlls/winegstreamer/quartz_parser.c
|
||||
@@ -1233,6 +1233,7 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface,
|
||||
{
|
||||
struct parser_source *pin = impl_from_IMediaSeeking(iface);
|
||||
struct parser *filter = impl_from_strmbase_filter(pin->pin.pin.filter);
|
||||
+ HRESULT hr = S_OK;
|
||||
int i;
|
||||
|
||||
TRACE("pin %p, current %s, current_flags %#x, stop %s, stop_flags %#x.\n",
|
||||
@@ -1269,8 +1270,13 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface,
|
||||
|
||||
SourceSeekingImpl_SetPositions(iface, current, current_flags, stop, stop_flags);
|
||||
|
||||
- unix_funcs->wg_parser_stream_seek(pin->wg_stream, pin->seek.dRate,
|
||||
- pin->seek.llCurrent, pin->seek.llStop, current_flags, stop_flags);
|
||||
+ if (!unix_funcs->wg_parser_stream_seek(pin->wg_stream, pin->seek.dRate,
|
||||
+ pin->seek.llCurrent, pin->seek.llStop, current_flags, stop_flags))
|
||||
+ {
|
||||
+ ERR("Failed to seek (current %s, stop %s).\n",
|
||||
+ debugstr_time(pin->seek.llCurrent), debugstr_time(pin->seek.llStop));
|
||||
+ hr = E_FAIL;
|
||||
+ }
|
||||
|
||||
if (!(current_flags & AM_SEEKING_NoFlush))
|
||||
{
|
||||
@@ -1293,7 +1299,7 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface,
|
||||
LeaveCriticalSection(&pin->flushing_cs);
|
||||
}
|
||||
|
||||
- return S_OK;
|
||||
+ return hr;
|
||||
}
|
||||
|
||||
static const IMediaSeekingVtbl GST_Seeking_Vtbl =
|
||||
diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h
|
||||
index dade020916a..e917f7b5557 100644
|
||||
--- a/dlls/winegstreamer/unixlib.h
|
||||
+++ b/dlls/winegstreamer/unixlib.h
|
||||
@@ -158,7 +158,7 @@ struct unix_funcs
|
||||
/* Returns the duration in 100-nanosecond units. */
|
||||
uint64_t (CDECL *wg_parser_stream_get_duration)(struct wg_parser_stream *stream);
|
||||
/* start_pos and stop_pos are in 100-nanosecond units. */
|
||||
- void (CDECL *wg_parser_stream_seek)(struct wg_parser_stream *stream, double rate,
|
||||
+ bool (CDECL *wg_parser_stream_seek)(struct wg_parser_stream *stream, double rate,
|
||||
uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags);
|
||||
};
|
||||
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index 694f8b57ed1..b89a50b5d8f 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -686,7 +686,7 @@ static uint64_t CDECL wg_parser_stream_get_duration(struct wg_parser_stream *str
|
||||
return stream->duration;
|
||||
}
|
||||
|
||||
-static void CDECL wg_parser_stream_seek(struct wg_parser_stream *stream, double rate,
|
||||
+static bool CDECL wg_parser_stream_seek(struct wg_parser_stream *stream, double rate,
|
||||
uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags)
|
||||
{
|
||||
GstSeekType start_type = GST_SEEK_TYPE_SET, stop_type = GST_SEEK_TYPE_SET;
|
||||
@@ -704,9 +704,8 @@ static void CDECL wg_parser_stream_seek(struct wg_parser_stream *stream, double
|
||||
if ((stop_flags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning)
|
||||
stop_type = GST_SEEK_TYPE_NONE;
|
||||
|
||||
- if (!gst_pad_push_event(stream->my_sink, gst_event_new_seek(rate, GST_FORMAT_TIME,
|
||||
- flags, start_type, start_pos * 100, stop_type, stop_pos * 100)))
|
||||
- GST_ERROR("Failed to seek.\n");
|
||||
+ return gst_pad_push_event(stream->my_sink, gst_event_new_seek(rate,
|
||||
+ GST_FORMAT_TIME, flags, start_type, start_pos * 100, stop_type, stop_pos * 100));
|
||||
}
|
||||
|
||||
static void CDECL wg_parser_stream_notify_qos(struct wg_parser_stream *stream,
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,382 +0,0 @@
|
||||
From 79181b01cb2cb9c6cafd3ea08920e892e37cd654 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Wed, 6 Oct 2021 08:38:12 +1100
|
||||
Subject: [PATCH 13/22] Revert "winegstreamer: Move Unix library definitions
|
||||
into a separate header."
|
||||
|
||||
This reverts commit 84b870bb1fcac27288ed70d28de6a1c2649e9fe6.
|
||||
---
|
||||
dlls/winegstreamer/gst_private.h | 137 ++++++++++++++++++++++++-
|
||||
dlls/winegstreamer/unixlib.h | 165 -------------------------------
|
||||
dlls/winegstreamer/wg_parser.c | 17 +---
|
||||
3 files changed, 140 insertions(+), 179 deletions(-)
|
||||
delete mode 100644 dlls/winegstreamer/unixlib.h
|
||||
|
||||
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
|
||||
index 91c646571cf..3470f7870fa 100644
|
||||
--- a/dlls/winegstreamer/gst_private.h
|
||||
+++ b/dlls/winegstreamer/gst_private.h
|
||||
@@ -36,8 +36,6 @@
|
||||
#include "wine/debug.h"
|
||||
#include "wine/strmbase.h"
|
||||
|
||||
-#include "unixlib.h"
|
||||
-
|
||||
static inline const char *debugstr_time(REFERENCE_TIME time)
|
||||
{
|
||||
ULONGLONG abstime = time >= 0 ? time : -time;
|
||||
@@ -61,6 +59,141 @@ static inline const char *debugstr_time(REFERENCE_TIME time)
|
||||
|
||||
#define MEDIATIME_FROM_BYTES(x) ((LONGLONG)(x) * 10000000)
|
||||
|
||||
+struct wg_format
|
||||
+{
|
||||
+ enum wg_major_type
|
||||
+ {
|
||||
+ WG_MAJOR_TYPE_UNKNOWN,
|
||||
+ WG_MAJOR_TYPE_VIDEO,
|
||||
+ WG_MAJOR_TYPE_AUDIO,
|
||||
+ } major_type;
|
||||
+
|
||||
+ union
|
||||
+ {
|
||||
+ struct
|
||||
+ {
|
||||
+ enum wg_video_format
|
||||
+ {
|
||||
+ WG_VIDEO_FORMAT_UNKNOWN,
|
||||
+
|
||||
+ WG_VIDEO_FORMAT_BGRA,
|
||||
+ WG_VIDEO_FORMAT_BGRx,
|
||||
+ WG_VIDEO_FORMAT_BGR,
|
||||
+ WG_VIDEO_FORMAT_RGB15,
|
||||
+ WG_VIDEO_FORMAT_RGB16,
|
||||
+
|
||||
+ WG_VIDEO_FORMAT_AYUV,
|
||||
+ WG_VIDEO_FORMAT_I420,
|
||||
+ WG_VIDEO_FORMAT_NV12,
|
||||
+ WG_VIDEO_FORMAT_UYVY,
|
||||
+ WG_VIDEO_FORMAT_YUY2,
|
||||
+ WG_VIDEO_FORMAT_YV12,
|
||||
+ WG_VIDEO_FORMAT_YVYU,
|
||||
+
|
||||
+ WG_VIDEO_FORMAT_CINEPAK,
|
||||
+ } format;
|
||||
+ uint32_t width, height;
|
||||
+ uint32_t fps_n, fps_d;
|
||||
+ } video;
|
||||
+ struct
|
||||
+ {
|
||||
+ enum wg_audio_format
|
||||
+ {
|
||||
+ WG_AUDIO_FORMAT_UNKNOWN,
|
||||
+
|
||||
+ WG_AUDIO_FORMAT_U8,
|
||||
+ WG_AUDIO_FORMAT_S16LE,
|
||||
+ WG_AUDIO_FORMAT_S24LE,
|
||||
+ WG_AUDIO_FORMAT_S32LE,
|
||||
+ WG_AUDIO_FORMAT_F32LE,
|
||||
+ WG_AUDIO_FORMAT_F64LE,
|
||||
+
|
||||
+ WG_AUDIO_FORMAT_MPEG1_LAYER1,
|
||||
+ WG_AUDIO_FORMAT_MPEG1_LAYER2,
|
||||
+ WG_AUDIO_FORMAT_MPEG1_LAYER3,
|
||||
+ } format;
|
||||
+
|
||||
+ uint32_t channels;
|
||||
+ uint32_t channel_mask; /* In WinMM format. */
|
||||
+ uint32_t rate;
|
||||
+ } audio;
|
||||
+ } u;
|
||||
+};
|
||||
+
|
||||
+enum wg_parser_event_type
|
||||
+{
|
||||
+ WG_PARSER_EVENT_NONE = 0,
|
||||
+ WG_PARSER_EVENT_BUFFER,
|
||||
+ WG_PARSER_EVENT_EOS,
|
||||
+ WG_PARSER_EVENT_SEGMENT,
|
||||
+};
|
||||
+
|
||||
+struct wg_parser_event
|
||||
+{
|
||||
+ enum wg_parser_event_type type;
|
||||
+ union
|
||||
+ {
|
||||
+ struct
|
||||
+ {
|
||||
+ /* pts and duration are in 100-nanosecond units. */
|
||||
+ ULONGLONG pts, duration;
|
||||
+ uint32_t size;
|
||||
+ bool discontinuity, preroll, delta, has_pts, has_duration;
|
||||
+ } buffer;
|
||||
+ struct
|
||||
+ {
|
||||
+ ULONGLONG position, stop;
|
||||
+ DOUBLE rate;
|
||||
+ } segment;
|
||||
+ } u;
|
||||
+};
|
||||
+C_ASSERT(sizeof(struct wg_parser_event) == 40);
|
||||
+
|
||||
+enum wg_parser_type
|
||||
+{
|
||||
+ WG_PARSER_DECODEBIN,
|
||||
+ WG_PARSER_AVIDEMUX,
|
||||
+ WG_PARSER_MPEGAUDIOPARSE,
|
||||
+ WG_PARSER_WAVPARSE,
|
||||
+};
|
||||
+
|
||||
+struct unix_funcs
|
||||
+{
|
||||
+ struct wg_parser *(CDECL *wg_parser_create)(enum wg_parser_type type, bool unlimited_buffering);
|
||||
+ void (CDECL *wg_parser_destroy)(struct wg_parser *parser);
|
||||
+
|
||||
+ HRESULT (CDECL *wg_parser_connect)(struct wg_parser *parser, uint64_t file_size);
|
||||
+ void (CDECL *wg_parser_disconnect)(struct wg_parser *parser);
|
||||
+
|
||||
+ void (CDECL *wg_parser_begin_flush)(struct wg_parser *parser);
|
||||
+ void (CDECL *wg_parser_end_flush)(struct wg_parser *parser);
|
||||
+
|
||||
+ bool (CDECL *wg_parser_get_next_read_offset)(struct wg_parser *parser,
|
||||
+ uint64_t *offset, uint32_t *size);
|
||||
+ void (CDECL *wg_parser_push_data)(struct wg_parser *parser,
|
||||
+ const void *data, uint32_t size);
|
||||
+
|
||||
+ uint32_t (CDECL *wg_parser_get_stream_count)(struct wg_parser *parser);
|
||||
+ struct wg_parser_stream *(CDECL *wg_parser_get_stream)(struct wg_parser *parser, uint32_t index);
|
||||
+
|
||||
+ void (CDECL *wg_parser_stream_get_preferred_format)(struct wg_parser_stream *stream, struct wg_format *format);
|
||||
+ void (CDECL *wg_parser_stream_enable)(struct wg_parser_stream *stream, const struct wg_format *format);
|
||||
+ void (CDECL *wg_parser_stream_disable)(struct wg_parser_stream *stream);
|
||||
+
|
||||
+ bool (CDECL *wg_parser_stream_get_event)(struct wg_parser_stream *stream, struct wg_parser_event *event);
|
||||
+ bool (CDECL *wg_parser_stream_copy_buffer)(struct wg_parser_stream *stream,
|
||||
+ void *data, uint32_t offset, uint32_t size);
|
||||
+ void (CDECL *wg_parser_stream_release_buffer)(struct wg_parser_stream *stream);
|
||||
+ void (CDECL *wg_parser_stream_notify_qos)(struct wg_parser_stream *stream,
|
||||
+ bool underflow, double proportion, int64_t diff, uint64_t timestamp);
|
||||
+
|
||||
+ /* Returns the duration in 100-nanosecond units. */
|
||||
+ uint64_t (CDECL *wg_parser_stream_get_duration)(struct wg_parser_stream *stream);
|
||||
+ /* start_pos and stop_pos are in 100-nanosecond units. */
|
||||
+ bool (CDECL *wg_parser_stream_seek)(struct wg_parser_stream *stream, double rate,
|
||||
+ uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags);
|
||||
+};
|
||||
+
|
||||
extern const struct unix_funcs *unix_funcs;
|
||||
|
||||
HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN;
|
||||
diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h
|
||||
deleted file mode 100644
|
||||
index e917f7b5557..00000000000
|
||||
--- a/dlls/winegstreamer/unixlib.h
|
||||
+++ /dev/null
|
||||
@@ -1,165 +0,0 @@
|
||||
-/*
|
||||
- * winegstreamer Unix library interface
|
||||
- *
|
||||
- * Copyright 2020-2021 Zebediah Figura for CodeWeavers
|
||||
- *
|
||||
- * This library is free software; you can redistribute it and/or
|
||||
- * modify it under the terms of the GNU Lesser General Public
|
||||
- * License as published by the Free Software Foundation; either
|
||||
- * version 2.1 of the License, or (at your option) any later version.
|
||||
- *
|
||||
- * This library is distributed in the hope that it will be useful,
|
||||
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
- * Lesser General Public License for more details.
|
||||
- *
|
||||
- * You should have received a copy of the GNU Lesser General Public
|
||||
- * License along with this library; if not, write to the Free Software
|
||||
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
- */
|
||||
-
|
||||
-#ifndef __WINE_WINEGSTREAMER_UNIXLIB_H
|
||||
-#define __WINE_WINEGSTREAMER_UNIXLIB_H
|
||||
-
|
||||
-#include <stdbool.h>
|
||||
-#include <stdint.h>
|
||||
-#include "windef.h"
|
||||
-#include "wtypes.h"
|
||||
-#include "mmreg.h"
|
||||
-
|
||||
-struct wg_format
|
||||
-{
|
||||
- enum wg_major_type
|
||||
- {
|
||||
- WG_MAJOR_TYPE_UNKNOWN,
|
||||
- WG_MAJOR_TYPE_VIDEO,
|
||||
- WG_MAJOR_TYPE_AUDIO,
|
||||
- } major_type;
|
||||
-
|
||||
- union
|
||||
- {
|
||||
- struct
|
||||
- {
|
||||
- enum wg_video_format
|
||||
- {
|
||||
- WG_VIDEO_FORMAT_UNKNOWN,
|
||||
-
|
||||
- WG_VIDEO_FORMAT_BGRA,
|
||||
- WG_VIDEO_FORMAT_BGRx,
|
||||
- WG_VIDEO_FORMAT_BGR,
|
||||
- WG_VIDEO_FORMAT_RGB15,
|
||||
- WG_VIDEO_FORMAT_RGB16,
|
||||
-
|
||||
- WG_VIDEO_FORMAT_AYUV,
|
||||
- WG_VIDEO_FORMAT_I420,
|
||||
- WG_VIDEO_FORMAT_NV12,
|
||||
- WG_VIDEO_FORMAT_UYVY,
|
||||
- WG_VIDEO_FORMAT_YUY2,
|
||||
- WG_VIDEO_FORMAT_YV12,
|
||||
- WG_VIDEO_FORMAT_YVYU,
|
||||
-
|
||||
- WG_VIDEO_FORMAT_CINEPAK,
|
||||
- } format;
|
||||
- uint32_t width, height;
|
||||
- uint32_t fps_n, fps_d;
|
||||
- } video;
|
||||
- struct
|
||||
- {
|
||||
- enum wg_audio_format
|
||||
- {
|
||||
- WG_AUDIO_FORMAT_UNKNOWN,
|
||||
-
|
||||
- WG_AUDIO_FORMAT_U8,
|
||||
- WG_AUDIO_FORMAT_S16LE,
|
||||
- WG_AUDIO_FORMAT_S24LE,
|
||||
- WG_AUDIO_FORMAT_S32LE,
|
||||
- WG_AUDIO_FORMAT_F32LE,
|
||||
- WG_AUDIO_FORMAT_F64LE,
|
||||
-
|
||||
- WG_AUDIO_FORMAT_MPEG1_LAYER1,
|
||||
- WG_AUDIO_FORMAT_MPEG1_LAYER2,
|
||||
- WG_AUDIO_FORMAT_MPEG1_LAYER3,
|
||||
- } format;
|
||||
-
|
||||
- uint32_t channels;
|
||||
- uint32_t channel_mask; /* In WinMM format. */
|
||||
- uint32_t rate;
|
||||
- } audio;
|
||||
- } u;
|
||||
-};
|
||||
-
|
||||
-enum wg_parser_event_type
|
||||
-{
|
||||
- WG_PARSER_EVENT_NONE = 0,
|
||||
- WG_PARSER_EVENT_BUFFER,
|
||||
- WG_PARSER_EVENT_EOS,
|
||||
- WG_PARSER_EVENT_SEGMENT,
|
||||
-};
|
||||
-
|
||||
-struct wg_parser_event
|
||||
-{
|
||||
- enum wg_parser_event_type type;
|
||||
- union
|
||||
- {
|
||||
- struct
|
||||
- {
|
||||
- /* pts and duration are in 100-nanosecond units. */
|
||||
- ULONGLONG pts, duration;
|
||||
- uint32_t size;
|
||||
- bool discontinuity, preroll, delta, has_pts, has_duration;
|
||||
- } buffer;
|
||||
- struct
|
||||
- {
|
||||
- ULONGLONG position, stop;
|
||||
- DOUBLE rate;
|
||||
- } segment;
|
||||
- } u;
|
||||
-};
|
||||
-C_ASSERT(sizeof(struct wg_parser_event) == 40);
|
||||
-
|
||||
-enum wg_parser_type
|
||||
-{
|
||||
- WG_PARSER_DECODEBIN,
|
||||
- WG_PARSER_AVIDEMUX,
|
||||
- WG_PARSER_MPEGAUDIOPARSE,
|
||||
- WG_PARSER_WAVPARSE,
|
||||
-};
|
||||
-
|
||||
-struct unix_funcs
|
||||
-{
|
||||
- struct wg_parser *(CDECL *wg_parser_create)(enum wg_parser_type type, bool unlimited_buffering);
|
||||
- void (CDECL *wg_parser_destroy)(struct wg_parser *parser);
|
||||
-
|
||||
- HRESULT (CDECL *wg_parser_connect)(struct wg_parser *parser, uint64_t file_size);
|
||||
- void (CDECL *wg_parser_disconnect)(struct wg_parser *parser);
|
||||
-
|
||||
- void (CDECL *wg_parser_begin_flush)(struct wg_parser *parser);
|
||||
- void (CDECL *wg_parser_end_flush)(struct wg_parser *parser);
|
||||
-
|
||||
- bool (CDECL *wg_parser_get_next_read_offset)(struct wg_parser *parser,
|
||||
- uint64_t *offset, uint32_t *size);
|
||||
- void (CDECL *wg_parser_push_data)(struct wg_parser *parser,
|
||||
- const void *data, uint32_t size);
|
||||
-
|
||||
- uint32_t (CDECL *wg_parser_get_stream_count)(struct wg_parser *parser);
|
||||
- struct wg_parser_stream *(CDECL *wg_parser_get_stream)(struct wg_parser *parser, uint32_t index);
|
||||
-
|
||||
- void (CDECL *wg_parser_stream_get_preferred_format)(struct wg_parser_stream *stream, struct wg_format *format);
|
||||
- void (CDECL *wg_parser_stream_enable)(struct wg_parser_stream *stream, const struct wg_format *format);
|
||||
- void (CDECL *wg_parser_stream_disable)(struct wg_parser_stream *stream);
|
||||
-
|
||||
- bool (CDECL *wg_parser_stream_get_event)(struct wg_parser_stream *stream, struct wg_parser_event *event);
|
||||
- bool (CDECL *wg_parser_stream_copy_buffer)(struct wg_parser_stream *stream,
|
||||
- void *data, uint32_t offset, uint32_t size);
|
||||
- void (CDECL *wg_parser_stream_release_buffer)(struct wg_parser_stream *stream);
|
||||
- void (CDECL *wg_parser_stream_notify_qos)(struct wg_parser_stream *stream,
|
||||
- bool underflow, double proportion, int64_t diff, uint64_t timestamp);
|
||||
-
|
||||
- /* Returns the duration in 100-nanosecond units. */
|
||||
- uint64_t (CDECL *wg_parser_stream_get_duration)(struct wg_parser_stream *stream);
|
||||
- /* start_pos and stop_pos are in 100-nanosecond units. */
|
||||
- bool (CDECL *wg_parser_stream_seek)(struct wg_parser_stream *stream, double rate,
|
||||
- uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags);
|
||||
-};
|
||||
-
|
||||
-#endif /* __WINE_WINEGSTREAMER_UNIXLIB_H */
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index b89a50b5d8f..21278682318 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -25,21 +25,14 @@
|
||||
#endif
|
||||
|
||||
#include "config.h"
|
||||
-
|
||||
-#include <assert.h>
|
||||
-#include <stdarg.h>
|
||||
-#include <stdio.h>
|
||||
-
|
||||
-#include <gst/gst.h>
|
||||
-#include <gst/video/video.h>
|
||||
-#include <gst/audio/audio.h>
|
||||
-
|
||||
#include "ntstatus.h"
|
||||
#define WIN32_NO_STATUS
|
||||
+#include "gst_private.h"
|
||||
#include "winternl.h"
|
||||
-#include "dshow.h"
|
||||
|
||||
-#include "unixlib.h"
|
||||
+#include <gst/gst.h>
|
||||
+#include <gst/video/video.h>
|
||||
+#include <gst/audio/audio.h>
|
||||
|
||||
typedef enum
|
||||
{
|
||||
@@ -1866,7 +1859,7 @@ static void init_gstreamer_once(void)
|
||||
|
||||
if (!gst_init_check(&argc, &argv, &err))
|
||||
{
|
||||
- fprintf(stderr, "winegstreamer: failed to initialize GStreamer: %s\n", err->message);
|
||||
+ fprintf(stderr, "winegstreamer: failed to initialize GStreamer: %s\n", debugstr_a(err->message));
|
||||
g_error_free(err);
|
||||
return;
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,27 +0,0 @@
|
||||
From d4afee5c3a6b8875563c3f931e3eaff3e55b87dc Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sat, 2 Oct 2021 10:35:45 +1000
|
||||
Subject: [PATCH 14/22] Revert "winegstreamer: Remove the no longer used
|
||||
start_dispatch_thread() declaration."
|
||||
|
||||
This reverts commit a87abdbe85779adf6a2a7897bd88984587880693.
|
||||
---
|
||||
dlls/winegstreamer/gst_private.h | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
|
||||
index 3470f7870fa..3b477ba254a 100644
|
||||
--- a/dlls/winegstreamer/gst_private.h
|
||||
+++ b/dlls/winegstreamer/gst_private.h
|
||||
@@ -203,6 +203,8 @@ HRESULT wave_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN;
|
||||
|
||||
BOOL init_gstreamer(void) DECLSPEC_HIDDEN;
|
||||
|
||||
+void start_dispatch_thread(void) DECLSPEC_HIDDEN;
|
||||
+
|
||||
extern HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) DECLSPEC_HIDDEN;
|
||||
extern HRESULT mfplat_DllRegisterServer(void) DECLSPEC_HIDDEN;
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,180 +0,0 @@
|
||||
From 421567d9cdd09b1d9db8410160ac1c106a05f2f9 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sat, 2 Oct 2021 10:35:46 +1000
|
||||
Subject: [PATCH 15/22] Revert "winegstreamer: Set unlimited buffering using a
|
||||
flag for wg_parser_create()."
|
||||
|
||||
This reverts commit 45690320f933d68f613f95f0330098426fc5a08f.
|
||||
---
|
||||
dlls/winegstreamer/gst_private.h | 4 +++-
|
||||
dlls/winegstreamer/media_source.c | 16 +++++++++-------
|
||||
dlls/winegstreamer/quartz_parser.c | 8 ++++----
|
||||
dlls/winegstreamer/wg_parser.c | 21 ++++++++++-----------
|
||||
4 files changed, 26 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
|
||||
index 3b477ba254a..9e5de174984 100644
|
||||
--- a/dlls/winegstreamer/gst_private.h
|
||||
+++ b/dlls/winegstreamer/gst_private.h
|
||||
@@ -159,7 +159,7 @@ enum wg_parser_type
|
||||
|
||||
struct unix_funcs
|
||||
{
|
||||
- struct wg_parser *(CDECL *wg_parser_create)(enum wg_parser_type type, bool unlimited_buffering);
|
||||
+ struct wg_parser *(CDECL *wg_parser_create)(enum wg_parser_type type);
|
||||
void (CDECL *wg_parser_destroy)(struct wg_parser *parser);
|
||||
|
||||
HRESULT (CDECL *wg_parser_connect)(struct wg_parser *parser, uint64_t file_size);
|
||||
@@ -173,6 +173,8 @@ struct unix_funcs
|
||||
void (CDECL *wg_parser_push_data)(struct wg_parser *parser,
|
||||
const void *data, uint32_t size);
|
||||
|
||||
+ void (CDECL *wg_parser_set_unlimited_buffering)(struct wg_parser *parser);
|
||||
+
|
||||
uint32_t (CDECL *wg_parser_get_stream_count)(struct wg_parser *parser);
|
||||
struct wg_parser_stream *(CDECL *wg_parser_get_stream)(struct wg_parser *parser, uint32_t index);
|
||||
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index 18bffca1362..e1e6cdbceb1 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -1421,13 +1421,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
if (FAILED(hr = MFAllocateWorkQueue(&object->async_commands_queue)))
|
||||
goto fail;
|
||||
|
||||
- /* In Media Foundation, sources may read from any media source stream
|
||||
- * without fear of blocking due to buffering limits on another. Trailmakers,
|
||||
- * a Unity3D Engine game, only reads one sample from the audio stream (and
|
||||
- * never deselects it). Remove buffering limits from decodebin in order to
|
||||
- * account for this. Note that this does leak memory, but the same memory
|
||||
- * leak occurs with native. */
|
||||
- if (!(parser = unix_funcs->wg_parser_create(WG_PARSER_DECODEBIN, true)))
|
||||
+ if (!(parser = unix_funcs->wg_parser_create(WG_PARSER_DECODEBIN)))
|
||||
{
|
||||
hr = E_OUTOFMEMORY;
|
||||
goto fail;
|
||||
@@ -1441,6 +1435,14 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
if (FAILED(hr = unix_funcs->wg_parser_connect(parser, file_size)))
|
||||
goto fail;
|
||||
|
||||
+ /* In Media Foundation, sources may read from any media source stream
|
||||
+ * without fear of blocking due to buffering limits on another. Trailmakers,
|
||||
+ * a Unity3D Engine game, only reads one sample from the audio stream (and
|
||||
+ * never deselects it). Remove buffering limits from decodebin in order to
|
||||
+ * account for this. Note that this does leak memory, but the same memory
|
||||
+ * leak occurs with native. */
|
||||
+ unix_funcs->wg_parser_set_unlimited_buffering(parser);
|
||||
+
|
||||
stream_count = unix_funcs->wg_parser_get_stream_count(parser);
|
||||
|
||||
if (!(object->streams = calloc(stream_count, sizeof(*object->streams))))
|
||||
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
|
||||
index a1fa7daec6f..f532b8969de 100644
|
||||
--- a/dlls/winegstreamer/quartz_parser.c
|
||||
+++ b/dlls/winegstreamer/quartz_parser.c
|
||||
@@ -1115,7 +1115,7 @@ HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out)
|
||||
if (!(object = calloc(1, sizeof(*object))))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
- if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_DECODEBIN, false)))
|
||||
+ if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_DECODEBIN)))
|
||||
{
|
||||
free(object);
|
||||
return E_OUTOFMEMORY;
|
||||
@@ -1646,7 +1646,7 @@ HRESULT wave_parser_create(IUnknown *outer, IUnknown **out)
|
||||
if (!(object = calloc(1, sizeof(*object))))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
- if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_WAVPARSE, false)))
|
||||
+ if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_WAVPARSE)))
|
||||
{
|
||||
free(object);
|
||||
return E_OUTOFMEMORY;
|
||||
@@ -1732,7 +1732,7 @@ HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out)
|
||||
if (!(object = calloc(1, sizeof(*object))))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
- if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_AVIDEMUX, false)))
|
||||
+ if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_AVIDEMUX)))
|
||||
{
|
||||
free(object);
|
||||
return E_OUTOFMEMORY;
|
||||
@@ -1839,7 +1839,7 @@ HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out)
|
||||
if (!(object = calloc(1, sizeof(*object))))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
- if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_MPEGAUDIOPARSE, false)))
|
||||
+ if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_MPEGAUDIOPARSE)))
|
||||
{
|
||||
free(object);
|
||||
return E_OUTOFMEMORY;
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index 21278682318..f27ad84df17 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -83,8 +83,6 @@ struct wg_parser
|
||||
} read_request;
|
||||
|
||||
bool flushing, sink_connected;
|
||||
-
|
||||
- bool unlimited_buffering;
|
||||
};
|
||||
|
||||
struct wg_parser_stream
|
||||
@@ -563,6 +561,13 @@ static void CDECL wg_parser_push_data(struct wg_parser *parser,
|
||||
pthread_cond_signal(&parser->read_done_cond);
|
||||
}
|
||||
|
||||
+static void CDECL wg_parser_set_unlimited_buffering(struct wg_parser *parser)
|
||||
+{
|
||||
+ g_object_set(parser->decodebin, "max-size-buffers", G_MAXUINT, NULL);
|
||||
+ g_object_set(parser->decodebin, "max-size-time", G_MAXUINT64, NULL);
|
||||
+ g_object_set(parser->decodebin, "max-size-bytes", G_MAXUINT, NULL);
|
||||
+}
|
||||
+
|
||||
static void CDECL wg_parser_stream_get_preferred_format(struct wg_parser_stream *stream, struct wg_format *format)
|
||||
{
|
||||
*format = stream->preferred_format;
|
||||
@@ -1723,13 +1728,6 @@ static BOOL decodebin_parser_init_gst(struct wg_parser *parser)
|
||||
gst_bin_add(GST_BIN(parser->container), element);
|
||||
parser->decodebin = element;
|
||||
|
||||
- if (parser->unlimited_buffering)
|
||||
- {
|
||||
- g_object_set(parser->decodebin, "max-size-buffers", G_MAXUINT, NULL);
|
||||
- g_object_set(parser->decodebin, "max-size-time", G_MAXUINT64, NULL);
|
||||
- g_object_set(parser->decodebin, "max-size-bytes", G_MAXUINT, NULL);
|
||||
- }
|
||||
-
|
||||
g_signal_connect(element, "pad-added", G_CALLBACK(pad_added_cb), parser);
|
||||
g_signal_connect(element, "pad-removed", G_CALLBACK(pad_removed_cb), parser);
|
||||
g_signal_connect(element, "autoplug-select", G_CALLBACK(autoplug_select_cb), parser);
|
||||
@@ -1870,7 +1868,7 @@ static void init_gstreamer_once(void)
|
||||
gst_version_string(), GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO);
|
||||
}
|
||||
|
||||
-static struct wg_parser * CDECL wg_parser_create(enum wg_parser_type type, bool unlimited_buffering)
|
||||
+static struct wg_parser * CDECL wg_parser_create(enum wg_parser_type type)
|
||||
{
|
||||
static const init_gst_cb init_funcs[] =
|
||||
{
|
||||
@@ -1895,7 +1893,6 @@ static struct wg_parser * CDECL wg_parser_create(enum wg_parser_type type, bool
|
||||
pthread_cond_init(&parser->read_done_cond, NULL);
|
||||
parser->flushing = true;
|
||||
parser->init_gst = init_funcs[type];
|
||||
- parser->unlimited_buffering = unlimited_buffering;
|
||||
|
||||
GST_DEBUG("Created winegstreamer parser %p.\n", parser);
|
||||
return parser;
|
||||
@@ -1931,6 +1928,8 @@ static const struct unix_funcs funcs =
|
||||
wg_parser_get_next_read_offset,
|
||||
wg_parser_push_data,
|
||||
|
||||
+ wg_parser_set_unlimited_buffering,
|
||||
+
|
||||
wg_parser_get_stream_count,
|
||||
wg_parser_get_stream,
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,88 +0,0 @@
|
||||
From 1dd81b5b288ffe70164d06548cfcee61089ca0fd Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sat, 2 Oct 2021 10:35:47 +1000
|
||||
Subject: [PATCH 16/22] Revert "winegstreamer: Initialize GStreamer in
|
||||
wg_parser_create()."
|
||||
|
||||
This reverts commit 3643f73ab61f05ddc9a637f8613c933dda0dd232.
|
||||
---
|
||||
dlls/winegstreamer/wg_parser.c | 47 +++++++++++++++-------------------
|
||||
1 file changed, 21 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index f27ad84df17..e1127b9a059 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -1846,28 +1846,6 @@ static BOOL wave_parser_init_gst(struct wg_parser *parser)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
-static void init_gstreamer_once(void)
|
||||
-{
|
||||
- char arg0[] = "wine";
|
||||
- char arg1[] = "--gst-disable-registry-fork";
|
||||
- char *args[] = {arg0, arg1, NULL};
|
||||
- int argc = ARRAY_SIZE(args) - 1;
|
||||
- char **argv = args;
|
||||
- GError *err;
|
||||
-
|
||||
- if (!gst_init_check(&argc, &argv, &err))
|
||||
- {
|
||||
- fprintf(stderr, "winegstreamer: failed to initialize GStreamer: %s\n", debugstr_a(err->message));
|
||||
- g_error_free(err);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- GST_DEBUG_CATEGORY_INIT(wine, "WINE", GST_DEBUG_FG_RED, "Wine GStreamer support");
|
||||
-
|
||||
- GST_INFO("GStreamer library version %s; wine built with %d.%d.%d.\n",
|
||||
- gst_version_string(), GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO);
|
||||
-}
|
||||
-
|
||||
static struct wg_parser * CDECL wg_parser_create(enum wg_parser_type type)
|
||||
{
|
||||
static const init_gst_cb init_funcs[] =
|
||||
@@ -1878,12 +1856,8 @@ static struct wg_parser * CDECL wg_parser_create(enum wg_parser_type type)
|
||||
[WG_PARSER_WAVPARSE] = wave_parser_init_gst,
|
||||
};
|
||||
|
||||
- static pthread_once_t once = PTHREAD_ONCE_INIT;
|
||||
struct wg_parser *parser;
|
||||
|
||||
- if (pthread_once(&once, init_gstreamer_once))
|
||||
- return NULL;
|
||||
-
|
||||
if (!(parser = calloc(1, sizeof(*parser))))
|
||||
return NULL;
|
||||
|
||||
@@ -1949,6 +1923,27 @@ static const struct unix_funcs funcs =
|
||||
NTSTATUS CDECL __wine_init_unix_lib(HMODULE module, DWORD reason, const void *ptr_in, void *ptr_out)
|
||||
{
|
||||
if (reason == DLL_PROCESS_ATTACH)
|
||||
+ {
|
||||
+ char arg0[] = "wine";
|
||||
+ char arg1[] = "--gst-disable-registry-fork";
|
||||
+ char *args[] = {arg0, arg1, NULL};
|
||||
+ int argc = ARRAY_SIZE(args) - 1;
|
||||
+ char **argv = args;
|
||||
+ GError *err;
|
||||
+
|
||||
+ if (!gst_init_check(&argc, &argv, &err))
|
||||
+ {
|
||||
+ fprintf(stderr, "winegstreamer: failed to initialize GStreamer: %s\n", debugstr_a(err->message));
|
||||
+ g_error_free(err);
|
||||
+ return STATUS_UNSUCCESSFUL;
|
||||
+ }
|
||||
+
|
||||
+ GST_DEBUG_CATEGORY_INIT(wine, "WINE", GST_DEBUG_FG_RED, "Wine GStreamer support");
|
||||
+
|
||||
+ GST_INFO("GStreamer library version %s; wine built with %d.%d.%d.\n",
|
||||
+ gst_version_string(), GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO);
|
||||
+
|
||||
*(const struct unix_funcs **)ptr_out = &funcs;
|
||||
+ }
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,192 +0,0 @@
|
||||
From cf1958f12f33ec46546cac81d958cf38bf9245dc Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sat, 2 Oct 2021 10:35:47 +1000
|
||||
Subject: [PATCH 17/22] Revert "winegstreamer: Use a single wg_parser_create()
|
||||
entry point."
|
||||
|
||||
This reverts commit eab189810d9c40c698bd049d9af647e195cd5993.
|
||||
---
|
||||
dlls/winegstreamer/gst_private.h | 13 +++----
|
||||
dlls/winegstreamer/media_source.c | 2 +-
|
||||
dlls/winegstreamer/quartz_parser.c | 8 ++---
|
||||
dlls/winegstreamer/wg_parser.c | 56 ++++++++++++++++++++++--------
|
||||
4 files changed, 51 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
|
||||
index 9e5de174984..923bba25d38 100644
|
||||
--- a/dlls/winegstreamer/gst_private.h
|
||||
+++ b/dlls/winegstreamer/gst_private.h
|
||||
@@ -149,17 +149,12 @@ struct wg_parser_event
|
||||
};
|
||||
C_ASSERT(sizeof(struct wg_parser_event) == 40);
|
||||
|
||||
-enum wg_parser_type
|
||||
-{
|
||||
- WG_PARSER_DECODEBIN,
|
||||
- WG_PARSER_AVIDEMUX,
|
||||
- WG_PARSER_MPEGAUDIOPARSE,
|
||||
- WG_PARSER_WAVPARSE,
|
||||
-};
|
||||
-
|
||||
struct unix_funcs
|
||||
{
|
||||
- struct wg_parser *(CDECL *wg_parser_create)(enum wg_parser_type type);
|
||||
+ struct wg_parser *(CDECL *wg_decodebin_parser_create)(void);
|
||||
+ struct wg_parser *(CDECL *wg_avi_parser_create)(void);
|
||||
+ struct wg_parser *(CDECL *wg_mpeg_audio_parser_create)(void);
|
||||
+ struct wg_parser *(CDECL *wg_wave_parser_create)(void);
|
||||
void (CDECL *wg_parser_destroy)(struct wg_parser *parser);
|
||||
|
||||
HRESULT (CDECL *wg_parser_connect)(struct wg_parser *parser, uint64_t file_size);
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index e1e6cdbceb1..12ca14ca139 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -1421,7 +1421,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
if (FAILED(hr = MFAllocateWorkQueue(&object->async_commands_queue)))
|
||||
goto fail;
|
||||
|
||||
- if (!(parser = unix_funcs->wg_parser_create(WG_PARSER_DECODEBIN)))
|
||||
+ if (!(parser = unix_funcs->wg_decodebin_parser_create()))
|
||||
{
|
||||
hr = E_OUTOFMEMORY;
|
||||
goto fail;
|
||||
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
|
||||
index f532b8969de..a8e7e3d979f 100644
|
||||
--- a/dlls/winegstreamer/quartz_parser.c
|
||||
+++ b/dlls/winegstreamer/quartz_parser.c
|
||||
@@ -1115,7 +1115,7 @@ HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out)
|
||||
if (!(object = calloc(1, sizeof(*object))))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
- if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_DECODEBIN)))
|
||||
+ if (!(object->wg_parser = unix_funcs->wg_decodebin_parser_create()))
|
||||
{
|
||||
free(object);
|
||||
return E_OUTOFMEMORY;
|
||||
@@ -1646,7 +1646,7 @@ HRESULT wave_parser_create(IUnknown *outer, IUnknown **out)
|
||||
if (!(object = calloc(1, sizeof(*object))))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
- if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_WAVPARSE)))
|
||||
+ if (!(object->wg_parser = unix_funcs->wg_wave_parser_create()))
|
||||
{
|
||||
free(object);
|
||||
return E_OUTOFMEMORY;
|
||||
@@ -1732,7 +1732,7 @@ HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out)
|
||||
if (!(object = calloc(1, sizeof(*object))))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
- if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_AVIDEMUX)))
|
||||
+ if (!(object->wg_parser = unix_funcs->wg_avi_parser_create()))
|
||||
{
|
||||
free(object);
|
||||
return E_OUTOFMEMORY;
|
||||
@@ -1839,7 +1839,7 @@ HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out)
|
||||
if (!(object = calloc(1, sizeof(*object))))
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
- if (!(object->wg_parser = unix_funcs->wg_parser_create(WG_PARSER_MPEGAUDIOPARSE)))
|
||||
+ if (!(object->wg_parser = unix_funcs->wg_mpeg_audio_parser_create()))
|
||||
{
|
||||
free(object);
|
||||
return E_OUTOFMEMORY;
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index e1127b9a059..dde137ef186 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -49,11 +49,9 @@ typedef enum
|
||||
GST_DEBUG_CATEGORY_STATIC(wine);
|
||||
#define GST_CAT_DEFAULT wine
|
||||
|
||||
-typedef BOOL (*init_gst_cb)(struct wg_parser *parser);
|
||||
-
|
||||
struct wg_parser
|
||||
{
|
||||
- init_gst_cb init_gst;
|
||||
+ BOOL (*init_gst)(struct wg_parser *parser);
|
||||
|
||||
struct wg_parser_stream **streams;
|
||||
unsigned int stream_count;
|
||||
@@ -1846,16 +1844,8 @@ static BOOL wave_parser_init_gst(struct wg_parser *parser)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
-static struct wg_parser * CDECL wg_parser_create(enum wg_parser_type type)
|
||||
+static struct wg_parser *wg_parser_create(void)
|
||||
{
|
||||
- static const init_gst_cb init_funcs[] =
|
||||
- {
|
||||
- [WG_PARSER_DECODEBIN] = decodebin_parser_init_gst,
|
||||
- [WG_PARSER_AVIDEMUX] = avi_parser_init_gst,
|
||||
- [WG_PARSER_MPEGAUDIOPARSE] = mpeg_audio_parser_init_gst,
|
||||
- [WG_PARSER_WAVPARSE] = wave_parser_init_gst,
|
||||
- };
|
||||
-
|
||||
struct wg_parser *parser;
|
||||
|
||||
if (!(parser = calloc(1, sizeof(*parser))))
|
||||
@@ -1866,12 +1856,47 @@ static struct wg_parser * CDECL wg_parser_create(enum wg_parser_type type)
|
||||
pthread_cond_init(&parser->read_cond, NULL);
|
||||
pthread_cond_init(&parser->read_done_cond, NULL);
|
||||
parser->flushing = true;
|
||||
- parser->init_gst = init_funcs[type];
|
||||
|
||||
GST_DEBUG("Created winegstreamer parser %p.\n", parser);
|
||||
return parser;
|
||||
}
|
||||
|
||||
+static struct wg_parser * CDECL wg_decodebin_parser_create(void)
|
||||
+{
|
||||
+ struct wg_parser *parser;
|
||||
+
|
||||
+ if ((parser = wg_parser_create()))
|
||||
+ parser->init_gst = decodebin_parser_init_gst;
|
||||
+ return parser;
|
||||
+}
|
||||
+
|
||||
+static struct wg_parser * CDECL wg_avi_parser_create(void)
|
||||
+{
|
||||
+ struct wg_parser *parser;
|
||||
+
|
||||
+ if ((parser = wg_parser_create()))
|
||||
+ parser->init_gst = avi_parser_init_gst;
|
||||
+ return parser;
|
||||
+}
|
||||
+
|
||||
+static struct wg_parser * CDECL wg_mpeg_audio_parser_create(void)
|
||||
+{
|
||||
+ struct wg_parser *parser;
|
||||
+
|
||||
+ if ((parser = wg_parser_create()))
|
||||
+ parser->init_gst = mpeg_audio_parser_init_gst;
|
||||
+ return parser;
|
||||
+}
|
||||
+
|
||||
+static struct wg_parser * CDECL wg_wave_parser_create(void)
|
||||
+{
|
||||
+ struct wg_parser *parser;
|
||||
+
|
||||
+ if ((parser = wg_parser_create()))
|
||||
+ parser->init_gst = wave_parser_init_gst;
|
||||
+ return parser;
|
||||
+}
|
||||
+
|
||||
static void CDECL wg_parser_destroy(struct wg_parser *parser)
|
||||
{
|
||||
if (parser->bus)
|
||||
@@ -1890,7 +1915,10 @@ static void CDECL wg_parser_destroy(struct wg_parser *parser)
|
||||
|
||||
static const struct unix_funcs funcs =
|
||||
{
|
||||
- wg_parser_create,
|
||||
+ wg_decodebin_parser_create,
|
||||
+ wg_avi_parser_create,
|
||||
+ wg_mpeg_audio_parser_create,
|
||||
+ wg_wave_parser_create,
|
||||
wg_parser_destroy,
|
||||
|
||||
wg_parser_connect,
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 5e55fd289a3baca9c53757c3b7ace7e5f51040f4 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sun, 19 Sep 2021 13:07:56 +1000
|
||||
Subject: [PATCH 18/22] Revert "winegstreamer: Fix return code in init_gst
|
||||
failure case."
|
||||
|
||||
This reverts commit b9a7e961cdd39203866be38e90b1d901595d54ba.
|
||||
---
|
||||
dlls/winegstreamer/quartz_parser.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
|
||||
index a8e7e3d979f..5299f4dc2ed 100644
|
||||
--- a/dlls/winegstreamer/quartz_parser.c
|
||||
+++ b/dlls/winegstreamer/quartz_parser.c
|
||||
@@ -982,10 +982,7 @@ static HRESULT parser_sink_connect(struct strmbase_sink *iface, IPin *peer, cons
|
||||
goto err;
|
||||
|
||||
if (!filter->init_gst(filter))
|
||||
- {
|
||||
- hr = E_FAIL;
|
||||
goto err;
|
||||
- }
|
||||
|
||||
for (i = 0; i < filter->source_count; ++i)
|
||||
{
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,224 +0,0 @@
|
||||
From eb244f666ec0ed78a7ca101f735c6555648c8da6 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sun, 19 Sep 2021 13:08:02 +1000
|
||||
Subject: [PATCH 19/22] Revert "winegstreamer: Allocate source media buffers in
|
||||
the PE components."
|
||||
|
||||
This reverts commit 8b7390f80d866435f06f2571a93bcd67c0947673.
|
||||
---
|
||||
dlls/winegstreamer/gst_private.h | 7 +++----
|
||||
dlls/winegstreamer/media_source.c | 28 ++++------------------------
|
||||
dlls/winegstreamer/quartz_parser.c | 26 +++-----------------------
|
||||
dlls/winegstreamer/wg_parser.c | 28 +++++++++++++---------------
|
||||
4 files changed, 23 insertions(+), 66 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
|
||||
index 923bba25d38..c5e4367811f 100644
|
||||
--- a/dlls/winegstreamer/gst_private.h
|
||||
+++ b/dlls/winegstreamer/gst_private.h
|
||||
@@ -163,10 +163,9 @@ struct unix_funcs
|
||||
void (CDECL *wg_parser_begin_flush)(struct wg_parser *parser);
|
||||
void (CDECL *wg_parser_end_flush)(struct wg_parser *parser);
|
||||
|
||||
- bool (CDECL *wg_parser_get_next_read_offset)(struct wg_parser *parser,
|
||||
- uint64_t *offset, uint32_t *size);
|
||||
- void (CDECL *wg_parser_push_data)(struct wg_parser *parser,
|
||||
- const void *data, uint32_t size);
|
||||
+ bool (CDECL *wg_parser_get_read_request)(struct wg_parser *parser,
|
||||
+ void **data, uint64_t *offset, uint32_t *size);
|
||||
+ void (CDECL *wg_parser_complete_read_request)(struct wg_parser *parser, bool ret);
|
||||
|
||||
void (CDECL *wg_parser_set_unlimited_buffering)(struct wg_parser *parser);
|
||||
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index 12ca14ca139..87959546a7c 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -613,11 +613,6 @@ static DWORD CALLBACK read_thread(void *arg)
|
||||
{
|
||||
struct media_source *source = arg;
|
||||
IMFByteStream *byte_stream = source->byte_stream;
|
||||
- uint32_t buffer_size = 0;
|
||||
- uint64_t file_size;
|
||||
- void *data = NULL;
|
||||
-
|
||||
- IMFByteStream_GetLength(byte_stream, &file_size);
|
||||
|
||||
TRACE("Starting read thread for media source %p.\n", source);
|
||||
|
||||
@@ -627,33 +622,18 @@ static DWORD CALLBACK read_thread(void *arg)
|
||||
ULONG ret_size;
|
||||
uint32_t size;
|
||||
HRESULT hr;
|
||||
+ void *data;
|
||||
|
||||
- if (!unix_funcs->wg_parser_get_next_read_offset(source->wg_parser, &offset, &size))
|
||||
+ if (!unix_funcs->wg_parser_get_read_request(source->wg_parser, &data, &offset, &size))
|
||||
continue;
|
||||
|
||||
- if (offset >= file_size)
|
||||
- size = 0;
|
||||
- else if (offset + size >= file_size)
|
||||
- size = file_size - offset;
|
||||
-
|
||||
- if (size > buffer_size)
|
||||
- {
|
||||
- buffer_size = size;
|
||||
- data = realloc(data, size);
|
||||
- }
|
||||
-
|
||||
- ret_size = 0;
|
||||
-
|
||||
if (SUCCEEDED(hr = IMFByteStream_SetCurrentPosition(byte_stream, offset)))
|
||||
hr = IMFByteStream_Read(byte_stream, data, size, &ret_size);
|
||||
- if (FAILED(hr))
|
||||
- ERR("Failed to read %u bytes at offset %I64u, hr %#x.\n", size, offset, hr);
|
||||
- else if (ret_size != size)
|
||||
+ if (SUCCEEDED(hr) && ret_size != size)
|
||||
ERR("Unexpected short read: requested %u bytes, got %u.\n", size, ret_size);
|
||||
- unix_funcs->wg_parser_push_data(source->wg_parser, SUCCEEDED(hr) ? data : NULL, ret_size);
|
||||
+ unix_funcs->wg_parser_complete_read_request(source->wg_parser, SUCCEEDED(hr));
|
||||
}
|
||||
|
||||
- free(data);
|
||||
TRACE("Media source is shutting down; exiting.\n");
|
||||
return 0;
|
||||
}
|
||||
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
|
||||
index 5299f4dc2ed..09a916d7f5c 100644
|
||||
--- a/dlls/winegstreamer/quartz_parser.c
|
||||
+++ b/dlls/winegstreamer/quartz_parser.c
|
||||
@@ -785,11 +785,6 @@ static DWORD CALLBACK stream_thread(void *arg)
|
||||
static DWORD CALLBACK read_thread(void *arg)
|
||||
{
|
||||
struct parser *filter = arg;
|
||||
- LONGLONG file_size, unused;
|
||||
- uint32_t buffer_size = 0;
|
||||
- void *data = NULL;
|
||||
-
|
||||
- IAsyncReader_Length(filter->reader, &file_size, &unused);
|
||||
|
||||
TRACE("Starting read thread for filter %p.\n", filter);
|
||||
|
||||
@@ -798,29 +793,14 @@ static DWORD CALLBACK read_thread(void *arg)
|
||||
uint64_t offset;
|
||||
uint32_t size;
|
||||
HRESULT hr;
|
||||
+ void *data;
|
||||
|
||||
- if (!unix_funcs->wg_parser_get_next_read_offset(filter->wg_parser, &offset, &size))
|
||||
+ if (!unix_funcs->wg_parser_get_read_request(filter->wg_parser, &data, &offset, &size))
|
||||
continue;
|
||||
-
|
||||
- if (offset >= file_size)
|
||||
- size = 0;
|
||||
- else if (offset + size >= file_size)
|
||||
- size = file_size - offset;
|
||||
-
|
||||
- if (size > buffer_size)
|
||||
- {
|
||||
- buffer_size = size;
|
||||
- data = realloc(data, size);
|
||||
- }
|
||||
-
|
||||
hr = IAsyncReader_SyncRead(filter->reader, offset, size, data);
|
||||
- if (FAILED(hr))
|
||||
- ERR("Failed to read %u bytes at offset %I64u, hr %#x.\n", size, offset, hr);
|
||||
-
|
||||
- unix_funcs->wg_parser_push_data(filter->wg_parser, SUCCEEDED(hr) ? data : NULL, size);
|
||||
+ unix_funcs->wg_parser_complete_read_request(filter->wg_parser, SUCCEEDED(hr));
|
||||
}
|
||||
|
||||
- free(data);
|
||||
TRACE("Streaming stopped; exiting.\n");
|
||||
return 0;
|
||||
}
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index dde137ef186..e12cb08776b 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -524,8 +524,8 @@ static void CDECL wg_parser_end_flush(struct wg_parser *parser)
|
||||
pthread_mutex_unlock(&parser->mutex);
|
||||
}
|
||||
|
||||
-static bool CDECL wg_parser_get_next_read_offset(struct wg_parser *parser,
|
||||
- uint64_t *offset, uint32_t *size)
|
||||
+static bool CDECL wg_parser_get_read_request(struct wg_parser *parser,
|
||||
+ void **data, uint64_t *offset, uint32_t *size)
|
||||
{
|
||||
pthread_mutex_lock(&parser->mutex);
|
||||
|
||||
@@ -538,6 +538,7 @@ static bool CDECL wg_parser_get_next_read_offset(struct wg_parser *parser,
|
||||
return false;
|
||||
}
|
||||
|
||||
+ *data = parser->read_request.data;
|
||||
*offset = parser->read_request.offset;
|
||||
*size = parser->read_request.size;
|
||||
|
||||
@@ -545,15 +546,11 @@ static bool CDECL wg_parser_get_next_read_offset(struct wg_parser *parser,
|
||||
return true;
|
||||
}
|
||||
|
||||
-static void CDECL wg_parser_push_data(struct wg_parser *parser,
|
||||
- const void *data, uint32_t size)
|
||||
+static void CDECL wg_parser_complete_read_request(struct wg_parser *parser, bool ret)
|
||||
{
|
||||
pthread_mutex_lock(&parser->mutex);
|
||||
- parser->read_request.size = size;
|
||||
parser->read_request.done = true;
|
||||
- parser->read_request.ret = !!data;
|
||||
- if (data)
|
||||
- memcpy(parser->read_request.data, data, size);
|
||||
+ parser->read_request.ret = ret;
|
||||
parser->read_request.data = NULL;
|
||||
pthread_mutex_unlock(&parser->mutex);
|
||||
pthread_cond_signal(&parser->read_done_cond);
|
||||
@@ -1224,6 +1221,10 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent,
|
||||
if (offset == GST_BUFFER_OFFSET_NONE)
|
||||
offset = parser->next_pull_offset;
|
||||
parser->next_pull_offset = offset + size;
|
||||
+ if (offset >= parser->file_size)
|
||||
+ return GST_FLOW_EOS;
|
||||
+ if (offset + size >= parser->file_size)
|
||||
+ size = parser->file_size - offset;
|
||||
|
||||
if (!*buffer)
|
||||
*buffer = new_buffer = gst_buffer_new_and_alloc(size);
|
||||
@@ -1247,7 +1248,6 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent,
|
||||
pthread_cond_wait(&parser->read_done_cond, &parser->mutex);
|
||||
|
||||
ret = parser->read_request.ret;
|
||||
- gst_buffer_set_size(*buffer, parser->read_request.size);
|
||||
|
||||
pthread_mutex_unlock(&parser->mutex);
|
||||
|
||||
@@ -1255,12 +1255,10 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent,
|
||||
|
||||
GST_LOG("Request returned %d.", ret);
|
||||
|
||||
- if ((!ret || !size) && new_buffer)
|
||||
+ if (!ret && new_buffer)
|
||||
gst_buffer_unref(new_buffer);
|
||||
|
||||
- if (ret)
|
||||
- return size ? GST_FLOW_OK : GST_FLOW_EOS;
|
||||
- return GST_FLOW_ERROR;
|
||||
+ return ret ? GST_FLOW_OK : GST_FLOW_ERROR;
|
||||
}
|
||||
|
||||
static gboolean src_query_cb(GstPad *pad, GstObject *parent, GstQuery *query)
|
||||
@@ -1927,8 +1925,8 @@ static const struct unix_funcs funcs =
|
||||
wg_parser_begin_flush,
|
||||
wg_parser_end_flush,
|
||||
|
||||
- wg_parser_get_next_read_offset,
|
||||
- wg_parser_push_data,
|
||||
+ wg_parser_get_read_request,
|
||||
+ wg_parser_complete_read_request,
|
||||
|
||||
wg_parser_set_unlimited_buffering,
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
@ -1,221 +0,0 @@
|
||||
From ee5ed3858dd7747358b2627511be3369f10a54c5 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Sun, 19 Sep 2021 13:08:03 +1000
|
||||
Subject: [PATCH 20/22] Revert "winegstreamer: Duplicate source shutdown path
|
||||
into constructor with leak fixes."
|
||||
|
||||
This reverts commit 67734bfce31d6032cee1a8980a9022665e9e18fa.
|
||||
---
|
||||
dlls/winegstreamer/gst_private.h | 1 -
|
||||
dlls/winegstreamer/media_source.c | 102 +++++++++++-------------------
|
||||
2 files changed, 37 insertions(+), 66 deletions(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
|
||||
index c5e4367811f..9a753a01b46 100644
|
||||
--- a/dlls/winegstreamer/gst_private.h
|
||||
+++ b/dlls/winegstreamer/gst_private.h
|
||||
@@ -22,7 +22,6 @@
|
||||
#define __GST_PRIVATE_INCLUDED__
|
||||
|
||||
#include <assert.h>
|
||||
-#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index 87959546a7c..64d40fd6fb6 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -817,12 +817,6 @@ static HRESULT new_media_stream(struct media_source *source,
|
||||
object->IMFMediaStream_iface.lpVtbl = &media_stream_vtbl;
|
||||
object->ref = 1;
|
||||
|
||||
- if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
|
||||
- {
|
||||
- free(object);
|
||||
- return hr;
|
||||
- }
|
||||
-
|
||||
IMFMediaSource_AddRef(&source->IMFMediaSource_iface);
|
||||
object->parent_source = source;
|
||||
object->stream_id = stream_id;
|
||||
@@ -831,11 +825,20 @@ static HRESULT new_media_stream(struct media_source *source,
|
||||
object->eos = FALSE;
|
||||
object->wg_stream = wg_stream;
|
||||
|
||||
+ if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
|
||||
+ goto fail;
|
||||
+
|
||||
TRACE("Created stream object %p.\n", object);
|
||||
|
||||
*out_stream = object;
|
||||
|
||||
return S_OK;
|
||||
+
|
||||
+fail:
|
||||
+ WARN("Failed to construct media stream, hr %#x.\n", hr);
|
||||
+
|
||||
+ IMFMediaStream_Release(&object->IMFMediaStream_iface);
|
||||
+ return hr;
|
||||
}
|
||||
|
||||
static HRESULT media_stream_init_desc(struct media_stream *stream)
|
||||
@@ -928,16 +931,10 @@ static HRESULT media_stream_init_desc(struct media_stream *stream)
|
||||
goto done;
|
||||
|
||||
if (FAILED(hr = IMFStreamDescriptor_GetMediaTypeHandler(stream->descriptor, &type_handler)))
|
||||
- {
|
||||
- IMFStreamDescriptor_Release(stream->descriptor);
|
||||
goto done;
|
||||
- }
|
||||
|
||||
if (FAILED(hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, stream_types[0])))
|
||||
- {
|
||||
- IMFStreamDescriptor_Release(stream->descriptor);
|
||||
goto done;
|
||||
- }
|
||||
|
||||
done:
|
||||
if (type_handler)
|
||||
@@ -1309,13 +1306,19 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
|
||||
|
||||
unix_funcs->wg_parser_disconnect(source->wg_parser);
|
||||
|
||||
- source->read_thread_shutdown = true;
|
||||
- WaitForSingleObject(source->read_thread, INFINITE);
|
||||
- CloseHandle(source->read_thread);
|
||||
+ if (source->read_thread)
|
||||
+ {
|
||||
+ source->read_thread_shutdown = true;
|
||||
+ WaitForSingleObject(source->read_thread, INFINITE);
|
||||
+ CloseHandle(source->read_thread);
|
||||
+ }
|
||||
|
||||
- IMFPresentationDescriptor_Release(source->pres_desc);
|
||||
- IMFMediaEventQueue_Shutdown(source->event_queue);
|
||||
- IMFByteStream_Release(source->byte_stream);
|
||||
+ if (source->pres_desc)
|
||||
+ IMFPresentationDescriptor_Release(source->pres_desc);
|
||||
+ if (source->event_queue)
|
||||
+ IMFMediaEventQueue_Shutdown(source->event_queue);
|
||||
+ if (source->byte_stream)
|
||||
+ IMFByteStream_Release(source->byte_stream);
|
||||
|
||||
for (i = 0; i < source->stream_count; i++)
|
||||
{
|
||||
@@ -1323,18 +1326,23 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
|
||||
|
||||
stream->state = STREAM_SHUTDOWN;
|
||||
|
||||
- IMFMediaEventQueue_Shutdown(stream->event_queue);
|
||||
- IMFStreamDescriptor_Release(stream->descriptor);
|
||||
- IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface);
|
||||
+ if (stream->event_queue)
|
||||
+ IMFMediaEventQueue_Shutdown(stream->event_queue);
|
||||
+ if (stream->descriptor)
|
||||
+ IMFStreamDescriptor_Release(stream->descriptor);
|
||||
+ if (stream->parent_source)
|
||||
+ IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface);
|
||||
|
||||
IMFMediaStream_Release(&stream->IMFMediaStream_iface);
|
||||
}
|
||||
|
||||
unix_funcs->wg_parser_destroy(source->wg_parser);
|
||||
|
||||
- free(source->streams);
|
||||
+ if (source->stream_count)
|
||||
+ free(source->streams);
|
||||
|
||||
- MFUnlockWorkQueue(source->async_commands_queue);
|
||||
+ if (source->async_commands_queue)
|
||||
+ MFUnlockWorkQueue(source->async_commands_queue);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
@@ -1359,7 +1367,6 @@ static const IMFMediaSourceVtbl IMFMediaSource_vtbl =
|
||||
static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_source **out_media_source)
|
||||
{
|
||||
IMFStreamDescriptor **descriptors = NULL;
|
||||
- unsigned int stream_count = UINT_MAX;
|
||||
struct media_source *object;
|
||||
UINT64 total_pres_time = 0;
|
||||
struct wg_parser *parser;
|
||||
@@ -1423,15 +1430,15 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
* leak occurs with native. */
|
||||
unix_funcs->wg_parser_set_unlimited_buffering(parser);
|
||||
|
||||
- stream_count = unix_funcs->wg_parser_get_stream_count(parser);
|
||||
+ object->stream_count = unix_funcs->wg_parser_get_stream_count(parser);
|
||||
|
||||
- if (!(object->streams = calloc(stream_count, sizeof(*object->streams))))
|
||||
+ if (!(object->streams = calloc(object->stream_count, sizeof(*object->streams))))
|
||||
{
|
||||
hr = E_OUTOFMEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- for (i = 0; i < stream_count; ++i)
|
||||
+ for (i = 0; i < object->stream_count; ++i)
|
||||
{
|
||||
if (FAILED(hr = new_media_stream(object, unix_funcs->wg_parser_get_stream(parser, i), i, &object->streams[i])))
|
||||
goto fail;
|
||||
@@ -1439,13 +1446,9 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
if (FAILED(hr = media_stream_init_desc(object->streams[i])))
|
||||
{
|
||||
ERR("Failed to finish initialization of media stream %p, hr %x.\n", object->streams[i], hr);
|
||||
- IMFMediaSource_Release(&object->streams[i]->parent_source->IMFMediaSource_iface);
|
||||
- IMFMediaEventQueue_Release(object->streams[i]->event_queue);
|
||||
- free(object->streams[i]);
|
||||
+ IMFMediaStream_Release(&object->streams[i]->IMFMediaStream_iface);
|
||||
goto fail;
|
||||
}
|
||||
-
|
||||
- object->stream_count++;
|
||||
}
|
||||
|
||||
/* init presentation descriptor */
|
||||
@@ -1482,39 +1485,8 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
fail:
|
||||
WARN("Failed to construct MFMediaSource, hr %#x.\n", hr);
|
||||
|
||||
- if (descriptors)
|
||||
- {
|
||||
- for (i = 0; i < object->stream_count; i++)
|
||||
- IMFStreamDescriptor_Release(descriptors[i]);
|
||||
- free(descriptors);
|
||||
- }
|
||||
- for (i = 0; i < object->stream_count; i++)
|
||||
- {
|
||||
- struct media_stream *stream = object->streams[i];
|
||||
-
|
||||
- IMFMediaEventQueue_Release(stream->event_queue);
|
||||
- IMFStreamDescriptor_Release(stream->descriptor);
|
||||
- IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface);
|
||||
-
|
||||
- free(stream);
|
||||
- }
|
||||
- free(object->streams);
|
||||
- if (stream_count != UINT_MAX)
|
||||
- unix_funcs->wg_parser_disconnect(object->wg_parser);
|
||||
- if (object->read_thread)
|
||||
- {
|
||||
- object->read_thread_shutdown = true;
|
||||
- WaitForSingleObject(object->read_thread, INFINITE);
|
||||
- CloseHandle(object->read_thread);
|
||||
- }
|
||||
- if (object->wg_parser)
|
||||
- unix_funcs->wg_parser_destroy(object->wg_parser);
|
||||
- if (object->async_commands_queue)
|
||||
- MFUnlockWorkQueue(object->async_commands_queue);
|
||||
- if (object->event_queue)
|
||||
- IMFMediaEventQueue_Release(object->event_queue);
|
||||
- IMFByteStream_Release(object->byte_stream);
|
||||
- free(object);
|
||||
+ free(descriptors);
|
||||
+ IMFMediaSource_Release(&object->IMFMediaSource_iface);
|
||||
return hr;
|
||||
}
|
||||
|
||||
--
|
||||
2.33.0
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user