From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/mfsrcsnk/media_source.c | 29 +--------------- dlls/winedmo/main.c | 66 ++++++++++++++++++++++++------------ dlls/winedmo/winedmo.spec | 9 +---- include/wine/winedmo.h | 25 ++++++++------ 4 files changed, 62 insertions(+), 67 deletions(-) diff --git a/dlls/mfsrcsnk/media_source.c b/dlls/mfsrcsnk/media_source.c index a67abd877c9..0f7cdd4e2b2 100644 --- a/dlls/mfsrcsnk/media_source.c +++ b/dlls/mfsrcsnk/media_source.c @@ -26,30 +26,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(mfplat); -struct winedmo_demuxer_funcs -{ - NTSTATUS (*CDECL create)( const WCHAR *url, struct winedmo_stream *stream, UINT64 stream_size, INT64 *duration, - UINT *stream_count, WCHAR *mime_type, struct winedmo_demuxer *demuxer ); - NTSTATUS (*CDECL destroy)( struct winedmo_demuxer *demuxer ); - NTSTATUS (*CDECL read)( struct winedmo_demuxer demuxer, UINT *stream, DMO_OUTPUT_DATA_BUFFER *buffer, UINT *buffer_size ); - NTSTATUS (*CDECL seek)( struct winedmo_demuxer demuxer, INT64 timestamp ); - NTSTATUS (*CDECL stream_lang)( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ); - NTSTATUS (*CDECL stream_name)( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ); - NTSTATUS (*CDECL stream_type)( struct winedmo_demuxer demuxer, UINT stream, - GUID *major, union winedmo_format **format ); -}; - -static const struct winedmo_demuxer_funcs winedmo_demuxer_funcs = -{ - winedmo_demuxer_create, - winedmo_demuxer_destroy, - winedmo_demuxer_read, - winedmo_demuxer_seek, - winedmo_demuxer_stream_lang, - winedmo_demuxer_stream_name, - winedmo_demuxer_stream_type, -}; - static BOOL use_gst_byte_stream_handler(void) { BOOL result; @@ -68,10 +44,7 @@ static const struct winedmo_demuxer_funcs *get_demuxer_funcs(const char *mime_ty if (use_gst_byte_stream_handler()) return NULL; - if (!winedmo_demuxer_check(mime_type)) - return &winedmo_demuxer_funcs; - - return NULL; + return winedmo_get_demuxer_funcs(mime_type, WINEDMO_DEMUXER_VERSION); } #define DEFINE_MF_ASYNC_PARAMS(type) \ diff --git a/dlls/winedmo/main.c b/dlls/winedmo/main.c index 671e632b16d..27263b64826 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -159,20 +159,9 @@ static void buffer_unlock( DMO_OUTPUT_DATA_BUFFER *buffer, struct sample *sample } -NTSTATUS CDECL winedmo_demuxer_check( const char *mime_type ) -{ - struct demuxer_check_params params = {0}; - NTSTATUS status; - - TRACE( "mime_type %s\n", debugstr_a(mime_type) ); - lstrcpynA( params.mime_type, mime_type, sizeof(params.mime_type) ); - - if ((status = UNIX_CALL( demuxer_check, ¶ms ))) WARN( "returning %#lx\n", status ); - return status; -} - -NTSTATUS CDECL winedmo_demuxer_create( const WCHAR *url, struct winedmo_stream *stream, UINT64 stream_size, INT64 *duration, - UINT *stream_count, WCHAR *mime_type, struct winedmo_demuxer *demuxer ) +static NTSTATUS CDECL winedmo_demuxer_create( const WCHAR *url, struct winedmo_stream *stream, + UINT64 stream_size, INT64 *duration, UINT *stream_count, + WCHAR *mime_type, struct winedmo_demuxer *demuxer ) { struct demuxer_create_params params = {0}; char *tmp = NULL; @@ -208,7 +197,7 @@ NTSTATUS CDECL winedmo_demuxer_create( const WCHAR *url, struct winedmo_stream * return STATUS_SUCCESS; } -NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ) +static NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ) { struct demuxer_destroy_params params = {.demuxer = *demuxer}; NTSTATUS status; @@ -225,7 +214,8 @@ NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ) return status; } -NTSTATUS CDECL winedmo_demuxer_read( struct winedmo_demuxer demuxer, UINT *stream, DMO_OUTPUT_DATA_BUFFER *buffer, UINT *buffer_size ) +static NTSTATUS CDECL winedmo_demuxer_read( struct winedmo_demuxer demuxer, UINT *stream, + DMO_OUTPUT_DATA_BUFFER *buffer, UINT *buffer_size ) { struct demuxer_read_params params = {.demuxer = demuxer}; NTSTATUS status; @@ -249,7 +239,7 @@ NTSTATUS CDECL winedmo_demuxer_read( struct winedmo_demuxer demuxer, UINT *strea return status; } -NTSTATUS CDECL winedmo_demuxer_seek( struct winedmo_demuxer demuxer, INT64 timestamp ) +static NTSTATUS CDECL winedmo_demuxer_seek( struct winedmo_demuxer demuxer, INT64 timestamp ) { struct demuxer_seek_params params = {.demuxer = demuxer, .timestamp = timestamp}; NTSTATUS status; @@ -265,7 +255,7 @@ NTSTATUS CDECL winedmo_demuxer_seek( struct winedmo_demuxer demuxer, INT64 times return STATUS_SUCCESS; } -NTSTATUS CDECL winedmo_demuxer_stream_lang( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ) +static NTSTATUS CDECL winedmo_demuxer_stream_lang( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ) { struct demuxer_stream_lang_params params = {.demuxer = demuxer, .stream = stream}; NTSTATUS status; @@ -283,7 +273,7 @@ NTSTATUS CDECL winedmo_demuxer_stream_lang( struct winedmo_demuxer demuxer, UINT return STATUS_SUCCESS; } -NTSTATUS CDECL winedmo_demuxer_stream_name( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ) +static NTSTATUS CDECL winedmo_demuxer_stream_name( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ) { struct demuxer_stream_name_params params = {.demuxer = demuxer, .stream = stream}; NTSTATUS status; @@ -326,10 +316,44 @@ static HRESULT get_media_type( UINT code, void *params, struct media_type *media return status; } -NTSTATUS CDECL winedmo_demuxer_stream_type( struct winedmo_demuxer demuxer, UINT stream, - GUID *major, union winedmo_format **format ) +static NTSTATUS CDECL winedmo_demuxer_stream_type( struct winedmo_demuxer demuxer, UINT stream, + GUID *major, union winedmo_format **format ) { struct demuxer_stream_type_params params = {.demuxer = demuxer, .stream = stream}; TRACE( "demuxer %#I64x, stream %u, major %p, format %p\n", demuxer.handle, stream, major, format ); return get_media_type( unix_demuxer_stream_type, ¶ms, ¶ms.media_type, major, format ); } + +static const struct winedmo_demuxer_funcs winedmo_demuxer_funcs = +{ + winedmo_demuxer_create, + winedmo_demuxer_destroy, + winedmo_demuxer_read, + winedmo_demuxer_seek, + winedmo_demuxer_stream_lang, + winedmo_demuxer_stream_name, + winedmo_demuxer_stream_type, +}; + +const struct winedmo_demuxer_funcs *CDECL winedmo_get_demuxer_funcs( const char *mime_type, UINT version ) +{ + struct demuxer_check_params params = {0}; + NTSTATUS status; + + TRACE( "version %u, mime_type %s\n", version, debugstr_a(mime_type) ); + + if (version != WINEDMO_DEMUXER_VERSION) + { + ERR( "version mismatch, client wants %u but module has %u\n", version, WINEDMO_DEMUXER_VERSION ); + return NULL; + } + + lstrcpynA( params.mime_type, mime_type, sizeof(params.mime_type) ); + if ((status = UNIX_CALL( demuxer_check, ¶ms ))) + { + WARN( "unsupported mime type %s demuxer, status %#lx\n", debugstr_a(mime_type), status ); + return NULL; + } + + return &winedmo_demuxer_funcs; +} diff --git a/dlls/winedmo/winedmo.spec b/dlls/winedmo/winedmo.spec index 90eff030dfd..81940eb6f17 100644 --- a/dlls/winedmo/winedmo.spec +++ b/dlls/winedmo/winedmo.spec @@ -1,8 +1 @@ -@ cdecl winedmo_demuxer_check(str) -@ cdecl winedmo_demuxer_create(wstr ptr int64 ptr ptr ptr ptr) -@ cdecl winedmo_demuxer_destroy(ptr) -@ cdecl winedmo_demuxer_read(int64 ptr ptr ptr) -@ cdecl winedmo_demuxer_seek(int64 int64) -@ cdecl winedmo_demuxer_stream_lang(int64 long ptr long) -@ cdecl winedmo_demuxer_stream_name(int64 long ptr long) -@ cdecl winedmo_demuxer_stream_type(int64 long ptr ptr) +@ cdecl winedmo_get_demuxer_funcs(long str ptr) diff --git a/include/wine/winedmo.h b/include/wine/winedmo.h index c068dfa1de8..2f152112a65 100644 --- a/include/wine/winedmo.h +++ b/include/wine/winedmo.h @@ -42,15 +42,20 @@ struct winedmo_stream struct winedmo_demuxer { UINT64 handle; }; -NTSTATUS CDECL winedmo_demuxer_check( const char *mime_type ); -NTSTATUS CDECL winedmo_demuxer_create( const WCHAR *url, struct winedmo_stream *stream, UINT64 stream_size, INT64 *duration, - UINT *stream_count, WCHAR *mime_type, struct winedmo_demuxer *demuxer ); -NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ); -NTSTATUS CDECL winedmo_demuxer_read( struct winedmo_demuxer demuxer, UINT *stream, DMO_OUTPUT_DATA_BUFFER *buffer, UINT *buffer_size ); -NTSTATUS CDECL winedmo_demuxer_seek( struct winedmo_demuxer demuxer, INT64 timestamp ); -NTSTATUS CDECL winedmo_demuxer_stream_lang( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ); -NTSTATUS CDECL winedmo_demuxer_stream_name( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ); -NTSTATUS CDECL winedmo_demuxer_stream_type( struct winedmo_demuxer demuxer, UINT stream, - GUID *major, union winedmo_format **format ); +struct winedmo_demuxer_funcs +{ + NTSTATUS (*CDECL create)( const WCHAR *url, struct winedmo_stream *stream, UINT64 stream_size, INT64 *duration, + UINT *stream_count, WCHAR *mime_type, struct winedmo_demuxer *demuxer ); + NTSTATUS (*CDECL destroy)( struct winedmo_demuxer *demuxer ); + NTSTATUS (*CDECL read)( struct winedmo_demuxer demuxer, UINT *stream, DMO_OUTPUT_DATA_BUFFER *buffer, UINT *buffer_size ); + NTSTATUS (*CDECL seek)( struct winedmo_demuxer demuxer, INT64 timestamp ); + NTSTATUS (*CDECL stream_lang)( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ); + NTSTATUS (*CDECL stream_name)( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ); + NTSTATUS (*CDECL stream_type)( struct winedmo_demuxer demuxer, UINT stream, + GUID *major, union winedmo_format **format ); +}; +#define WINEDMO_DEMUXER_VERSION 1 /* increment when changing the demuxer API */ + +const struct winedmo_demuxer_funcs *CDECL winedmo_get_demuxer_funcs( const char *mime_type, UINT version ); #endif /* __WINE_WINEDMO_H */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9913