From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winedmo/main.c | 18 +++++++++++++++++ dlls/winedmo/unix_demuxer.c | 5 +++-- dlls/winedmo/unixlib.c | 40 +++++++++++++++++++++++++++++++++++-- dlls/winedmo/unixlib.h | 7 +++++++ 4 files changed, 66 insertions(+), 4 deletions(-)
diff --git a/dlls/winedmo/main.c b/dlls/winedmo/main.c index 9fc572082cd..0c3187697bb 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -23,6 +23,21 @@ WINE_DEFAULT_DEBUG_CHANNEL(dmo);
+static struct stream_context *stream_context_create(void) +{ + struct stream_context *context; + + if (!(context = malloc( sizeof(*context) ))) return NULL; + + return context; +} + +static void stream_context_destroy( struct stream_context *context ) +{ + free( context ); +} + + static NTSTATUS WINAPI seek_callback( void *args, ULONG size ) { struct seek_callback_params *params = args; @@ -81,9 +96,11 @@ NTSTATUS CDECL winedmo_demuxer_create( struct winedmo_demuxer *demuxer )
TRACE( "demuxer %p\n", demuxer );
+ if (!(params.context = stream_context_create())) return STATUS_NO_MEMORY; if ((status = UNIX_CALL( demuxer_create, ¶ms ))) { WARN( "demuxer_create failed, status %#lx\n", status ); + stream_context_destroy( params.context ); return status; }
@@ -104,6 +121,7 @@ NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ) demuxer->handle = 0; status = UNIX_CALL( demuxer_destroy, ¶ms ); if (status) WARN( "demuxer_destroy failed, status %#lx\n", status ); + else stream_context_destroy( params.context );
return status; } diff --git a/dlls/winedmo/unix_demuxer.c b/dlls/winedmo/unix_demuxer.c index 3a177559b5a..e4e8c949d0d 100644 --- a/dlls/winedmo/unix_demuxer.c +++ b/dlls/winedmo/unix_demuxer.c @@ -65,10 +65,10 @@ NTSTATUS demuxer_create( void *arg ) AVFormatContext *ctx; int ret;
- TRACE( "params %p\n", params ); + TRACE( "context %p\n", params->context );
if (!(ctx = avformat_alloc_context())) return STATUS_NO_MEMORY; - if (!(ctx->pb = avio_alloc_context( NULL, 0, 0, NULL, unix_read_callback, NULL, unix_seek_callback ))) + if (!(ctx->pb = avio_alloc_context( NULL, 0, 0, params->context, unix_read_callback, NULL, unix_seek_callback ))) { avformat_free_context( ctx ); return STATUS_NO_MEMORY; @@ -93,6 +93,7 @@ NTSTATUS demuxer_destroy( void *arg )
TRACE( "context %p\n", ctx );
+ params->context = ctx->pb->opaque; avio_context_free( &ctx->pb ); avformat_free_context( ctx );
diff --git a/dlls/winedmo/unixlib.c b/dlls/winedmo/unixlib.c index 0ab05bd7bc2..d79b6e45591 100644 --- a/dlls/winedmo/unixlib.c +++ b/dlls/winedmo/unixlib.c @@ -120,14 +120,50 @@ C_ASSERT(ARRAY_SIZE(__wine_unix_call_funcs) == unix_funcs_count);
#ifdef _WIN64
+typedef ULONG PTR32; + +static NTSTATUS wow64_demuxer_create( void *arg ) +{ + struct + { + PTR32 context; + struct winedmo_demuxer demuxer; + } *params32 = arg; + struct demuxer_create_params params; + NTSTATUS status; + + params.context = UintToPtr( params32->context ); + if ((status = demuxer_create( ¶ms ))) return status; + params32->demuxer = params.demuxer; + + return status; +} + +static NTSTATUS wow64_demuxer_destroy( void *arg ) +{ + struct + { + struct winedmo_demuxer demuxer; + PTR32 context; + } *params32 = arg; + struct demuxer_create_params params; + NTSTATUS status; + + params.demuxer = params32->demuxer; + if ((status = demuxer_destroy( ¶ms ))) return status; + params32->context = PtrToUint( params.context ); + + return status; +} + const unixlib_entry_t __wine_unix_call_wow64_funcs[] = { #define X64( name ) [unix_##name] = wow64_##name X( process_attach ),
X( demuxer_check ), - X( demuxer_create ), - X( demuxer_destroy ), + X64( demuxer_create ), + X64( demuxer_destroy ), };
C_ASSERT(ARRAY_SIZE(__wine_unix_call_wow64_funcs) == unix_funcs_count); diff --git a/dlls/winedmo/unixlib.h b/dlls/winedmo/unixlib.h index 4b0f533cbb4..891d401aeb5 100644 --- a/dlls/winedmo/unixlib.h +++ b/dlls/winedmo/unixlib.h @@ -37,6 +37,11 @@ struct process_attach_params UINT64 read_callback; };
+struct stream_context +{ + UINT64 placeholder; +}; + struct seek_callback_params { struct dispatch_callback_params dispatch; @@ -59,12 +64,14 @@ struct demuxer_check_params
struct demuxer_create_params { + struct stream_context *context; struct winedmo_demuxer demuxer; };
struct demuxer_destroy_params { struct winedmo_demuxer demuxer; + struct stream_context *context; };