From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfsrcsnk/media_source.c | 4 +++- dlls/winedmo/main.c | 10 +++++++--- 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 | 3 ++- 7 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/dlls/mfsrcsnk/media_source.c b/dlls/mfsrcsnk/media_source.c index 11592be102a..e573e7d322a 100644 --- a/dlls/mfsrcsnk/media_source.c +++ b/dlls/mfsrcsnk/media_source.c @@ -90,6 +90,7 @@ struct media_source struct winedmo_demuxer winedmo_demuxer; struct winedmo_stream winedmo_stream; UINT64 file_size; + WCHAR mime_type[256];
enum { @@ -516,7 +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->winedmo_demuxer))) + if ((status = winedmo_demuxer_create(&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 96a5027fdd8..27cfdea8620 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -17,6 +17,7 @@ */
#include "unixlib.h" +#include "winnls.h"
#include "wine/debug.h"
@@ -125,12 +126,13 @@ NTSTATUS CDECL winedmo_demuxer_check( const char *mime_type ) return status; }
-NTSTATUS CDECL winedmo_demuxer_create( struct winedmo_stream *stream, UINT64 *stream_size, struct winedmo_demuxer *demuxer ) +NTSTATUS CDECL winedmo_demuxer_create( struct winedmo_stream *stream, UINT64 *stream_size, + WCHAR *mime_type, struct winedmo_demuxer *demuxer ) { struct demuxer_create_params params = {0}; NTSTATUS status;
- TRACE( "stream %p, stream_size %I64x, demuxer %p\n", stream, *stream_size, demuxer ); + TRACE( "stream %p, stream_size %#I64x, mime_type %p, demuxer %p\n", 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 ))) @@ -140,8 +142,10 @@ NTSTATUS CDECL winedmo_demuxer_create( struct winedmo_stream *stream, UINT64 *st return status; }
+ MultiByteToWideChar( CP_ACP, 0, params.mime_type, -1, mime_type, 256 ); *demuxer = params.demuxer; - TRACE( "created demuxer %#I64x, stream %p, stream_size %#I64x\n", demuxer->handle, stream, *stream_size ); + TRACE( "created demuxer %#I64x, stream %p, stream_size %#I64x, mime_type %s\n", demuxer->handle, + 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 e4e8c949d0d..c67170e0c41 100644 --- a/dlls/winedmo/unix_demuxer.c +++ b/dlls/winedmo/unix_demuxer.c @@ -83,6 +83,18 @@ NTSTATUS demuxer_create( void *arg ) }
params->demuxer.handle = (UINT_PTR)ctx; + if (strstr( ctx->iformat->name, "mp4" )) strcpy( params->mime_type, "video/mp4" ); + else if (strstr( ctx->iformat->name, "avi" )) strcpy( params->mime_type, "video/avi" ); + 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 + { + FIXME( "Unknown MIME type for format %s\n", debugstr_a(ctx->iformat->name) ); + strcpy( params->mime_type, "video/x-application" ); + } + return STATUS_SUCCESS; }
diff --git a/dlls/winedmo/unixlib.c b/dlls/winedmo/unixlib.c index 1d411f39125..7a3a83e3896 100644 --- a/dlls/winedmo/unixlib.c +++ b/dlls/winedmo/unixlib.c @@ -146,6 +146,7 @@ static NTSTATUS wow64_demuxer_create( void *arg ) { PTR32 context; struct winedmo_demuxer demuxer; + char mime_type[256]; } *params32 = arg; struct demuxer_create_params params; NTSTATUS status; @@ -153,6 +154,7 @@ static NTSTATUS wow64_demuxer_create( void *arg ) params.context = UintToPtr( params32->context ); if ((status = demuxer_create( ¶ms ))) return status; params32->demuxer = params.demuxer; + memcpy( params32->mime_type, params.mime_type, 256 );
return status; } diff --git a/dlls/winedmo/unixlib.h b/dlls/winedmo/unixlib.h index 8d39dfd5760..e452ed5be1c 100644 --- a/dlls/winedmo/unixlib.h +++ b/dlls/winedmo/unixlib.h @@ -72,6 +72,7 @@ struct demuxer_create_params { struct stream_context *context; struct winedmo_demuxer demuxer; + char mime_type[256]; };
struct demuxer_destroy_params diff --git a/dlls/winedmo/winedmo.spec b/dlls/winedmo/winedmo.spec index ef718289f9d..0b848f8be16 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) +@ cdecl winedmo_demuxer_create(ptr ptr ptr ptr) @ cdecl winedmo_demuxer_destroy(ptr) diff --git a/include/wine/winedmo.h b/include/wine/winedmo.h index 07192242a2a..c91b2cc51c2 100644 --- a/include/wine/winedmo.h +++ b/include/wine/winedmo.h @@ -35,7 +35,8 @@ 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, struct winedmo_demuxer *demuxer ); +NTSTATUS CDECL winedmo_demuxer_create( struct winedmo_stream *stream, UINT64 *stream_size, + WCHAR *mime_type, struct winedmo_demuxer *demuxer ); NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer );
#endif /* __WINE_WINEDMO_H */