From: Ziqing Hui zhui@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 1 + dlls/winegstreamer/main.c | 7 +++++++ dlls/winegstreamer/unix_private.h | 1 + dlls/winegstreamer/unixlib.h | 1 + dlls/winegstreamer/wg_muxer.c | 30 ++++++++++++++++++++++++++++++ dlls/winegstreamer/wg_parser.c | 2 ++ 6 files changed, 42 insertions(+)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 614675ce99d..66deb3702ec 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -117,6 +117,7 @@ HRESULT wg_muxer_push_sample(wg_muxer_t muxer, struct wg_sample *sample); HRESULT wg_muxer_get_buffer(wg_muxer_t muxer, uint32_t *size, uint64_t *offset); HRESULT wg_muxer_copy_buffer(wg_muxer_t muxer, void *buffer, UINT32 size); void wg_muxer_free_buffer(wg_muxer_t muxer); +HRESULT wg_muxer_finalize(wg_muxer_t muxer);
unsigned int wg_format_get_max_size(const struct wg_format *format);
diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c index afc237bcb61..d5b208d3cf3 100644 --- a/dlls/winegstreamer/main.c +++ b/dlls/winegstreamer/main.c @@ -551,6 +551,13 @@ void wg_muxer_free_buffer(wg_muxer_t muxer) WINE_UNIX_CALL(unix_wg_muxer_free_buffer, &muxer); }
+HRESULT wg_muxer_finalize(wg_muxer_t muxer) +{ + TRACE("muxer %#I64x.\n", muxer); + + return WINE_UNIX_CALL(unix_wg_muxer_finalize, &muxer); +} + #define ALIGN(n, alignment) (((n) + (alignment) - 1) & ~((alignment) - 1))
unsigned int wg_format_get_stride(const struct wg_format *format) diff --git a/dlls/winegstreamer/unix_private.h b/dlls/winegstreamer/unix_private.h index 0aad76322b3..e011655a58f 100644 --- a/dlls/winegstreamer/unix_private.h +++ b/dlls/winegstreamer/unix_private.h @@ -68,6 +68,7 @@ extern NTSTATUS wg_muxer_push_sample(void *args) DECLSPEC_HIDDEN; extern NTSTATUS wg_muxer_get_buffer(void *args) DECLSPEC_HIDDEN; extern NTSTATUS wg_muxer_copy_buffer(void *args) DECLSPEC_HIDDEN; extern NTSTATUS wg_muxer_free_buffer(void *args) DECLSPEC_HIDDEN; +extern NTSTATUS wg_muxer_finalize(void *args) DECLSPEC_HIDDEN;
/* wg_allocator.c */
diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index f9d0ba5a0d6..60e25fc1689 100644 --- a/dlls/winegstreamer/unixlib.h +++ b/dlls/winegstreamer/unixlib.h @@ -470,6 +470,7 @@ enum unix_funcs unix_wg_muxer_get_buffer, unix_wg_muxer_copy_buffer, unix_wg_muxer_free_buffer, + unix_wg_muxer_finalize, };
#endif /* __WINE_WINEGSTREAMER_UNIXLIB_H */ diff --git a/dlls/winegstreamer/wg_muxer.c b/dlls/winegstreamer/wg_muxer.c index cea3790776c..2de31c86ea8 100644 --- a/dlls/winegstreamer/wg_muxer.c +++ b/dlls/winegstreamer/wg_muxer.c @@ -44,6 +44,7 @@ struct wg_muxer
pthread_mutex_t mutex; pthread_cond_t cond; + bool eos; guint64 offset;
struct list streams; @@ -165,6 +166,13 @@ static gboolean muxer_sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *ev
switch (event->type) { + case GST_EVENT_EOS: + pthread_mutex_lock(&muxer->mutex); + muxer->eos = true; + pthread_mutex_unlock(&muxer->mutex); + pthread_cond_signal(&muxer->cond); + break; + case GST_EVENT_SEGMENT: pthread_mutex_lock(&muxer->mutex);
@@ -482,3 +490,25 @@ NTSTATUS wg_muxer_free_buffer(void *args)
return S_OK; } + +NTSTATUS wg_muxer_finalize(void *args) +{ + struct wg_muxer *muxer = get_muxer(*(wg_muxer_t *)args); + struct wg_muxer_stream *stream; + + /* Notify each stream of EOS. */ + LIST_FOR_EACH_ENTRY(stream, &muxer->streams, struct wg_muxer_stream, entry) + { + if (!push_event(stream->my_src, gst_event_new_segment_done(GST_FORMAT_BYTES, -1)) + || !push_event(stream->my_src, gst_event_new_eos())) + return E_FAIL; + } + + /* Wait for muxer EOS. */ + pthread_mutex_lock(&muxer->mutex); + while (!muxer->eos) + pthread_cond_wait(&muxer->cond, &muxer->mutex); + pthread_mutex_unlock(&muxer->mutex); + + return S_OK; +} diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index ce082161efa..7424851ef0c 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -1953,6 +1953,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = X(wg_muxer_get_buffer), X(wg_muxer_copy_buffer), X(wg_muxer_free_buffer), + X(wg_muxer_finalize), };
#ifdef _WIN64 @@ -2274,6 +2275,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = X(wg_muxer_get_buffer), X64(wg_muxer_copy_buffer), X(wg_muxer_free_buffer), + X(wg_muxer_finalize), };
#endif /* _WIN64 */