From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winedmo/main.c | 19 +++++++++++++++++++ dlls/winedmo/unix_demuxer.c | 16 ++++++++++++++++ dlls/winedmo/unix_private.h | 1 + dlls/winedmo/unixlib.c | 2 ++ dlls/winedmo/unixlib.h | 8 ++++++++ dlls/winedmo/winedmo.spec | 1 + include/wine/winedmo.h | 1 + 7 files changed, 48 insertions(+)
diff --git a/dlls/winedmo/main.c b/dlls/winedmo/main.c index 0751337659a..2f16120796d 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -180,6 +180,25 @@ NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ) return status; }
+NTSTATUS CDECL winedmo_demuxer_stream_name( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ) +{ + struct demuxer_stream_name_params params = {.demuxer = demuxer, .stream = stream}; + NTSTATUS status; + + TRACE( "demuxer %#I64x, stream %u\n", demuxer.handle, stream ); + + if ((status = UNIX_CALL( demuxer_stream_name, ¶ms ))) + { + WARN( "Failed to get stream name, status %#lx\n", status ); + return status; + } + + len = MultiByteToWideChar( CP_UTF8, 0, params.buffer, -1, buffer, len ); + buffer[len - 1] = 0; + return STATUS_SUCCESS; +} + + static HRESULT get_media_type( UINT code, void *params, struct media_type *media_type, GUID *major, union winedmo_format **format ) { diff --git a/dlls/winedmo/unix_demuxer.c b/dlls/winedmo/unix_demuxer.c index 632b75480d7..d4064b0fc0f 100644 --- a/dlls/winedmo/unix_demuxer.c +++ b/dlls/winedmo/unix_demuxer.c @@ -159,6 +159,22 @@ NTSTATUS demuxer_destroy( void *arg ) return STATUS_SUCCESS; }
+NTSTATUS demuxer_stream_name( void *arg ) +{ + struct demuxer_stream_name_params *params = arg; + AVFormatContext *ctx = get_demuxer( params->demuxer ); + AVStream *stream = ctx->streams[params->stream]; + AVDictionaryEntry *tag; + + TRACE( "context %p, stream %u\n", ctx, params->stream ); + + if (!(tag = av_dict_get( stream->metadata, "title", NULL, AV_DICT_IGNORE_SUFFIX ))) + return STATUS_NOT_FOUND; + + lstrcpynA( params->buffer, tag->value, ARRAY_SIZE( params->buffer ) ); + return STATUS_SUCCESS; +} + NTSTATUS demuxer_stream_type( void *arg ) { struct demuxer_stream_type_params *params = arg; diff --git a/dlls/winedmo/unix_private.h b/dlls/winedmo/unix_private.h index bb91e06449b..1bb73efeb99 100644 --- a/dlls/winedmo/unix_private.h +++ b/dlls/winedmo/unix_private.h @@ -43,6 +43,7 @@ extern int unix_read_callback( void *opaque, uint8_t *buffer, int size ); extern NTSTATUS demuxer_check( void * ); extern NTSTATUS demuxer_create( void * ); extern NTSTATUS demuxer_destroy( void * ); +extern NTSTATUS demuxer_stream_name( void * ); extern NTSTATUS demuxer_stream_type( void * );
/* unix_media_type.c */ diff --git a/dlls/winedmo/unixlib.c b/dlls/winedmo/unixlib.c index 13178ec5260..57318e864e0 100644 --- a/dlls/winedmo/unixlib.c +++ b/dlls/winedmo/unixlib.c @@ -132,6 +132,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = X( demuxer_check ), X( demuxer_create ), X( demuxer_destroy ), + X( demuxer_stream_name ), X( demuxer_stream_type ), };
@@ -191,6 +192,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = X( demuxer_check ), X64( demuxer_create ), X64( demuxer_destroy ), + X( demuxer_stream_name ), X( demuxer_stream_type ), };
diff --git a/dlls/winedmo/unixlib.h b/dlls/winedmo/unixlib.h index 9e1bdd14ad2..2f1d1016fd2 100644 --- a/dlls/winedmo/unixlib.h +++ b/dlls/winedmo/unixlib.h @@ -98,6 +98,13 @@ struct demuxer_destroy_params struct stream_context *context; };
+struct demuxer_stream_name_params +{ + struct winedmo_demuxer demuxer; + UINT32 stream; + char buffer[256]; +}; + struct demuxer_stream_type_params { struct winedmo_demuxer demuxer; @@ -113,6 +120,7 @@ enum unix_funcs unix_demuxer_check, unix_demuxer_create, unix_demuxer_destroy, + unix_demuxer_stream_name, unix_demuxer_stream_type,
unix_funcs_count, diff --git a/dlls/winedmo/winedmo.spec b/dlls/winedmo/winedmo.spec index dd88fa74e5b..991efb52164 100644 --- a/dlls/winedmo/winedmo.spec +++ b/dlls/winedmo/winedmo.spec @@ -1,4 +1,5 @@ @ cdecl winedmo_demuxer_check(str) @ cdecl winedmo_demuxer_create(wstr ptr int64 ptr ptr ptr ptr) @ cdecl winedmo_demuxer_destroy(ptr) +@ cdecl winedmo_demuxer_stream_name(int64 long ptr long) @ cdecl winedmo_demuxer_stream_type(int64 long ptr ptr) diff --git a/include/wine/winedmo.h b/include/wine/winedmo.h index 7f9fb08bebd..c1aa2c2255c 100644 --- a/include/wine/winedmo.h +++ b/include/wine/winedmo.h @@ -46,6 +46,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, INT64 *duration, UINT *stream_count, WCHAR *mime_type, struct winedmo_demuxer *demuxer ); NTSTATUS CDECL winedmo_demuxer_destroy( struct winedmo_demuxer *demuxer ); +NTSTATUS CDECL winedmo_demuxer_stream_name( struct winedmo_demuxer demuxer, UINT stream, WCHAR *buffer, UINT len ); NTSTATUS CDECL winedmo_demuxer_stream_type( struct winedmo_demuxer demuxer, UINT stream, GUID *major, union winedmo_format **format );