From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winedmo/main.c | 34 ++++++++++++++++++++++++++++++++++ dlls/winedmo/unix_demuxer.c | 36 ++++++++++++++++++++++++++++++++++++ dlls/winedmo/unix_private.h | 2 ++ dlls/winedmo/unixlib.c | 4 ++++ dlls/winedmo/unixlib.h | 13 +++++++++++++ dlls/winedmo/winedmo.spec | 2 ++ include/wine/winedmo.h | 4 ++++ 7 files changed, 95 insertions(+)
diff --git a/dlls/winedmo/main.c b/dlls/winedmo/main.c index b9bbfa664c7..c2bdf4f89f5 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -51,3 +51,37 @@ NTSTATUS CDECL winedmo_demuxer_check( const char *mime_type ) if ((status = UNIX_CALL( demuxer_check, ¶ms ))) WARN( "returning %#lx\n", status ); return status; } + +NTSTATUS CDECL winedmo_demuxer_create( struct winedmo_demuxer *demuxer ) +{ + struct demuxer_create_params params = {0}; + NTSTATUS status; + + TRACE( "demuxer %p\n", demuxer ); + + if ((status = UNIX_CALL( demuxer_create, ¶ms ))) + { + WARN( "demuxer_create failed, status %#lx\n", status ); + return status; + } + + *demuxer = params.demuxer; + TRACE( "created %#I64x\n", demuxer->handle ); + return STATUS_SUCCESS; +} + +NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ) +{ + struct demuxer_destroy_params params = {.demuxer = *demuxer}; + NTSTATUS status; + + if (!demuxer->handle) return STATUS_SUCCESS; + + TRACE( "demuxer %#I64x\n", demuxer->handle ); + + demuxer->handle = 0; + status = UNIX_CALL( demuxer_destroy, ¶ms ); + if (status) WARN( "demuxer_destroy failed, status %#lx\n", status ); + + return status; +} diff --git a/dlls/winedmo/unix_demuxer.c b/dlls/winedmo/unix_demuxer.c index 1abb173fdc7..bc352d96599 100644 --- a/dlls/winedmo/unix_demuxer.c +++ b/dlls/winedmo/unix_demuxer.c @@ -29,6 +29,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(dmo);
+static AVFormatContext *get_demuxer( struct winedmo_demuxer demuxer ) +{ + return (AVFormatContext *)(UINT_PTR)demuxer.handle; +} + NTSTATUS demuxer_check( void *arg ) { struct demuxer_check_params *params = arg; @@ -49,4 +54,35 @@ NTSTATUS demuxer_check( void *arg ) return format ? STATUS_SUCCESS : STATUS_NOT_SUPPORTED; }
+NTSTATUS demuxer_create( void *arg ) +{ + struct demuxer_create_params *params = arg; + AVFormatContext *ctx; + + TRACE( "params %p\n", params ); + + if (!(ctx = avformat_alloc_context())) return STATUS_NO_MEMORY; + if (!(ctx->pb = avio_alloc_context( NULL, 0, 0, NULL, NULL, NULL, NULL ))) + { + avformat_free_context( ctx ); + return STATUS_NO_MEMORY; + } + + params->demuxer.handle = (UINT_PTR)ctx; + return STATUS_SUCCESS; +} + +NTSTATUS demuxer_destroy( void *arg ) +{ + struct demuxer_destroy_params *params = arg; + AVFormatContext *ctx = get_demuxer( params->demuxer ); + + TRACE( "context %p\n", ctx ); + + avio_context_free( &ctx->pb ); + avformat_free_context( ctx ); + + return STATUS_SUCCESS; +} + #endif /* HAVE_FFMPEG */ diff --git a/dlls/winedmo/unix_private.h b/dlls/winedmo/unix_private.h index cc58df9d818..d84645b835b 100644 --- a/dlls/winedmo/unix_private.h +++ b/dlls/winedmo/unix_private.h @@ -30,3 +30,5 @@
/* unix_demuxer.c */ extern NTSTATUS demuxer_check( void * ); +extern NTSTATUS demuxer_create( void * ); +extern NTSTATUS demuxer_destroy( void * ); diff --git a/dlls/winedmo/unixlib.c b/dlls/winedmo/unixlib.c index 2d7980b1790..6a37469a052 100644 --- a/dlls/winedmo/unixlib.c +++ b/dlls/winedmo/unixlib.c @@ -69,6 +69,8 @@ const unixlib_entry_t __wine_unix_call_funcs[] = X( process_attach ),
X( demuxer_check ), + X( demuxer_create ), + X( demuxer_destroy ), };
C_ASSERT(ARRAY_SIZE(__wine_unix_call_funcs) == unix_funcs_count); @@ -81,6 +83,8 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = X( process_attach ),
X( demuxer_check ), + X( demuxer_create ), + X( 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 787fe141174..a8a2e00dc19 100644 --- a/dlls/winedmo/unixlib.h +++ b/dlls/winedmo/unixlib.h @@ -28,6 +28,7 @@ #include "winbase.h"
#include "wine/unixlib.h" +#include "wine/winedmo.h"
struct demuxer_check_params @@ -35,12 +36,24 @@ struct demuxer_check_params char mime_type[256]; };
+struct demuxer_create_params +{ + struct winedmo_demuxer demuxer; +}; + +struct demuxer_destroy_params +{ + struct winedmo_demuxer demuxer; +}; +
enum unix_funcs { unix_process_attach,
unix_demuxer_check, + unix_demuxer_create, + unix_demuxer_destroy,
unix_funcs_count, }; diff --git a/dlls/winedmo/winedmo.spec b/dlls/winedmo/winedmo.spec index 661703b6c50..2cea1655719 100644 --- a/dlls/winedmo/winedmo.spec +++ b/dlls/winedmo/winedmo.spec @@ -1 +1,3 @@ @ cdecl winedmo_demuxer_check(str) +@ cdecl winedmo_demuxer_create(ptr) +@ cdecl winedmo_demuxer_destroy(ptr) diff --git a/include/wine/winedmo.h b/include/wine/winedmo.h index 06ac1e04261..e60995d4f6b 100644 --- a/include/wine/winedmo.h +++ b/include/wine/winedmo.h @@ -26,6 +26,10 @@ #include "winbase.h" #include "winternl.h"
+struct winedmo_demuxer { UINT64 handle; }; + NTSTATUS CDECL winedmo_demuxer_check( const char *mime_type ); +NTSTATUS CDECL winedmo_demuxer_create( struct winedmo_demuxer *demuxer ); +NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer );
#endif /* __WINE_WINEDMO_H */