From: Ziqing Hui zhui@codeweavers.com
--- dlls/winegstreamer/gst_private.h | 3 ++ dlls/winegstreamer/main.c | 42 +++++++++++++++++++++++++ dlls/winegstreamer/unix_private.h | 3 ++ dlls/winegstreamer/unixlib.h | 17 ++++++++++ dlls/winegstreamer/wg_muxer.c | 52 +++++++++++++++++++++++++++++++ dlls/winegstreamer/wg_parser.c | 23 ++++++++++++++ 6 files changed, 140 insertions(+)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 5c69a9ca316..614675ce99d 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -114,6 +114,9 @@ HRESULT wg_muxer_create(struct wg_container_format *format, wg_muxer_t *muxer); void wg_muxer_destroy(wg_muxer_t muxer); HRESULT wg_muxer_add_stream(wg_muxer_t muxer, UINT32 stream_id, const struct wg_format *format); 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);
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 6d2dd5b6026..afc237bcb61 100644 --- a/dlls/winegstreamer/main.c +++ b/dlls/winegstreamer/main.c @@ -509,6 +509,48 @@ HRESULT wg_muxer_push_sample(wg_muxer_t muxer, struct wg_sample *sample) return WINE_UNIX_CALL(unix_wg_muxer_push_sample, ¶ms); }
+HRESULT wg_muxer_get_buffer(wg_muxer_t muxer, uint32_t *size, uint64_t *offset) +{ + struct wg_muxer_get_buffer_params params = + { + .muxer = muxer, + .size = 0, + .offset = UINT64_MAX, + }; + NTSTATUS status; + + TRACE("muxer %#I64x, size %p.\n", muxer, size); + + if (SUCCEEDED(status = WINE_UNIX_CALL(unix_wg_muxer_get_buffer, ¶ms))) + { + *size = params.size; + *offset = params.offset; + } + + return status; +} + +HRESULT wg_muxer_copy_buffer(wg_muxer_t muxer, void *buffer, uint32_t size) +{ + struct wg_muxer_copy_buffer_params params = + { + .muxer = muxer, + .buffer = buffer, + .size = size, + }; + + TRACE("muxer %#I64x, buffer %p, size %u.\n", muxer, buffer, size); + + return WINE_UNIX_CALL(unix_wg_muxer_copy_buffer, ¶ms); +} + +void wg_muxer_free_buffer(wg_muxer_t muxer) +{ + TRACE("muxer %#I64x.\n", muxer); + + WINE_UNIX_CALL(unix_wg_muxer_free_buffer, &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 eeafeffb78a..0aad76322b3 100644 --- a/dlls/winegstreamer/unix_private.h +++ b/dlls/winegstreamer/unix_private.h @@ -65,6 +65,9 @@ extern NTSTATUS wg_muxer_create(void *args) DECLSPEC_HIDDEN; extern NTSTATUS wg_muxer_destroy(void *args) DECLSPEC_HIDDEN; extern NTSTATUS wg_muxer_add_stream(void *args) DECLSPEC_HIDDEN; 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;
/* wg_allocator.c */
diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index 8292c72ba45..f9d0ba5a0d6 100644 --- a/dlls/winegstreamer/unixlib.h +++ b/dlls/winegstreamer/unixlib.h @@ -409,6 +409,20 @@ struct wg_muxer_push_sample_params struct wg_sample *sample; };
+struct wg_muxer_get_buffer_params +{ + wg_muxer_t muxer; + UINT32 size; + UINT64 offset; +}; + +struct wg_muxer_copy_buffer_params +{ + wg_muxer_t muxer; + void *buffer; + UINT32 size; +}; + enum unix_funcs { unix_wg_init_gstreamer, @@ -453,6 +467,9 @@ enum unix_funcs unix_wg_muxer_destroy, unix_wg_muxer_add_stream, unix_wg_muxer_push_sample, + unix_wg_muxer_get_buffer, + unix_wg_muxer_copy_buffer, + unix_wg_muxer_free_buffer, };
#endif /* __WINE_WINEGSTREAMER_UNIXLIB_H */ diff --git a/dlls/winegstreamer/wg_muxer.c b/dlls/winegstreamer/wg_muxer.c index 9e02eef4d96..cea3790776c 100644 --- a/dlls/winegstreamer/wg_muxer.c +++ b/dlls/winegstreamer/wg_muxer.c @@ -430,3 +430,55 @@ NTSTATUS wg_muxer_push_sample(void *args)
return S_OK; } + +NTSTATUS wg_muxer_get_buffer(void *args) +{ + struct wg_muxer_get_buffer_params *params = args; + struct wg_muxer *muxer = get_muxer(params->muxer); + + if (!muxer->buffer) + { + if (!(muxer->buffer = gst_atomic_queue_pop(muxer->output_queue))) + return MF_E_SINK_NO_SAMPLES_PROCESSED; + + if (!gst_buffer_map(muxer->buffer, &muxer->map_info, GST_MAP_READ)) + { + GST_ERROR("Failed to map buffer %p, dropped.", muxer->buffer); + gst_buffer_unref(muxer->buffer); + muxer->buffer = NULL; + return E_FAIL; + } + } + + params->size = muxer->map_info.size; + if (GST_BUFFER_OFFSET_IS_VALID(muxer->buffer)) + params->offset = GST_BUFFER_OFFSET(muxer->buffer); + + return S_OK; +} + +NTSTATUS wg_muxer_copy_buffer(void *args) +{ + struct wg_muxer_copy_buffer_params *params = args; + struct wg_muxer *muxer = get_muxer(params->muxer); + + if (!muxer->buffer) + return MF_E_SINK_NO_SAMPLES_PROCESSED; + + if (params->size < muxer->map_info.size) + return MF_E_BUFFERTOOSMALL; + + memcpy(params->buffer, muxer->map_info.data, muxer->map_info.size); + + return S_OK; +} + +NTSTATUS wg_muxer_free_buffer(void *args) +{ + struct wg_muxer *muxer = get_muxer(*(wg_muxer_t *)args); + + if (muxer->buffer) + muxer_free_buffer(muxer); + + return S_OK; +} diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 30b30b405b2..ce082161efa 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -1950,6 +1950,9 @@ const unixlib_entry_t __wine_unix_call_funcs[] = X(wg_muxer_destroy), X(wg_muxer_add_stream), X(wg_muxer_push_sample), + X(wg_muxer_get_buffer), + X(wg_muxer_copy_buffer), + X(wg_muxer_free_buffer), };
#ifdef _WIN64 @@ -2206,6 +2209,23 @@ NTSTATUS wow64_wg_muxer_push_sample(void *args) return wg_muxer_push_sample(¶ms); }
+NTSTATUS wow64_wg_muxer_copy_buffer(void *args) +{ + struct + { + wg_muxer_t muxer; + PTR32 buffer; + UINT32 size; + } *params32 = args; + struct wg_muxer_copy_buffer_params params = + { + .muxer = params32->muxer, + .buffer = ULongToPtr(params32->buffer), + .size = params32->size, + }; + return wg_muxer_copy_buffer(¶ms); +} + const unixlib_entry_t __wine_unix_call_wow64_funcs[] = { #define X64(name) [unix_ ## name] = wow64_ ## name @@ -2251,6 +2271,9 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = X(wg_muxer_destroy), X64(wg_muxer_add_stream), X64(wg_muxer_push_sample), + X(wg_muxer_get_buffer), + X64(wg_muxer_copy_buffer), + X(wg_muxer_free_buffer), };
#endif /* _WIN64 */