From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfsrcsnk/media_source.c | 4 ++-- dlls/winedmo/main.c | 22 +++++++++++++++++----- dlls/winedmo/unix_demuxer.c | 12 +++++++++--- dlls/winedmo/unixlib.c | 2 ++ dlls/winedmo/unixlib.h | 1 + dlls/winedmo/winedmo.spec | 2 +- include/wine/winedmo.h | 2 +- 7 files changed, 33 insertions(+), 12 deletions(-)
diff --git a/dlls/mfsrcsnk/media_source.c b/dlls/mfsrcsnk/media_source.c index e573e7d322a..79255074498 100644 --- a/dlls/mfsrcsnk/media_source.c +++ b/dlls/mfsrcsnk/media_source.c @@ -517,8 +517,8 @@ static HRESULT media_source_async_create(struct media_source *source, IMFAsyncRe source->winedmo_stream.p_seek = media_source_seek_cb; source->winedmo_stream.p_read = media_source_read_cb;
- if ((status = winedmo_demuxer_create(&source->winedmo_stream, &source->file_size, source->mime_type, - &source->winedmo_demuxer))) + if ((status = winedmo_demuxer_create(source->url, &source->winedmo_stream, &source->file_size, + source->mime_type, &source->winedmo_demuxer))) { WARN("Failed to create demuxer, status %#lx\n", status); hr = HRESULT_FROM_NT(status); diff --git a/dlls/winedmo/main.c b/dlls/winedmo/main.c index 27cfdea8620..87ea214337e 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -126,16 +126,28 @@ NTSTATUS CDECL winedmo_demuxer_check( const char *mime_type ) return status; }
-NTSTATUS CDECL winedmo_demuxer_create( struct winedmo_stream *stream, UINT64 *stream_size, +NTSTATUS CDECL winedmo_demuxer_create( const WCHAR *url, struct winedmo_stream *stream, UINT64 *stream_size, WCHAR *mime_type, struct winedmo_demuxer *demuxer ) { struct demuxer_create_params params = {0}; + char *tmp = NULL; NTSTATUS status; + UINT len;
- TRACE( "stream %p, stream_size %#I64x, mime_type %p, demuxer %p\n", stream, *stream_size, mime_type, demuxer ); + TRACE( "url %s, stream %p, stream_size %#I64x, mime_type %p, demuxer %p\n", debugstr_w(url), + stream, *stream_size, mime_type, demuxer );
if (!(params.context = stream_context_create( stream, stream_size ))) return STATUS_NO_MEMORY; - if ((status = UNIX_CALL( demuxer_create, ¶ms ))) + + if (url && (len = WideCharToMultiByte( CP_ACP, 0, url, -1, NULL, 0, NULL, NULL )) && (tmp = malloc( len ))) + { + WideCharToMultiByte( CP_ACP, 0, url, -1, tmp, len, NULL, NULL ); + params.url = tmp; + } + status = UNIX_CALL( demuxer_create, ¶ms ); + free( tmp ); + + if (status) { WARN( "demuxer_create failed, status %#lx\n", status ); stream_context_destroy( params.context ); @@ -144,8 +156,8 @@ NTSTATUS CDECL winedmo_demuxer_create( struct winedmo_stream *stream, UINT64 *st
MultiByteToWideChar( CP_ACP, 0, params.mime_type, -1, mime_type, 256 ); *demuxer = params.demuxer; - TRACE( "created demuxer %#I64x, stream %p, stream_size %#I64x, mime_type %s\n", demuxer->handle, - stream, *stream_size, debugstr_a(params.mime_type) ); + TRACE( "created demuxer %#I64x, url %s, stream %p, stream_size %#I64x, mime_type %s\n", demuxer->handle, + debugstr_w(url), stream, *stream_size, debugstr_a(params.mime_type) ); return STATUS_SUCCESS; }
diff --git a/dlls/winedmo/unix_demuxer.c b/dlls/winedmo/unix_demuxer.c index c67170e0c41..4ddd25630e0 100644 --- a/dlls/winedmo/unix_demuxer.c +++ b/dlls/winedmo/unix_demuxer.c @@ -62,10 +62,11 @@ NTSTATUS demuxer_check( void *arg ) NTSTATUS demuxer_create( void *arg ) { struct demuxer_create_params *params = arg; + const char *ext = params->url ? strrchr( params->url, '.' ) : ""; AVFormatContext *ctx; int ret;
- TRACE( "context %p\n", params->context ); + TRACE( "context %p, url %s, mime %s\n", params->context, debugstr_a(params->url), debugstr_a(params->mime_type) );
if (!(ctx = avformat_alloc_context())) return STATUS_NO_MEMORY; if (!(ctx->pb = avio_alloc_context( NULL, 0, 0, params->context, unix_read_callback, NULL, unix_seek_callback ))) @@ -88,10 +89,15 @@ NTSTATUS demuxer_create( void *arg ) else if (strstr( ctx->iformat->name, "mpeg" )) strcpy( params->mime_type, "video/mpeg" ); else if (strstr( ctx->iformat->name, "mp3" )) strcpy( params->mime_type, "audio/mp3" ); else if (strstr( ctx->iformat->name, "wav" )) strcpy( params->mime_type, "audio/wav" ); - else if (strstr( ctx->iformat->name, "asf" )) strcpy( params->mime_type, "video/x-ms-asf" ); + else if (strstr( ctx->iformat->name, "asf" )) + { + if (!strcmp( ext, ".wma" )) strcpy( params->mime_type, "audio/x-ms-wma" ); + else if (!strcmp( ext, ".wmv" )) strcpy( params->mime_type, "video/x-ms-wmv" ); + else strcpy( params->mime_type, "video/x-ms-asf" ); + } else { - FIXME( "Unknown MIME type for format %s\n", debugstr_a(ctx->iformat->name) ); + FIXME( "Unknown MIME type for format %s, url %s\n", debugstr_a(ctx->iformat->name), debugstr_a(params->url) ); strcpy( params->mime_type, "video/x-application" ); }
diff --git a/dlls/winedmo/unixlib.c b/dlls/winedmo/unixlib.c index 7a3a83e3896..acddf489410 100644 --- a/dlls/winedmo/unixlib.c +++ b/dlls/winedmo/unixlib.c @@ -144,6 +144,7 @@ static NTSTATUS wow64_demuxer_create( void *arg ) { struct { + PTR32 url; PTR32 context; struct winedmo_demuxer demuxer; char mime_type[256]; @@ -151,6 +152,7 @@ static NTSTATUS wow64_demuxer_create( void *arg ) struct demuxer_create_params params; NTSTATUS status;
+ params.url = UintToPtr( params32->url ); params.context = UintToPtr( params32->context ); if ((status = demuxer_create( ¶ms ))) return status; params32->demuxer = params.demuxer; diff --git a/dlls/winedmo/unixlib.h b/dlls/winedmo/unixlib.h index e452ed5be1c..31c8ed69763 100644 --- a/dlls/winedmo/unixlib.h +++ b/dlls/winedmo/unixlib.h @@ -70,6 +70,7 @@ struct demuxer_check_params
struct demuxer_create_params { + const char *url; struct stream_context *context; struct winedmo_demuxer demuxer; char mime_type[256]; diff --git a/dlls/winedmo/winedmo.spec b/dlls/winedmo/winedmo.spec index 0b848f8be16..610fcb69144 100644 --- a/dlls/winedmo/winedmo.spec +++ b/dlls/winedmo/winedmo.spec @@ -1,3 +1,3 @@ @ cdecl winedmo_demuxer_check(str) -@ cdecl winedmo_demuxer_create(ptr ptr ptr ptr) +@ cdecl winedmo_demuxer_create(wstr ptr ptr ptr ptr) @ cdecl winedmo_demuxer_destroy(ptr) diff --git a/include/wine/winedmo.h b/include/wine/winedmo.h index c91b2cc51c2..34f031e8f73 100644 --- a/include/wine/winedmo.h +++ b/include/wine/winedmo.h @@ -35,7 +35,7 @@ struct winedmo_stream struct winedmo_demuxer { UINT64 handle; };
NTSTATUS CDECL winedmo_demuxer_check( const char *mime_type ); -NTSTATUS CDECL winedmo_demuxer_create( struct winedmo_stream *stream, UINT64 *stream_size, +NTSTATUS CDECL winedmo_demuxer_create( const WCHAR *url, struct winedmo_stream *stream, UINT64 *stream_size, WCHAR *mime_type, struct winedmo_demuxer *demuxer ); NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer );