From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfsrcsnk/media_source.c | 3 ++- dlls/winedmo/main.c | 7 ++++--- dlls/winedmo/unix_demuxer.c | 9 +++++++++ dlls/winedmo/unixlib.c | 2 ++ dlls/winedmo/unixlib.h | 1 + dlls/winedmo/winedmo.spec | 2 +- include/wine/winedmo.h | 2 +- 7 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/dlls/mfsrcsnk/media_source.c b/dlls/mfsrcsnk/media_source.c index 79255074498..ba3209637bd 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; + UINT stream_count; WCHAR mime_type[256];
enum @@ -518,7 +519,7 @@ static HRESULT media_source_async_create(struct media_source *source, IMFAsyncRe source->winedmo_stream.p_read = media_source_read_cb;
if ((status = winedmo_demuxer_create(source->url, &source->winedmo_stream, &source->file_size, - source->mime_type, &source->winedmo_demuxer))) + &source->stream_count, 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 87ea214337e..22b6220ad05 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -127,7 +127,7 @@ NTSTATUS CDECL winedmo_demuxer_check( const char *mime_type ) }
NTSTATUS CDECL winedmo_demuxer_create( const WCHAR *url, struct winedmo_stream *stream, UINT64 *stream_size, - WCHAR *mime_type, struct winedmo_demuxer *demuxer ) + UINT *stream_count, WCHAR *mime_type, struct winedmo_demuxer *demuxer ) { struct demuxer_create_params params = {0}; char *tmp = NULL; @@ -154,10 +154,11 @@ NTSTATUS CDECL winedmo_demuxer_create( const WCHAR *url, struct winedmo_stream * return status; }
+ *stream_count = params.stream_count; MultiByteToWideChar( CP_ACP, 0, params.mime_type, -1, mime_type, 256 ); *demuxer = params.demuxer; - 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) ); + TRACE( "created demuxer %#I64x, stream %p, stream_size %#I64x, stream_count %u, mime_type %s\n", demuxer->handle, + stream, *stream_size, params.stream_count, debugstr_a(params.mime_type) ); return STATUS_SUCCESS; }
diff --git a/dlls/winedmo/unix_demuxer.c b/dlls/winedmo/unix_demuxer.c index 4ddd25630e0..8c0dcf09e12 100644 --- a/dlls/winedmo/unix_demuxer.c +++ b/dlls/winedmo/unix_demuxer.c @@ -83,7 +83,16 @@ NTSTATUS demuxer_create( void *arg ) return STATUS_UNSUCCESSFUL; }
+ if (!(ctx->nb_streams && ctx->duration != AV_NOPTS_VALUE) && (ret = avformat_find_stream_info( ctx, NULL )) < 0) + { + ERR( "Failed to find stream info, ret %d (%s).\n", ret, av_err2str(ret) ); + avio_context_free( &ctx->pb ); + avformat_free_context( ctx ); + return STATUS_UNSUCCESSFUL; + } + params->demuxer.handle = (UINT_PTR)ctx; + params->stream_count = ctx->nb_streams; 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" ); diff --git a/dlls/winedmo/unixlib.c b/dlls/winedmo/unixlib.c index acddf489410..3f1a2c1c440 100644 --- a/dlls/winedmo/unixlib.c +++ b/dlls/winedmo/unixlib.c @@ -148,6 +148,7 @@ static NTSTATUS wow64_demuxer_create( void *arg ) PTR32 context; struct winedmo_demuxer demuxer; char mime_type[256]; + UINT32 stream_count; } *params32 = arg; struct demuxer_create_params params; NTSTATUS status; @@ -157,6 +158,7 @@ static NTSTATUS wow64_demuxer_create( void *arg ) if ((status = demuxer_create( ¶ms ))) return status; params32->demuxer = params.demuxer; memcpy( params32->mime_type, params.mime_type, 256 ); + params32->stream_count = params.stream_count;
return status; } diff --git a/dlls/winedmo/unixlib.h b/dlls/winedmo/unixlib.h index 31c8ed69763..ad0dacf7016 100644 --- a/dlls/winedmo/unixlib.h +++ b/dlls/winedmo/unixlib.h @@ -74,6 +74,7 @@ struct demuxer_create_params struct stream_context *context; struct winedmo_demuxer demuxer; char mime_type[256]; + UINT32 stream_count; };
struct demuxer_destroy_params diff --git a/dlls/winedmo/winedmo.spec b/dlls/winedmo/winedmo.spec index 610fcb69144..60dca7e5405 100644 --- a/dlls/winedmo/winedmo.spec +++ b/dlls/winedmo/winedmo.spec @@ -1,3 +1,3 @@ @ cdecl winedmo_demuxer_check(str) -@ cdecl winedmo_demuxer_create(wstr ptr ptr ptr ptr) +@ cdecl winedmo_demuxer_create(wstr ptr ptr ptr ptr ptr) @ cdecl winedmo_demuxer_destroy(ptr) diff --git a/include/wine/winedmo.h b/include/wine/winedmo.h index 34f031e8f73..37cf43a2301 100644 --- a/include/wine/winedmo.h +++ b/include/wine/winedmo.h @@ -36,7 +36,7 @@ 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, - WCHAR *mime_type, struct winedmo_demuxer *demuxer ); + UINT *stream_count, WCHAR *mime_type, struct winedmo_demuxer *demuxer ); NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer );
#endif /* __WINE_WINEDMO_H */