From: Ziqing Hui <zhui(a)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 */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3303